Sequelize란? ==> ORM(Object Relational Mapping)으로써 Javascript 객체(Object)와 데이터베이스의 관계를 연결 해주는 도구 ==> Node.js 환경에서는 TypeORM, Prisma, Sequelize 등 다양한 ORM이 존재한다. ==> Sequelize와 같은 ORM은 여러가지의 관계형 데이터베이스(RDB)를 사용할 수 있다. RDB 종류에는 MySQL, Oracle, MariaDB, PostgreSQL등이 있다.
Sequelize vs, mongoose ==> mongoose는 ODM(Object Document Mapping)으로 Javascript의 객체를 Document와 연결한다. ==> mongoose는 지원하는 데이터베이스는 MongoDB만 존재한다. ==> mongoose의 경우 Schema의 형태로 컬렉션(Collection)에 대한 속성을 설정 / Sequelize의 경우 Model의 형태로 테이블(Table)의 속성을 설정할 수 있다.
ORM의 장점
과거에는 ORM을 사용하지 않고 모든 코드를 SQL을 사용하는 Raw Query 형태로 구현하여 사용하였다.
프로덕션에서 사용하는 DB가 언제바뀔 지 알 수 없다. ==> 서비스 중인 프로덕션의 모든 Raw Query코드를 MySQL에서 Oracle로 변경하는 것을 고려하거나 ==> Oracle로 변경하지 않고 어려운 현재 상황을 감내하고 계속 MySQL을 쓸 때 ==> ORM을 도입하였을 경우 속성값만 변경할 경우 언제든지 자유롭게 DB를 변경할 수 있게 되어 개발할 때 선택의 폭이 넓어지게 된다.
데이터베이스에서 사용하는 DB 또는 Table 속성이 변경되었을 때 빠르게 수정이 가능하다.
Sequelize 라이브러리 설치
npm init -y (package.json 생성)
npm install express sequelize mysql2 (express, sequelize MySQL 설치)
npm install -D sequelize-cil nodemon (sequelize-cli, nodemon 라이브러리를 DevDependency로 설치
sequelize init (설치한 sequelize를 초기화 하여, sequelize를 사용할 수 있는 구조를 생성)
[Directory Structure]
내 프로젝트 폴더 이름
├── models
│ └── index.js
├── config
│ └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json
구조 설명
models 폴더 안에 index.js가 생성 ==> sequelize 모델을 편리하게 사용할 수 있게 해주는 파일
config 폴더 안에 config.json파일 생성 ==> 데이터베이스에 연결하기 위한 설정 데이터가 JSON 형식으로 들어감
migrations폴더 생성
seeder 폴더 생성 ==> 생성된 폴더나 파일들은 임의로 옮기거나 삭제하면 안된다. sequelize-cli는 정해진 경로에 있는 파일을 사용하고 저장하기 때문에 임의로 옮기거나 삭제하면 오동작 할 가능성이 높다.
database: Sequelize와 연결할 DB명 ==> DB가 존재하지 않다면 sequelize-cli를 이용해 생성할 수 있다.
host: Sequelize와 연결할 MySQL의 엔드포인트(주소)
dialect: Sequelize와 연결할 DB엔진 ==> mysql, postgres, mariadb 등
Sequelize DB 생성 ==> config.json 파일을 수정했다면 저장 > 터미널에 sequelize db:create를 누르고 DB를 생성한다. > MySQL을 Refresh하면 파일이 생성된 것을 확인할 수 있다.
02. Sequelize - Migration, Model
Sequelize Model, Migration 생성
sequelize model:generate --name Posts --attributes title:string,content:string,password:string (attributes 부분은 원하는 양식으로 바꾸면 된다.)
[Directory Structure]
내 프로젝트 폴더 이름
├── models
│ ├── index.js
│ └── posts.js
├── config
│ └── config.json
├── migrations
│ └── 20230118144300-create-posts.js
├── seeders
├── package-lock.json
└── package.json
Migration을 이용해 Table 생성하기
sequelize db:migrate (migrations폴더에 정의된 migration 파일들과 MySQL의 테이블을 맵핑시킨다.)
Sequelize-cli 이용하기
sequelize db:create ==> config/config.json에 설정한 database를 생성
sequelize db:drop ==> confir/config.json에 설정한 database를 Drop
sequelize model:generate ==> migration 과 model을 생성 / 각 Column의 속성을 지정해줄 수 있다.
sequelize db:migrate:undo ==> 가장 최근에 실행된 db:migration 명령을 되돌린다.
sequelize seed:generate ==> seeder 폴더에 있는 seed 파일을 이용해 각 테이블에 데이터를 삽입
Sequelize의 Migration ==> Sequelize의 Migration은 MySQL의 테이블을 정의 및 생성하기 위해 사용 ==> migration파일에서 사용하는 설정
allowNull: Null 값을 허용하는지
autoIncrement: AUTO_INCREMENT로 설정 (데이터를 삽입할 때 해당 컬럼에 아무런 값을 입력하지 않더라도 1씩 증가하여 고유한 값을 유지)
primaryKey: 기본키로 설정
type: 타입을 지정
defaultValue: 아무런 값이 입력되지 않았을 때, 기본값을 설정 (createdAt, updateAt에서 NOW를 설정하면 현재 시간을 자동으로 삽입) ==> defaultValue: Sequelize.NOW는 defaultValue: Sequelize.fn("now")와 같아 NOW 설정시 정상적으로 반영이 되지 않는 다면 fn("now")로 수정하면 된다.
unique: 고유한 값만 들어올 수 있도록 설정
Sequelize의 Migration 설정 ==> Migration 파일을 수정했다면 sequelize db:migrate:undo (가장 최근에 실행한 db:migrate를 취소한다.) ==> 취소했다면 sequelize db:migrate을 통해 수정한 내용으로 테이블을 생성
Sequelize의 Model ==> migration 파일은 Table 생성을 도와주면, model 파일은 DB와 실제 연결되어 사용할 수 있게 도와준다.
Sequelize의 Model 설정 ==> DB에 저장되는 부분을 고려하여 설정하면 좋다.