sequelize-typescript-migration 라이브러리 npm 배포
2020년 06월 15일

서론

퇴사 후 nBase 프로젝트 진행 중, 초반에는 ORM을 sequelize로 사용하고 있었습니다. sequelize 라이브러리는 다 만족했으나 공식적으로 타입 및 데코레이터 지원을 하지 않았습니다. 그리하여 비공식 라이브러리인 sequelize-typescript를 사용하였고 조금 찝찝했지만 큰 문제 없이 사용하고 있었습니다.

sequelize-typescript

이슈

개발을 진행함에 따라 스키마 형상 관리를 하는 migration이란 기능을 사용하려고 했습니다. 제가 원하는 migration은 단순히 migration 파일을 작성 후 적용이 아니라, django에서 제공하는 makemigrations 처럼 migration 파일을 generate해주는 기능을 원했습니다. 즉, 코드에 model로 정의된 스키마와 실제 DB에 생성되어 있는 스키마를 비교하여 그 차이를 기반으로 쿼리를 만들어 up, down function을 자동으로 생성시켜 주는 기능입니다. 이 기능이 없다면 개발자가 변경 시 마다 직접 모델과 DB를 비교하여 ALTER TABLE 쿼리 등을 작성해주어야 합니다.

django-admin and manage.py | Django documentation | Django

하지만 문제가 두 가지 있었습니다.

  • js 기반의 sequelize는 일단 공식적으로 migration이 지원됩니다. 하지만 아쉽게도 migration file generator는 없었습니다.
  • 그래도 찾아보니 비공식 라이브러리는 있었습니다. 하지만 현재 버전과는 맞지 않고, typescript 기반에서 동작하지 않습니다.

우선 위에 해당하는 라이브러리인 sequelize-auto-migrations을 살펴보았습니다.

flexxnn/sequelize-auto-migrations

로직을 요약하면 sequelize에 있는 models object array를 파싱하여 tables data를 얻고 이전의 tables data와 비교하여 쿼리를 생성합니다. 그리고 sequelize 기준으로 sync된 마지막 버전의 tables data를 새로운 table에 저장하여 관리하는 방식입니다.

로직 상의 큰 변화는 없고, typescript를 사용하여 생산성 증가, 리팩토링, 함수 리네이밍 및 모듈화 등으로 코드를 좀 더 견고하게 만들었습니다. 가장 큰 차이점은 sequelize 라이브러리 대신 sequelize-typescript 라이브러리를 사용하여 데코레이터 등을 통해 정의한 Column 정보들을 가지고 올 수 있게 되었다는 점이었습니다.

npm 배포

처음에는 프로젝트 내에 프로젝트를 만들어 관리하려 했으나, 그렇게 할 경우 새로운 프로젝트를 들어갔을 때 import 하는 과정에서 이슈가 생길 것으로 보여 npm 에 배포하여 install 하는 방식으로 구상했다. npm publish 과정에 대한 것은 아래 두 글을 많이 참고했습니다.

내 NPM 패키지(모듈) 배포하기

[번역] TypeScript로 NPM 모듈을 만들어 배포하기

그리하여 package.json을 다음과 같이 구성하고 npm 에 가입 및 첫 배포를 완료했습니다!

sequelize-typescript-migration

결론

사실 오픈소스로 배포하기에는 퀄리티가 조악하여 꺼려졌으나, 폐쇄적으로 배포할 공간도 마땅하지 않고, 따지고 보면 저도 기존 라이브러리를 검색하여 도움을 받았으니 이 라이브러리도 누군가에겐 도움이 되지 않을까 생각하여 배포하였습니다. 결과적으로 npm에 소스를 배포한다는 것에 대한 전반적인 과정을 살펴볼 수 있었고, package.json의 각 key의 역할을 한 번 더 자세히 공부해 볼 수 있는 좋은 기회였습니다.