[ORM] Sequelize 사용과제 (Node.js ORM)
DataBase

[ORM] Sequelize 사용과제 (Node.js ORM)

반응형

공식문서는 참으로 답답하다 기승전결 없이 기결만 있는 느낌이랄까.. 그냥 몰라서 그런 느낌이 든 것이 확실한것 같고.

조그마한 개념도 없이 읽을려고하니 읽히는게 없는게 당연할지도 모르겠습니다.

 

App -> route -> controller -> model -> DB -> model -> controller

(기본적인 흐름)

 

Sequelize

공식 문서에 나온 sequelize라는 프로그램의 정의

Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server. It features solid transaction support, relations, eager and lazy loading, read replication and more.

Sequelize는 Postgres, MySQL, MariaDB, SQLite 및 Microsoft SQL Server용 약속 기반 Node.js ORM입니다. 견고한 트랜잭션 지원, 관계, 열망 및 지연 로딩, 읽기 복제 등을 제공합니다.

 

 

1. Getting Started

 

1. Sequelize 설치  Sequelize ORM

제일 처음에는 설치 작업을 위해 공식 문서에 나오는 명령어를 터미널에 입력하면 됩니다.

npm install --save sequelize

package.json 파일에 sequelize의 최신 버전이 다운로드 된 것을 확인할 수 있습니다.

 

 

 

2. Sequelize-cil 설치  Sequelize - Migrations

 

마이그레이션을 할 수 있도록 돕는 툴로, CLI에서 모델을 생성해주거나, 스키마 적용을 할 수 있도록 돕습니다.

마이그레이션은 스키마 변경에 따른 데이터 이주(migration)를 뜻합니다. 이는 데이터를 선택, 준비, 추출 및 변환하여 한 컴퓨터 저장 시스템에서 다른 컴퓨터 저장 시스템으로 영구적으로 전송하는 프로세스를 뜻합니다.

 

npm install --save-dev sequelize-cli

 package.json 파일의 devDependencies 목록에 sequelize-cli가 생성 됩니다.

 

 migration는 자바스크립트 파일인데 두 개의 함수를 밖으로 내보낸다. 하나는 up이고, 다른 하나는 down인데 이 두 함수가 migration을 할 지, 안 할지를 결정짓는다고 보면 됩니다.

 

 

2. Project bootstrapping

 

1) Bootstrapping (초기 단계 설정)

빈 프로젝트를 만들려면 init명령 을 실행해야 합니다.

npx sequelize-cli init

그러면 다음 폴더가 생성됩니다.

  • config, 데이터베이스에 연결하는 방법을 CLI에 알려주는 구성 파일이 포함되어 있습니다.
  • models, 프로젝트의 모든 모델을 포함합니다.
  • migrations, 모든 마이그레이션 파일 포함
  • seeders, 모든 시드 파일을 포함합니다.

 

2) Configuration

CLI와 데이터베이스의 연결을 위해 필요한 파일이다. config 폴더에 있는 config.json 파일을 열면 3개의 데이터베이스가 존재하는데 이는 개발, 테스트, 배포용이라는 의미를 가지고 있다. 우리는 기본적으로 development 즉, 개발용 데이터베이스를 쓰고 있는데 그 이유는 models 폴더의 index.js 파일을 보면 알 수 있다.

const env = process.env.NODE_ENV || 'development';

 

이렇게 확인이 되었으면 config.json에 있는 development 부문만 사용하면 database 명과 password 부분을 맞게 값을 바꿔주면 됩니다.

 

3) Creating the first Model (and Migration)

CLI 구성 파일을 올바르게 구성했으면 첫 번째 마이그레이션을 만들 준비가 된 것입니다. 간단한 명령을 실행하는 것처럼 간단합니다.

우리는 model:generate명령 을 사용할 것 입니다. 이 명령에는 두 가지 옵션이 필요합니다.

  • name뒤에 모델명
  • attributes뒤에 모델 속성 목록

url 라는 모델을 만들어 보겠습니다, 속성은 그에 맞게 설정해 주시면 됩니다.

npx sequelize-cli model:generate --name url --attributes firstName:string,lastName:string,email:string

위 명령어를 터미널에 입력하면 migrations와 models 폴더에도 각 파일이 잘 생성된 것을 확인할 수 있습니다.

migrations와 models있는 파일안의 값중에 테이블의 이름을 잘 확인하고, 그에 맞는 속성값도 확인을 하는 것이 좋습니다.

 

3. Running Migrations

 

데이터베이스에 config.json 파일에 데이터베이스 파일명을, mysql로 데이터베이스를 추가합니다.

(데이터 베이스 따로 만들어주는 명령어는 없나..?)

 

그리고 이 데이터베이스에 아무것도 추가한 것은 없습니다. 

npx sequelize-cli db:migrate

위 명령어를 입력하면 테이블의 값을 설정해주었던것을 기준으로 테이블이 생성 됩니다. 테이블 확인을 해보면 테이블 생성이 되어있는 것을 확인 할 수 있습니다.

 

4. Model

 

Creating the first Model (and Migration) 부분에서 User.js라는 모델 파일을 생성했습니다.

공식 문서에 따르면 모델은 Sequelize에서 아주 중요한 개념이라고 합니다. 모델은 내 데이터베이스에 있는 테이블의 축약 버전이라고 생각하면 됩니다. 모델을 통해 테이블의 이름이나 테이블의 열의 이름 등을 알 수 있습니다. 

 

모델의 파일은 클래스 형식이고 클래스안에 init이라는 메서드에 모델의 attributes가 정의된 객체를 인자로 보냅니다.

(보통 테이블 명은 모델 명의 복수형으로 쓴다.)

 

Extending Model 방법

클래스 형식이고 클래스안에 init이라는 메서드에 모델의 attributes가 정의된 객체를 인자로 보낸다.

 

5. Controller 만들기

 

  1) 분기별로 라우팅 하기

 

app.js

url에 /links가 붙으면 linkRouter로 이동하게 된다.

linkRouter는 routes 폴더안의 links.js에서 export한 것이다. links.js를 살펴보면 다음과 같다.

routes 파일에 link.js

각 메소드와 url 별로 controller 객체에 있는 메소드를 이용하고 있다. controller 객체를 쓰기 위해 controllers 폴더안에 links 폴더를 만들고 그 안에 index.js 파일을 만들었다.

그 다음에 routes 폴더안에 있는 link.js 파일과 index.js 파일을 연결시켜 주었다. 이제 index.js 파일안에서 서버로 오는 각 요청마다 데이터베이스에서 어떻게 처리할지를 정하도록 하였다.

 

app.js -> routes폴더에 links.js파일 -> controllers/links/index.js 순으로 연결

 

  2) controller 객체 완성하기

 

앞에서 연결을 시켜 주었으니 controllers/links/index.js 들어와 export 할 controller 객체를 만들어 주어야 한다.

 

controller에서 async, await가 사용되는 이유는 처음 공식 문서에 나온 sequelize에 대한 정의를 살펴보면 다음과 같다.

"sequelize는 promise 기반의 Node.js ORM 이다."  promise를 이용하여 비동기 적으로 메소드를 처리합니다.

 

컨트롤러를 만들 때 API 문서를 참고하여 작성해야 합니다. (더 보기 API 정리)

더보기
  • POST /links
    • content-type: application/json
    • payload: 단축시키고 싶은 URL을 url 속성에 담습니다.{ "url": "https://www.github.com" }
    • status code: 201 (성공적으로 생성했을 시)
    • response: 방금 생성한 모델의 JSON
      {
        "id": 1,
        "url": "https://www.github.com",
        "title": "The world’s leading software development platform · GitHub",
        "visits": 1,
        "createdAt": "2020-07-25T20:07:15.000Z",
        "updatedAt": "2020-07-25T20:07:15.000Z"
      }​
       
      • POST 요청을 구현할 때, 웹사이트의 제목을 가져오기 위해 modules/utils.js를 이용할 수 있습니다.
        • node.js 에서 HTTP 요청을 하기 위해 request 라는 라이브러리를 사용하였습니다. 비슷한 일을 하는 라이브러리로는 axios, node-fetch 등이 있습니다. node.js 내장 http, https 모듈을 이용해 이를 직접 구현할 수 있습니다.
        • node.js 에서 HTTP 요청을 할 수 있다는 점을 이용해 웹사이트 크롤링(긁어오기)을 구현할 수 있습니다.
  • GET /links
    • content-type: application/json
    • status code: 200 (성공적으로 조회했을 시)
    • response: URL 모델의 목록 (array of objects)
  • GET /links/:id
    • status code: 302 (성공적으로 리디렉션했을 시)
    • 해당 id 값 바탕으로 url 모델을 찾아 리디렉션합니다.
    • /links/:id URL로 접근할 경우 visits 필드에 카운트가 1씩 증가해야 합니다.

 

API에 따른 컨트롤러 코드

작성코드

 

크루분이 작성한 코드는 이것 보다 좀 더 간결하고 깔끔해서, 배워야할 것이 많다고 느꼈다.

(크루분이 말씀하시길 코드의 방식(async와 then) 사수의 방식 눈치껏 따라가라.. 굉장히 현실적인 조언)

그리고 비동기 개념이 약한 부분이 있었는데 이 내용을 하면서 부지런히 다시 복습을 해야겠다고 생각이 들었다.

 

크루분이 쓴 코드

 

6.  Associations을 이용한 Join Table 구현 (Advanced)

 

1) users 테이블 생성

npx sequelize-cli model:generate --name addUserIdcolumn

users테이블을 만들어서 url 테이블과 합치기 위해 url 마이그레이션 만든것 처럼 속성은 제외해주고 만들어 준다.

Running Migrations를 하기 전 migrations폴더와, models 폴더에 있는 각각 파일에 테이블 명과 모델 명을 원하는대로 바꿔줍니다.

 

2) 만들어진 테이블에 필드 추가 & FK 설정하기

여기서 부터 위에서 한것과 다른 부분이 시작되는데. 새로 만든 마이그레이션 파일에서 아래와 같이 코딩을 하고

 

중요한 점은 undo migrations을 했을때를 위해 down에는 꼭 up에 반대되는 메소드를 작성해야 한다. up에서 userId 필드를 추가하고 FK로 지정해주었다면, down에서는 반드시 userId 필드를 삭제하고 FK를 해제하는 작업을 해주어야 한다. 이렇게 하고나서 

 

Running Migrations을 아래코드를 터미널에서 실행합니다.

npx sequelize-cli db:migrate

 

 

3) 1:N 관계 만들기

user:url =1:N 관계를 만들기 위해선

 

models 폴더에 index.js 파일에 

const {url,user}  = sequelize.models;
url.belongsTo(user);
user.hasMany(url);

코드를 넣어주면 성립됩니다. 그리고 sql에 테이블을 검색하면 같이 나오는 것을 확인 할 수 있습니다.

 

 

 

더 많은 기능을 구현하거나 그 외에 더 필요한 함수는 공식문서를 확인 하여 구현하는 능력이 중요한 것 같습니다.

오늘 크루분께서 코드실력은 잘하는 것이라는 개념보다, 어떠한 문제를 맞닥뜨렸을 때 해결능력을 기르는 것이 더 중요하다고 합니다. 아무튼 기본적인 흐름은 여기 까지이고 익숙해질 때 까지 반복해보는 수 밖에 없는 것 같습니다.

반응형

'DataBase' 카테고리의 다른 글

[ORM] TypeOrm setting  (0) 2022.03.25
[DB] NoSQL MongoDB Basic  (0) 2021.07.31
[DB] ORM, MVC에 대해서  (0) 2021.07.29
[DB] SQL 정리  (0) 2021.07.27
[DB] 설계 (Schema & Query Design) / SQL 함수, 실행순서  (0) 2021.07.23