아하 REST API 서버 개발 (5)

finallee
aha.official
Published in
8 min readJan 23, 2019

식사들은 맛있게 하셨습니까? 저번 강의에 이어 이번 강의는 Express 를 이용하여 DB 를 연결하고 ORM 을 사용해 Object 로 다루는 기술을 설명하겠습니다.

DB 스키마 작성

일단 처음에는 정말 간단하게 사용자를 저장할 수 있는 users 테이블을 생성해보도록 하겠습니다

DB 에 원하는 이름의 테이블과 컬럼들을 생성하기 위해서는 mysql2sequelize 패키지가 필요합니다.

DB 서버등의 설치에 대해서는 다루지 않을 예정입니다.

Mysql 설치

사실 저는 요즘 대세인 Mongo 나 NoSQL 계열의 디비를 잘 모릅니다…(Mysql 만 8년째…) 실제로 그런 디비들이 필요한 프로젝트를 진행해보지 않았습니다 ㅠ

그래서 이 강좌에서는 일단 Mysql 로 연동하여 사용하도록 하겠습니다. 하지만 추후에 제가 Mongo 등을 사용하여 프로젝트를 진행한다면 그때 노하우를 정리하여 다시 올릴 수 있도록 하겠습니다.

Nodejs 에서 mysql 을 사용하기 위해서는 일단 mysql2 패키지를 설치하여야 합니다.

npm install mysql2

mysql 도 아니고 mysql2 패키지인지 궁금하신 분들을 위해 짧게 설명하자면 원래 mysqlnode-mysql-native 프로젝트로 발족하였으나 여러 개편들이 생겨서 중간에 node-mysql2 프로젝트로 변경되었다고 공식 홈페이지에서 설명하고 있습니다.

따라서 mysql 패키지는 현재 deprecated 되었고 사용하시려면 공식 지원중인 mysql2 패키지를 사용하셔야 합니다.

사실 이 패키지를 설치하시는 것만으로 Mysql 연동은 끝이 났다고 봐야합니다.

앞으로 가야할 길이 멀기에 죄송하지만 mysql2 패키지의 사용 방법에 대해서는 다루지 않기로 하며, 만약 사용 방법등이 궁금하신 분들은 하기의 링크로 들어가셔서 공식 매뉴얼을 참고하시면 되겠습니다.

Sequelize 설치

Nodejs 로 넘어오면서 사실 제일 충격을 많이 받았던 부분이 ORM 관련 라이브러리였습니다.

저는 말씀드렸다시피 PHP 로 꽤나 오랫동안 개발해왔습니다. 최근 붐을 일으키고 있는 Laravel 을 3버전부터 사용해왔던 저로서는 ORM 에 대한 시선은

당연히 모든 동작을 알아서 잘 자동으로 멋지게 해주는 라이브러리

였습니다.

하지만 Nodejs 진영에서 개발하는 대부분의 라이브러리는 굉장히 컴팩트하고 정말 필요한 기능들만 들어있습니다.

특히 Laravel 에서 사용하는 Eloquent ORM 을 사용하던 저로서는 사실 Sequelize 는 “와, 이것도 안돼?” 정도의 굉장히 컴팩트한 라이브러리였습니다.

특히 n:m 관계 모델이라던지, pk 컬럼이 id 로 고정되어있다던지 id 를 삭제하면 쿼리가 실패한다던지 하는 소소한 버그들도 많았던 라이브러리였지만 그만큼 속도가 빠르고 700 명이 넘는 컨트리뷰터가 활동하는 라이브러리이기에프로덕션에서 사용하기로 마음먹었습니다.

하지만 Nodejs 에는 다양한 ORM 및 query builder 들이 존재하기 때문에 Sequelize 가 무겁다고 생각하시는 분들은 다른 라이브러리들을 사용하셔도 무방합니다.

자 그럼, 최신 버전의 sequelize를 설치합시다.

npm install -g sequelize-clinpm install sequelize

sequelize-cli 패키지는 cli 상에서 sequelize 명령어를 사용할 수 있게 해주는 등 여러가지 편의기능을 제공하기 때문에 sequelize 를 사용하시는 분들이라면 필수로 설치하셔야 하는 패키지입니다.

Sequelize 설정

저는 항상 한 프로젝트에 DB 를 각 환경 별로 만드는걸 선호합니다. test 데이터가 dev 데이터와 섞이는 것이 싫기도하고, production 환경에서 test 를 할 경우 같은 DB 를 바라보고 있다면 실제 데이터가 오염될 수도 있기 때문에 철저히 환경별로 분리를 하는 편입니다.

이렇게 sequelize 를 환경 별로 다른 DB 를 사용할 수 있게 유동적으로 설정 하기 위해서는 .sequelizerc 파일을 src 폴더 하위에 생성하셔야 합니다.

그 후에는 일단 src/configs/sequelize.js 파일을 생성합니다.

그리고 .env 파일을 아래와 같이 작성해 주도록 합시다.

DB_USER, DB_PW, DB_HOST 등의 정보는 직접 본인에 맞게 수정하셔서 사용하시기 바랍니다.

마지막으로 src/models/index.js 를 생성합시다

자 이렇게 해서 sequelize 를 사용할 만반의 준비는 다 끝났습니다. 이제 실제로 동작하는지 확인을 해볼 차례입니다.

Sequelize 마이그레이션

DB 스키마를 실제로 코드 베이스로 구현하기 위해서 sequelize 에는 migration 이라고 하는 기능이 있는데요. 이를 사용하여 DB 안에 테이블들을 생성해 주도록 하겠습니다.

sequelize migration:generate --name create-users

위 명령어를 실행하게 되면 src/migrations/20190123072619-create-users.js 와 같은 파일이 생기는데요 이 파일을 다음과 같이 수정해 줍니다.

이제 실제 DB 서버에 restapi_dev 데이터베이스를 생성하신 한 후 다음의 명령어를 실행시켜봅시다.

sequelize db:migrate

뭔가가 실행이 되었습니다. 그럼 실제로 DB 안에 테이블이 생성되었는지 확인해볼까요?

users 테이블이 성공적으로 잘 만들어졌군요. 놀랍습니다.

하지만 현재 users 테이블 내에 데이터가 없는 상태이니 데이터를 한번 만들어 봅시다.

Sequelize 시딩

sequelize 에는 초기 데이터값을 코드로 간편하게 미리 생성할 수 있는 seed 기능도 있습니다.

이 기능을 사용해서 테스트 사용자 3명을 만들어보도록 합시다.

sequelize seed:generate --name seed-users

마이그레이션과 마찬가지로 해당 명령어를 수행하고나면 src/seeders/20190123082553-seed-users.js 과 같은 형식의 파일이 생성됩니다.

그러면 해당 파일을 아래와 같이 채워봅시다.

여기서 잠깐 momentjs 를 사용하기 위해서는 moment 패키지를 설치하셔야 합니다.

npm install moment

자 시드 파일까지 생성해주었으니 어서 빨리 당장 시딩을 진행해보죠.

sequelize db:seed:all

좋습니다. 아무런 문제없이 잘 동작하는군요.

그러면 시드 파일에서 의도한대로 test@test.com ~ test2@test.com 의 사용자가 제대로 생성되었는지 확인해보도록 합시다.

요오시~

완벽하군요!

GET: /v1/users 호출해 보기

자 이제 오늘 강의의 마지막입니다.

sequelize 를 통해서 DB 테이블도 만들고 3명이나 되는 사용자들도 생성해주었으니 이분들을 조회할 수 있는 기능을 만들어 봐야겠죠?

src/models/user.model.js 파일을 하나 만들어서 다음과 같이 작성해주죠.

이 모델 파일은 진작 작성해두었던 src/models/index.js 를 통해 자동적으로 불려지게 되며, 현재 users 테이블과 완벽한 sync 를 맞추고 있어야 합니다.

이제, 마지막으로 기존 src/controllers/user.controller.js 의 내용을 다음과 같이 변경해줍니다.

이제 정말 마지막으로 서버를 실행시킨 후 /v1/users 로 요청을 날려봅시다!

오! 대단해 성공했어!

이제 퇴근할 수 있어!!!

자 오늘은 이렇게 서버에서 간단하게 DB 를 연결해서 응답 해주는 방법까지 알아보았습니다.

이제 슬슬 본론으로 들어가는 느낌입니다. 아마 다음 강좌부터는 난이도가 많이 올라갈 수도 있을 것 같습니다.

다음 강좌에는 sequelize 모델을 더 쉽게 관리하는 방법 및 캐싱 정책에 대해서 이야기 해보도록 해요.

바이바이~

--

--