Sequelize-cli 삽질기(column 추가하기)

JongHyun PARK
6 min readJul 10, 2020

--

이번에 채팅기능을 가진 solo project를 진행하다보니 직접 back-end도 구현하게 되었다.

배웠던 기억을 더듬어가며 어찌어찌 sequelize-cli를 이용해 migrate하여 모델링을 구축하는 데는 성공하였다.

하지만 프로젝트를 진행하다보니 기존 테이블에 추가로 column을 넣어야 하는 상황이 발생하였다.

그 과정에서 겪은 삽질기를 기록하고자 한다.

먼저 sequelize-cli를 이용해 modeling을 완성하였다면 대략적으로 아래처럼 프로젝트 구조가 이루어져 있을 것이다.

user 테이블과 chattingRoom 테이블 2개가 아래처럼 만들어져 있다고 가정하자.

.
├── config
│ └── config.json
├── models
│ └── index.js
│ └── user.js
│ └── chattingRoom.js

├── migrations
│ └── 20200610050742-create-users.js
│ └── 20200610050757-create-chatting-room.js

자 이제 user 테이블에 img column,
그리고 chattingRoom테이블에 userId2 column을 추가해 보도록 하자.

먼저 아래의 명령어를 통해 migrations 파일을 만들어주자

./node_modules/.bin/sequelize migration:generate --name add-column

이제 migrations 폴더에 이름이 add-column인 파일이 생성되었을 것이다.

.
├── config
│ └── config.json
├── models
│ └── index.js
│ └── user.js
│ └── chattingRoom.js

├── migrations
│ └── 20200610050742-create-users.js
│ └── 20200610050757-create-chatting-room.js
│ └── 20200626105521-add-column.js 👈👈(짜잔)

자 이제 해당 파일을 이용해 column을 추가해 준 후 migrate를 실행하면 된다.

해당 파일을 아래처럼 바꿔주자.

20200626105521-add-column.js

(참고로 sequelize-cli로 만들면 테이블은 복수형이된다 — chattingRooms)

자 chattingRoom에 userId를 추가한 부분을 살펴보자.

userId2foreign key로써 user테이블의 id 값을 참조해 사용하고 있다.

따라서 12번째 줄의 reference를 통해 관계 설정을 해주어야 한다.

onUpdate와 onDelete의 cascade는 참조하고 있는 키 primary key,
즉, user테이블의 id값이 update가 되거나 지워졌을 때 같이 단계적으로 영향을 받는 것이라고 한다.
만약 user테이블의 id값이 변경되거나 지워진다면 해당 값을 참조하고 있는 chattingRoom테이블의 userId2의 값도 변경되거나 함께 지워질것이다.

참고: https://dba.stackexchange.com/questions/74627/difference-between-on-delete-cascade-on-update-cascade-in-mysql

User 테이블에 img를 추가한 부분은 특별한 것이 없다.

원하는 column을 추가해 주고 데이터 타입 지정, 그리고 default 값을 원하는 값으로 지정해 놓았다.

그리고 up과 down에 대해 알아보자.

이미 그전에 modeling을 구축했었다면 아는 내용이겠지만

sequelize db:migrate를 실행하면 up의 내용을 실행하고
sequelize db:migrate:undo를 실행하면 down의 내용을 실행하게 된다.

즉 up을 실행하면 column을 추가할 것이고, down을 실행하면 추가한 column을 삭제할 것이다.

자 이제 마지막으로 아래의 명령어를 이용해 column을 추가해 보자.

./node_modules/.bin/sequelize db:migrate
or
npx sequelize db:migrate

table plus로 확인하니 아래처럼 column이 잘 추가되었음을 확인할 수 있다.

User 테이블(img column 추가)
chattingRoom 테이블(userId2 column 추가)

자 이렇게 성공적으로 column을 추가하고 기뻐하며 프로젝트를 진행하고 있었지만 끝이 아니었다…

마지막 한 단계가 남아있다.

이렇게만 끝낸다면 추후 sequelize를 이용하여 데이터를 읽어올 때 추가한 column을 인식하지 못하게 된다…
(table plus에도 있고, mysql에 직접 들어가서 확인해도 column이 존재하는데 대체 왜…? 하면서 몇 시간 삽질을…)

맨 위의 프로젝트 구조에서 migrations 폴더와 models 폴더를 기억하는가?

migrations 폴더 파일과 models 폴더 파일 내용을 일치시켜줘야한다!

즉 models 폴더 내의 user.js, chattingRoom.js 파일에도 column을 추가시켜 주어야 데이터를 읽어올 수 있다.

(stack overflow에서 어떤 외국인이 나와 같은 상황에 직면해 질문을 올리고 스스로 문제점을 발견하여 what a stupid of me!라고 외치며 해결과정을 적어 놓았는데 나도 속으로 따라 외쳤다 ㅠ)

아무튼 대략적으로 아래와 같이 models 폴더 내부의 파일도 내용을 맞춰주면 데이터를 잘 읽어오게 된다.

팀 프로젝트를 할 때는 front-end 부분을 담당해서 팀원 분들이 서버쪽은 뚝딱뚝딱 만들어올때는 이런 고충을 몰랐었다…

이번 솔로 프로젝트를 하면서 좀 더 여러가지를 느끼게 된다.

하나, 애초에 기획을 잘 해서 add-column 할 일이 없도록 잘 준비할 것!

둘, back과 front의 프로세스 과정.

혼자 하다보니 엉망 진창 마구잡이로 하게 되지만 좀 더 꼼꼼히 공부하고 기록해 놓아야 겠다.

--

--