nestJS로 개인프로젝트만들기6

Parker.Park·2022년 8월 10일
0

personal_project1

목록 보기
6/9

Sequelize

이번 프로젝트에서는 ORM을 기존 TypeORM에서 Sequelize ORM으로 바꿔서 하기로 하였다. 두 라이브러리 모두 nestJS에서 소개하고 있으며, 새로운 라이브러리를 익히는 것도 바람직하다고 생각해서였다. 또한 sequelize를 사용하는 회서도 곳곳에서 봐왔기에 더욱 좋은 기회라고 생각했다. ORM에 대한 내용을 익히기 위해서는 지난 벨로그를 복습하였다.

[TypeORM : 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 {}

UUID

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/

profile
개발자준비중

0개의 댓글