서론

안녕하세요, 영훈입니다. 오랜만에 글을 쓰는거 같네요. 제가 쓴 글이 많은 분들에게 도움이 되길 바라면서 시작 해보겠습니다.

오늘은 Sequelize와 Sequelize CLI의 개념에 대해서 알아보고난 후 Sequelize CLI를 사용하여 간단한 유저 정보 조회 API를 만들어 보도록 하겠습니다.

이론

ORMMapping.png

Sequelize의 개념을 이해하기전 ORM이라는 개념에 대해서 이해해야 됩니다.

ORM이란 객체를 관계형 DB에 매핑해 DB의 기능들을 추상적으로 사용할 수 있게 해준다는 개념입니다.

예를들어, ORM이란 개념이 존재하지 않고 Blog 기능들을 개발해야 된다고 가정을 했을 때 테이블을 생성해주고 조회하고 업데이트하고 삭제하는 쿼리를 작성해줘야합니다.

또한 외래키 설정을 해주는 쿼리도 만들어야 하고요. 그리고 데이터베이스를 바꿔야 하는 상황이 생긴다면 해당 데이터베이스 환경에 맞춰 쿼리를 다시 짜야 하는 상황이 생길 것 입니다.

하지만 ORM은 DB의 기능들을 추상화했기 때문에 어떤 관계형 데이터베이스든 문제 없이 기능을 사용할 수 있게 해줍니다.

ORM을 사용하면 좋은점

  • ORM을 통해 데이터베이스 쿼리를 추상화해 본래 기능을 구현하는 로직에만 집중 할 수 있다.
  • 특정 데이터베이스에 대한 종속성이 사라져 데이터베이스가 바뀌는 상황에도 유연하게 대처할 수 있다.
  • 데이터베이스 마이그레이션을 쉽게 할 수 있다.

ORM을 사용하면 안좋은점

  • Raw Query를 사용하는것 보다 성능이 떨어진다.

1_XcE0wR1ZmWLFbdF2dE5WuA (1).png

그렇다면 Sequelize 란?

Sequelize는 Node.js에서 사용할 수 있는 ORM입니다. 간단하죠? 참고로 Node.js에서 ORM은 여러가지들이 존재합니다.

그중 대표적이고 가장 인기있는 ORM이 Sequelize 입니다.

Sequelize CLI는 무엇일까?

Sequelize CLI는 The Sequelize command line interface의 줄임말로써 명령어를 사용해 데이터베이스 작업을 할 수 있는 툴입니다. 기능들로는 마이그레이션, 시드, 모델이 있습니다. 그런데 마이그레이션, 시드, 모델이 무엇인지 모르는 분들이 계실 수 있습니다. 아직 몰라도 됩니다. 실습 하면서 자연스럽게 알게될거에요.

실습

이번 실습에서는 Sequelize CLI를 통해서 User 테이블을 만들고 User 테이블 마이그레이션과 데이터를 넣는 작업을 진행 하려고 합니다. 또한 Sequelize CLI로 넣은 데이터를 조회 할 수 있는 API를 만들어보도록 하겠습니다.

실습하기전 준비사항

실습을 하기 위해서 node.js와 mysql이 설치되어 있어야 합니다.
또한 패키지 매니저로는 yarn 혹은 npm이 설치 되어있어야 하며 글로벌로 nodemon이 설치 되어있어야 합니다. 그리고 실습을 진행하기 위해서는 https://github.com/ihello72/node-koa-server.git 에서 소스코드를 클론 해야합니다.

1. 소스 코드 클론 및 확인

스크린샷 2018-12-04 오후 5.56.18.png

소스 코드를 클론 하신 후 yarn install과 yarn dev를 해주세요

스크린샷 2018-12-04 오후 5.58.28.png

그 후 웹 브라우저로 localhost:3000번을 접속한 후 해당 화면처럼 보이면 성공입니다.

2. Sequelize 설치 및 Sequelize CLI 설치

스크린샷 2018-12-04 오후 6.06.39.png
yarn add sequelize sequelize-cli mysql2로 sequelize, sequelize-cli, mysql2 라이브러리를 설치해 주세요

스크린샷 2018-12-04 오후 6.12.53.png

설치한 후 ./node_modules/.bin/sequelize를 실행해 주세요

스크린샷 2018-12-04 오후 6.14.30.png

실행한 후 다음과 같은 화면이 보인다면 sequelize-cli가 성공적으로 설치된 것 입니다.

왜 ./node_modules/.bin/sequelize로 실행 해야할까?

./node_modules/.bin/sequelize를 실행해는 이유는 sequelize-cli가 해당 프로젝트 로컬에 설치되어있기 때문에 ./node_modules/.bin/sequelize로 sequelize-cli를 사용해야 합니다. 로컬이 아니라 글로벌로 설치한다면 sequelize로 실행 할 수 있습니다.

3. Sequelize CLI 초기화

이제 sequelize CLI를 사용해 테이블 생성 및 마이그레이션, 데이터 추가를 해보겠습니다.

스크린샷 2018-12-04 오후 6.22.33.png

./node_modules/.bin/sequelize init 명령어를 입력하세요.

스크린샷 2018-12-04 오후 6.25.38.png

./node_modules/.bin/sequelize init 명령어를 통해 config, migrations, models, seeders 디렉터리가 만들어진 것을 볼 수 있습니다.

4. Sequelize CLI 설정

Sequelize CLI가 어떤 데이터베이스에 접근할지 설정 해 줘야합니다.

스크린샷 2018-12-04 오후 9.36.39.png

/config/config.json 파일로 이동하면 위와 같은 내용이 보입니다. 아래와 같이 자신에 환경에 맞게 파일을 수정해 주세요.

스크린샷 2018-12-04 오후 9.38.34.png

5. Sequelize CLI 모델 정의 및 마이그레이션

모델을 만들기 위해서는 마이그레이션 작업을 해야되는데요 마이그레이션이란 코드에 적혀져있는 데이터베이스 테이블에 대해서 실제 데이터베이스에 테이블을 생성하는 개념이라고 생각하시면 됩니다.

스크린샷 2018-12-04 오후 9.44.21.png

모델을 만들기 위해 터미널에 node_modules/.bin/sequelize model:generate --name User --attributes userId:string,name:string,engName:string을 입력하세요. 성공 메시지가 보이나요?

스크린샷 2018-12-04 오후 9.47.10.png

성공하면, migrations과 models 디렉터리에 파일이 생성된것을 볼 수 있습니다.

migrations 디렉터리에 있는 create-user.js 파일을 살펴보겠습니다.
스크린샷 2018-12-04 오후 9.50.15.png

up과 down으로 구분되어 각각 createTable과 dropTable을 해주는 코드를 볼 수 있습니다.

간단하게 정리하면 up에 작성된 코드는 마이그레이션을 할 때 실행되는 코드이고 down에 작성된 코드는 마이그레이션을 취소할 때 실행되는 코드입니다.

이제 마이그레이션 작업을 해보겠습니다.

스크린샷 2018-12-04 오후 9.57.36.png

터미널에 ./node_modules/.bin/sequelize db:migrate 명령어를 작성해 실행하세요.

스크린샷 2018-12-04 오후 9.59.29.png

스크린샷 2018-12-04 오후 9.59.35.png

성공한다면 아무것도 없었던 sequelize_cli_use 데이터베이스에 Users라는 테이블이 생길것입니다.

마이그레이션을 실행했으니 마이그레이션 취소도 해볼까요?

스크린샷 2018-12-04 오후 10.02.12.png

터미널에 ./node_modules/.bin/sequelize db:migrate:undo 명렁어를 실행하세요. 그 후 데이터베이스에서 삭제되었는지 확인해 보세요.

확인 한 후 삭제되었다면 다시 마이그레이션을 해주세요.

6. Sequelize CLI Seed를 사용해 데이터 추가하기

이제 Sequlieze CLI에 있는 Seed 기능을 사용해 User 테이블에 데이터를 추가해 보도록 하겠습니다. Sequelize CLI에 Seed라는 기능은 생성된 테이블에 데이터를 추가할 수 있게 해주는 기능이라고 생각하시면 됩니다.

스크린샷 2018-12-04 오후 10.09.47.png

./node_modules/.bin/sequelize seed:generate --name userData 명령어를 실행해 주세요.

스크린샷 2018-12-04 오후 10.10.44.png

seeders 디렉터리에 userData 파일이 생긴것을 볼 수 있습니다.

스크린샷 2018-12-04 오후 10.12.59.png

파일을 확인해보면 마이그레이션 파일과 같은 포맷으로 up과 down으로 구분이 되어있는것을 확인 할 수 있습니다. up과 down도 마이그레이션 파일에서 설명한 개념과 동일합니다. 시드를 할때는 up에 있는 코드가 실행되고 시드를 취소할때는 down에 있는 코드가 실행이 됩니다.

스크린샷 2018-12-04 오후 10.19.34.png

위와 같이 코드를 입력해 줍니다.
bulkInesrt에 첫 번째 인자로 들어가는 것은 실제 테이블에 저장되어 있는 테이블 이름입니다.

두 번째 인자로는 테이블에 넣어줄 데이터를 정의하는 부분이며 세번째 인자는 실제 저장되어 있는 테이블에 컬럼을 매핑해주는 역할을 합니다.

bulkDelete의 첫 번째 인자도 마찬가지로 실제 테이블에 저장되어 있는 테이블 이름이고 두 번째 인자로는 삭제할 레코드에 조건입니다.

이제 시드를 실행하여 테이블에 데이터를 넣어보겠습니다.

터미널에 ./node_modules/.bin/sequelize db:seed:all 명령어를 입력해서 실행하세요.

스크린샷 2018-12-04 오후 11.07.24.png

스크린샷 2018-12-04 오후 11.09.24.png

테이블에 데이터가 잘 들어간것을 확인 할 수 있습니다.

./node_modules/.bin/sequelize db:seed:undo:all 명령어를 입력하면 현재 추가된 데이터들을 삭제할 수 있습니다.

7. 유저 정보 조회 API 만들기

Sequelize로 입력한 데이터들을 조회하는 API를 만들어 보도록 하겠습니다.

스크린샷 2018-12-05 오전 8.20.42.png

/src/controller/index.js로 이동하시면 위와 같은 내용을 볼 수 있습니다.

여기서 sequelize를 사용해 데이터베이스에서 데이터를 가져오는 작업을 하겠습니다.

다음과 같은 코드를 입력해 주세요

스크린샷 2018-12-05 오전 8.30.11.png

해당 파일은 models라는 디렉터리에서 데이터베이스 테이블 정보들을 다 가지고 옵니다. models라는 디렉터리는 데이터베이스 테이블들에 대한 정보들을 가지고 있으며 조회, 생성, 수정, 삭제를 할 수 있게 해줍니다.

API가 잘되는지 확인해 볼까요?

웹 브라우저로 http://localhost:3000/users 에 접속해 보세요.

스크린샷 2018-12-05 오전 8.38.36.png

데이터가 보이나요? 참고로 저는 json formatter라는 크롬 확장도구를 사용하고 있기때문에 json 데이터가 정돈되서 보여집니다.

그 후 http://localhost:3000/users/:userId 로 접속해 보세요. 저 같은 경우는 id가 7번부터 시작하기 때문에 http://localhost:3000/users/7 로 접근하겠습니다.

스크린샷 2018-12-05 오전 8.42.56.png

데이터가 잘 보이는것을 확인 할 수 있습니다.

완성된 디렉터리를 볼까요?

스크린샷 2018-12-05 오전 8.46.21.png

무언가.. 디렉터리가 정리 안된 느낌을 받지 않나요? src 밑에 database라는 디렉터리를 만들어 migrations, models, seeders 디렉터리를 옮겨 보도록 하겠습니다.

8. Sequelize RC를 사용해 디렉터리 정리하기

.sequelizrc 파일로 sequelize cli가 만들어준 디렉터리 위치를 커스텀 할 수 있습니다.

/src 디렉터리에 database 디렉터리를 만들어 주세요.
스크린샷 2018-12-05 오전 8.52.06.png

그리고 현재 프로젝트 최상위에 .sequelizerc 파일을 만들어 주세요.
스크린샷 2018-12-05 오전 8.53.09.png

이제 .sequelizerc 파일에 다음과 같이 입력해 주세요.
스크린샷 2018-12-05 오전 8.55.38.png

그 후 models, seeders, migrations 디렉터리를 /src/database 디렉터리로 옮겨주세요.
스크린샷 2018-12-05 오전 8.58.15.png

디렉터리를 이동함으로써 해당 디렉터리를 참조하고 있던 파일들을 수정해 줘야 합니다.

/src/database/models/index.js 파일에서 config.json 파일 경로를 다음과 같이 수정해 주세요.

스크린샷 2018-12-05 오전 9.01.26.png

그 후 /src/controller/index.js 파일에서 models 경로를 다음과 같이 수정해 주세요.

스크린샷 2018-12-05 오전 9.03.51.png

그런 다음 웹 브라우저로 http://localhost:3000/users 로 접근하셔서 데이터가 잘 나오는지 확인하세요.

9. Sequelize CLI로 테이블 컬럼 추가하기

이제 거의 다 왔습니다. 마지막으로 Sequelize CLI로 컬럼을 추가해 보도록 하겠습니다.

다음과 같이 ./node_modules/.bin/sequelize migration:generate --name add-column-user을 터미널에 입력해 주세요

스크린샷 2018-12-06 오전 9.13.53.png

그 후 /src/database/migrations 디렉터리로 이동해 [타임스태프]-add-column-user 파일을 다음과 같이 수정해 주세요.

스크린샷 2018-12-05 오후 10.11.24.png

그 후 ./node_modules/.bin/sequelize db:migrate 명령어를 입력해 주세요.

스크린샷 2018-12-05 오후 10.09.24.png

User 테이블에 phone 컬럼이 추가된 것을 확인할 수 있습니다.

스크린샷 2018-12-05 오후 10.12.15.png

그리고 자신이 마이그레이션한 로그를 보고싶다면 ./node_modules/.bin/sequelize db:migrate:status로 마이그레이션 로그를 볼 수 있습니다.

스크린샷 2018-12-05 오후 10.15.02.png

정리

해당 튜토리얼을 통해서 Sequelize CLI에 기능들을 대부분 사용해 보았습니다. 여러분들이 이해한 개념들을 바탕으로 여러분들의 프로젝트 혹은 회사에서 Sequelize를 사용하고 있다면 적용해보시는것도 추천드립니다.

이 글에 틀린 부분 혹은 글에서 고쳐야할점에 대해서 지적해 주신다면 감사히 배우겠습니다!