[Nest.js] TypeORM을 통해 Mysql 사용하기

김지엽·2023년 12월 19일
0
post-thumbnail
post-custom-banner

1. 개요

이전 프로젝트는 express에서 nest로 넘어가면서 sequelize가 편해서 지속적으로 sequelize를 사용했다.

하지만 nest는 공식문서에서도 TypeORM의 사용을 권장하고 있으며, nest에서 sequelize를 사용해본 경험으로 sequelize-typescript라는 패키지가 있음에도 불구하고, ESM환경에서 꽤 불편하다고 느꼈다.

마침 이번 부트캠프 프로젝트에서 TypeORM을 사용할 것이기에 공부해 볼려고 한다.

2. TypeORM을 통해 DB 연결

- TypeORM 설치

$ npm install --save @nestjs/typeorm typeorm mysql2

- DB 연결하기

@nestjs/typeorm 패키지의 TypeOrmModule은 DynamicModule 타입으로 forRoot, forFeature 등의 메서드를 활용하여 데이터베이스의 정보를 통해 연결 및 엔티티를 통해 테이블을 조작할수 있게 도와준다.

일반적으로 데이터베이스의 정보들은 환경변수를 통해 관리하기 때문에 다음과 같이 모듈을 동적으로 구성하는 것이 필요하다.

...

@Module({
  imports: [ConfigProjectModule, TypeormModule.forRoot()],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

원래는 굳이 따로 TypeOrmModule을 모듈로 한번 더 감싸줄 필요는 없지만 AppModule에 코드를 길게 적는 것을 선호하지 않기에 다음과 같은 방식으로 한번 더 감싸주었다.

import { DynamicModule, Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({})
export class TypeormModule {

    static forRoot(): DynamicModule {
        const typeormModule: DynamicModule = TypeOrmModule.forRootAsync({
            useFactory: (configService: ConfigService) => ({
                type: 'mysql',
                host: configService.get<string>('DATABASE_HOST'),
                port: configService.get<number>('DATABASE_PORT'),
                username: configService.get<string>('DATABASE_USERNAME'),
                password: configService.get<string>('DATABASE_PASSWORD'),
                database: configService.get<string>('DATABASE_NAME'),
                entities: [],
                synchronize: true,
            }),
            inject: [ConfigService]
        });

        return {
            module: TypeOrmModule,
            imports: [typeormModule],
            exports: [typeormModule],
        };
    }
}

- Entity 정의하기

DB의 정보를 통해 연결이 되었다면 ORM은 Entity를 통해 DB와 통신한다.
TypeORM에서는 다음과 같이 Entity를 정의한다.

import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity({
    name: "shows" // 데이터베이스 테이블의 이름
})
export class Show {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column()
    description: string;

    @Column()
    date: Date;

    @Column()
    time: string;

    @Column()
    place: string;

    @Column({ nullable: true })
    thumbnail?: string;

    @Column()
    category: string;

    @Column()
    totalSeat: number;
}

3. TypeORM Entity 옵션

위에서 Entity를 정의할때 Entity, Column 데코레이터에 옵션을 넣어주는 경우가 있었다. 테이블을 정의할때 null을 허용한다던가 type을 허용해준다던가 컬럼을 읽기 전용으로 하는 등의 추가적인 속성을 지정하는 경우에 위와 같은 방식으로 옵션을 넣는다.

- Entity 옵션

name: 테이블이름

테이블의 이름을 지정한다. 지정되지 않으면 엔터티 이름을 바탕으로 테이블 이름을 자동으로 생성한다.

orderBy: { "컬럼네임": "ASC" | "DSC" }

쿼리에서 orderBy가 들어있지 않을 경우의 기본 정렬을 지정한다.

engine: "엔진 유형"

테이블의 데이터베이스 엔진 유형을 지정한다. 이 값은 테이블이 생성될 때만 사용되며, 이미 생성된 테이블의 엔진 유형을 변경하지 않는다.

database: "데이터베이스 이름"

Mysql 및 Sql Server에서 사용되는 데이터베이스의 이름을 지정한다.

schema : "스키마 이름"

Postgres 및 Sql Server에서 사용되는 스키마의 이름을 지정한다.

synchronize: boolean

이 엔터티에 대한 스키마 동기화가 활성화되어 있는지 여부를 나타낸다. false로 설정하면 스키마 동기화 및 마이그레이션에서 이 엔터티를 무시한다. 기본적으로 모든 엔터티에 대해 스키마 동기화가 활성화되어 있다.

- Column 옵션

type: "컬럼타입"

컬럼의 데이터 타입을 지정합니다.

name: "컬럼이름"

데이터베이스에서 컬럼의 이름을 지정합니다.

length: string | number

일부 컬럼 타입에서만 사용되는 속성으로, 컬럼의 길이를 나타냅니다. 예를 들어, type이 "string"이고 length가 "100"이면 ORM은 varchar(100) 형태의 컬럼을 생성합니다.

nullable: boolean

컬럼의 값이 NULL로 설정될 수 있는지 여부를 나타냅니다. 기본값은 false입니다.

update: boolean

"save" 작업에 의해 컬럼의 값이 업데이트되는지 여부를 나타냅니다. 기본값은 true입니다.

select: boolean

QueryBuilder 및 find 작업에서 컬럼이 항상 선택되는지 여부를 나타냅니다. 기본값은 true입니다.

insert: boolean

컬럼이 기본적으로 삽입되는지 여부를 나타냅니다. 기본값은 true입니다.

default: any

컬럼의 기본값을 나타냅니다.

primary: boolean

컬럼이 기본 키인지 여부를 나타냅니다.

unique: boolean

컬럼 값이 고유해야 하는지 여부를 나타냅니다.

scale: number

소수점 컬럼에 대한 스케일을 나타냅니다.

enum: (string | number)[] | Object

열거형 컬럼의 가능한 값 목록을 나타냅니다.

enumName: string

열거형 컬럼의 정확한 이름을 나타냅니다.

primaryKeyConstraintName: string

이 컬럼이 기본 키인 경우의 제약 조건 이름을 나타냅니다.

foreignKeyConstraintName: string

이 컬럼이 외래 키인 경우의 제약 조건 이름을 나타냅니다.

array: boolean

이 컬럼이 배열인지 여부를 나타냅니다.

transformer: ValueTransformer | ValueTransformer[]

컬럼 값을 데이터베이스에 저장하거나 읽을 때 사용되는 값 변환기를 지정합니다.

4. TypeORM을 통해 CRUD 구현

참고

nestJS 공식 문서(TypeORM)
nestJS 공식 문서(Dynamic Module)

profile
욕심 많은 개발자
post-custom-banner

0개의 댓글