[Sequelize] 타입스크립트로 세팅하기 with NestJS
시퀄라이즈는 자바스크립트 기반의 ORM 라이브러리지만, 타입스크립트에 대한 구현도 제공한다.
타입스크립트 자체에 대한 싱크는 TypeORM보다 못하지만, 그런대로 쓸만하다.
테스트에 사용한 데이터베이스는 PostgreSQL이다.
시퀄라이즈와 시퀄라이즈의 타입 모듈을 설치하고, 추가로 데이터베이스 전용 모듈을 설치한다.
나는 Postgresql을 사용하므로 pg를 받았는데, mysql이나 다른 데이터베이스를 사용한다면 그에 맞는 전용 모듈을 설치하면 된다.
npm install --save sequelize sequelize-typescript pg
npm install --save-dev @types/sequelize
그리고 우리는 NestJS의 패턴에 맞춰서 시퀄라이즈 커넥션을 프로바이더로 생성, 동적으로 주입할 수 있게 할 것이다.
대강 다음과 같이 커넥션 프로바이더를 정의한다.

import { Sequelize } from 'sequelize-typescript';
import { User } from '../entity/user.entity';
const DATABASE_URL = process.env['NEST_JS_TEST_DATEBASE_URL'];
console.log(DATABASE_URL);
export const databaseProviders = [
{
provide: Sequelize,
useFactory: async () => {
const sequelize = new Sequelize(DATABASE_URL);
sequelize.addModels([User]);
await sequelize.sync(); // 개발시에만
return sequelize;
},
},
];
그리고 저걸 프로바이더로 등록해준다.

그리고 테이블 엔티티들을 정의해서 addModels로 추가해줘야 한다.
테이블 정의법은 기존과는 조금 다르다. 클래스를 통해 정의하고, 데코레이터로 컬럼에 대한 속성을 표기한다.
Comment는 주석, AllowNull은 널 여부. Unique는 유일성.
Column은 컬럼임을 명시하고 데이터타입을 명시하기도 한다.
왜인지는 모르겠는데 Column 데코레이터는 항상 마지막에 와야하더라

import {
Table,
Column,
Model,
Unique,
Comment,
DataType,
Default,
AllowNull,
} from 'sequelize-typescript';
@Table
export class User extends Model {
@Comment('이메일(아이디)')
@AllowNull(false)
@Unique
@Column
email: string;
@Comment('해싱된 패스워드')
@AllowNull(false)
@Column(DataType.TEXT)
password: string;
@Comment('패스워드 솔팅값')
@AllowNull(false)
@Column(DataType.TEXT)
passwordSalt: string;
@Comment('사용자 이름')
@Column(DataType.STRING(100))
name: string;
@Comment('사용자 타입')
@AllowNull(false)
@Default('USER')
@Column(DataType.ENUM('USER', 'ADMIN'))
userType: string;
}
저래놓고 돌리면 엔티티를 정의한대로 실제 테이블들이 생성된다.

그럼 이제 프로바이더로 등록한 커넥션 객체를 주입해서 잘 사용하면 된다.
대충 아래처럼.

그렇다.
참조
https://docs.nestjs.com/recipes/sql-sequelize
https://www.npmjs.com/package/sequelize-typescript
https://sequelize.org/master/class/lib/data-types.js~ENUM.html