Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server.
Sequelize 홈페이지의 메인 화면에서는 Sequelize 를 다음과 같이 설명합니다. 여러 관계형 데이터베이스(MySQL 을 포함해서)를 위한 promise 객체를 바탕으로 하는 Node.js ORM 이라는 것이죠.
그동안은 공식 문서를 접할 때마다 주로 원하는 부분을 찾아서 읽는 경우가 많았습니다만, sequelize 의 경우에는 공식 문서가 굉장히 길고 상세하게 정리되어있는데다가 앞에서부터 자세히 읽지 않으면 놓치게 되는 것들이 많이 있었습니다. 그래서 오늘은 공식문서를 읽어나가는 와중에 놓치기 쉬웠던 부분들을 정리해볼까 합니다.
프로그래밍을 하다보면 "컨벤션" 이라는 말을 접하게 됩니다. 프로그래밍도 협업의 영역이다 보니 꼭 지켜야하는 문법 외에도 모두가 암묵적으로 공유하는 어떤 약속된 코딩 스타일 같은 것을 가리켜 "컨벤션"이라고 하더라구요.
Sequelize 에서도 용어에 관한 컨벤션이 있습니다. 대문자 Sequelize
는 라이브러리 그 자체를 가리키고, 소문자 sequelize
는 Sequelize 의 인스턴스라는 것입니다. 공식문서 전반에서 이와 같이 사용할 뿐 아니라 sequelize 를 사용하는 모든 개발자들을 위한 컨벤션이니 알아두면 이해에 많은 도움이 될 것 같습니다.
sequelize 가 제공하는 대부분의 메소드들은 promise 를 기반으로 하기 때문에 async/await
이나 then
, catch
, finally
와 함께 사용이 가능합니다.
대체 왜 sequelize 는 모델과 마이그레이션으로 나뉘는 걸까? 둘은 같아보이는데 무슨 차이가 있는거지? sequelize 를 공부하는 내내 들었던 의문이었는데요. 공식문서를 읽어가는 지금도 사실 공식문서 안에서는 아직 이렇다할 답변을 얻지는 못했습니다.
대신 구글링을 통해서 실마리를 조금 잡을 수 있었는데요. 아래의 내용이 그 부분입니다.
Models are used every time you attempt send data (table rows) through your app and into your database tables. Migrations are used to set up those tables’ columns or to bulk add rows. So while a model and a migration for the same database table may seem repetitive, remember that the model controls what data can enter the database, and migrations actually themselves make changes to the database.
출처 https://www.duringthedrive.com/2017/05/06/models-migrations-sequelize-node/
모델은 우리가 만드는 앱에서 어떤 데이터를 데이터베이스로 보낼 때, 그 데이터를 데이터베이스의 틀에 맞게 다듬어주는데 사용됩니다. 마이그레이션은 데이터베이스의 골격 그 자체를 미리 셋업할 때 사용이 되는 것이구요. 따라서 둘이 중복이 되는 것 같아보여도 서로 다른 역할을 하고 있기 때문에, 어떤 변경이 있을 때는 이 둘 모두를 변경해주어야 하는 것입니다.
Sequelize 는 따로 설정하지 않았을 경우, 기본적으로 모델 이름을 기반으로 테이블의 이름을 자동으로 설정하게 되어있습니다. 그리고 그 형태는 복수형으로 만들어지게 되어있죠. inflection 라이브러리를 기반으로 하기 때문에 s 를 붙이는 일반적인 복수형은 물론, person -> people 의 형태와 같은 불규칙한 복수형도 자동으로 생성이 가능하다고 합니다.
만약 내가 만든 모델 이름을 기반으로 똑같은 이름이 테이블에도 설정되기를 원한다면 freezeTableName: true
이라는 옵션을 사용해서 설정이 가능하다고 합니다. 전역 설정도 가능하니 궁금하시면 링크를 참고해보시면 되겠습니다.
공식문서를 순서대로 차근차근 훑어보는 중입니다. 자꾸 욕심이 생겨서인지 얼마 읽지 못하고 자꾸 정리도 하고, 다른 것도 알아보고 하게 되네요. 모든 공부가 그렇듯 한달음에 끝낼 일이 아니니 마음을 다스리고 오늘은 여기에서 마무리할까 합니다.