이번 프로젝트에서는 ORM을 기존 TypeORM에서 Sequelize ORM으로 바꿔서 하기로 하였다. 두 라이브러리 모두 nestJS에서 소개하고 있으며, 새로운 라이브러리를 익히는 것도 바람직하다고 생각해서였다. 또한 sequelize를 사용하는 회서도 곳곳에서 봐왔기에 더욱 좋은 기회라고 생각했다. ORM에 대한 내용을 익히기 위해서는 지난 벨로그를 복습하였다.
NestJS에서 Sequelize 패키지 설치는 nestjs docs를 참고하며 설치하였다. 해당 프로젝트는 yarn으로 하기 때문에 yarn을 통해서 설치하였다.
$ yarn add @nestjs/sequelize sequelize sequelize-typescript mysql2
$ yarn add @types/sequelize -D
app.module.ts에 Sequelize 의존성은 아래와 같이 주입하였다. 원래 models라고 프로퍼티가 하나 더 있어야 한는데, Auto-load models라고 하여 자동으로 추가하는 것을 시도하고 있다. 안되면 다시 models property로 하여 시도해야 할 것 같다. 지금은 model 1개라 문제는 없어 보인다.
//app.module.ts
import { Module } from '@nestjs/common';
import { SequelizeModule } from '@nestjs/sequelize';
@Module({
imports: [
UserModule, //
SequelizeModule.forRoot({
dialect: 'mysql',
host: 'my_database',
port: 3306,
username: 'root',
password: 'root',
database: 'myproject',
autoLoadModels: true,
synchronize: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
TypeORM에서 간편하게 id 일련번호를 데이터가 생성될 때마다 만들 수 있었다. @PrimaryGeneratedColumn 기능이었는데, Sequelize에서도 구현하는 것이 좋다고 생각하였다. 그런데 nestJS에서 데코레이터 문법과 Sequelize Docs에 나오는 문법이 조금은 달라 애를 먹었다 ㅠ.
Sequelize Docs 대로 Coloumn에 아래와 같이 시도 하였다.
//user.entity.ts
import { Column, Model, Table } from 'sequelize-typescript';
import { DataTypes } from 'sequelize/types';
...
@Column({
type: DataTypes.CHAR(36), //Mysql은 CHAR(36) type으로!
defaultValue: DataTypes.UUIDV4, // Or DataTypes.UUIDV1
primaryKey: true
})
//Error: Package subpath './types' is not defined by "exports" in
//myDirectory/package.json
사실 여기서 함정이 있었는데 Column생성을 데코레이터를 사용했다는 것이었다. nestJS에서는 Github에 나와 있는 docs가 링크되어 있었고, 개인적으로 sequelize홈페이지를 찾아서 적용하였기에 에러가 난 것으로 결론 지었다.
//user.entity.ts
import { Column, DataType, Model, Table } from 'sequelize-typescript';
...
@Column({
type: DataType.CHAR(36),
defaultValue: DataType.UUIDV4,
primaryKey: true,
})
위와 같이 하여 uuid를 적용 할 수 있었다.
데코레이터에 대해 다시금 공부해야할 필요성을 느꼈다. 사용하기는 편하지만 typeScript의 장점을 못 살리고 있는 거 같다. 다음 시간에는 graphQL과 같이 사용하여 데이터 입력까지 해보자.
또한 Docs는 내용을 깃허브는 문법을 참고해서 발전시켜야겠다.
[sequelize-typescript: Decorators and some other features for sequelize, Github, 2022년08월14일 접속]
https://github.com/sequelize/sequelize-typescript#column-api
[[Nest] Nest 시작하기 (2) - DB연결 ( mysql, sequelize), velog, 2022년08월14일 접속]
https://velog.io/@kwonh/Nest-Nest-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-2-DB%EC%97%B0%EA%B2%B0-mysql-sequelize
[Sequelize - using UUID for primary key column in your table models, https://sebhastian.com/, 2022년08월14일 접속]
https://sebhastian.com/sequelize-uuid/