는 다른 블로그에서도 간단하게 정리가 되어있으니 참고하고 이어서 NestJs에서 어떻게 연결하는지 TypeORM에 대해서도 알아보자.
TypeORM
TypeORM 은 node.js에서 실행되고 TypeScript로 작성된 객체 관계형 매퍼 라이브러리
ORM (Object Relational Mapping)이란 객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업이며 데이터베이스의 변형에 유연하다.
npm i typeorm @nestjs/typeorm mysql2
src 폴더 안에 configs 폴더를 생성한 후 다음과 같이 연결에 필요한 설정값을 기재한 typeorm.config.ts를 작성한다.
// typeorm.config.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const typeORMConfig: TypeOrmModuleOptions = {
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'board-app',
entities: [__dirname + '/../**/*.entity.{js,ts}'],
synchronize: true,
logging: true,
};
entities: 엔티티 파일의 위치이며, 엔티티를 이용해서 데이터베이스 테이블을 생성한다.
synchronize: true 값을 주면 애플리케이션을 다시 시작할 때 엔티티안에서 수정된 컬럼의 길이 타입 변경값등을 해당 테이블을 Drop한 후 다시 생성한다.
logging: 사용된 쿼리문을 확인할 수 있다.
import { Module } from '@nestjs/common';
import { BoardsModule } from './boards/boards.module';
import { TypeOrmModule } from '@nestjs/typeorm';
import { typeORMConfig } from './configs/typeorm.config';
@Module({
imports: [TypeOrmModule.forRoot(typeORMConfig), BoardsModule],
})
export class AppModule {}
forRoot안에 넣어준 설정은 모든 Sub-Module 부수적인 모듈들에 모두 적용이 된다.
Entity를 생성해야하는 이유?
ORM 없이 데이터베이스 테이블을 설치할 때는 데이터베이스의 SQL문법으로 생성해준다. 하지만 TypeORM을 사용할 때는 데이터베이스 테이블로 변환되는 Class이기 때문에 클래스를 생성한 후 그 안에 컬럼들을 정의해준다.
// board.entity.ts
import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { BoardStatus } from './board-status.enum';
@Entity()
export class Board extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column()
status: BoardStatus;
}
// board-status.enum.ts
export enum BoardStatus {
PUBLIC = 'PUBLIC',
PRIVATE = 'PRIVATE',
}
Repository
엔티티 개체와 함께 작동하며 엔티티 검색, 삽입, 수정, 삭제 등을 처리한다.
데이터베이스에 관련 된 일(검색, 삽입, 수정, 삭제 등)은 서비스에서 하는게 아닌 Repository에서 한다.(Repository Pettern)
현재 버전업으로 인해 기존 Repository 파일 생성 시 사용되었던 @EntityRepository() 데코레이터가 더이상 지원되지 않는다.
이에 대한 Repository 생성은 다음 [NestJS] EntityRepository is deprecated 해결에서 확인하는 것이 좋겠다.