[NestJS] TypeORM과 DB

soyeon·2023년 4월 11일

Nest

목록 보기
3/10
post-thumbnail

1. MySQL 설치 후 MySQL 서버 실행하기

는 다른 블로그에서도 간단하게 정리가 되어있으니 참고하고 이어서 NestJs에서 어떻게 연결하는지 TypeORM에 대해서도 알아보자.

2. TypeORM(Object Relational Mapping) 이란?

TypeORM
TypeORM 은 node.js에서 실행되고 TypeScript로 작성된 객체 관계형 매퍼 라이브러리
ORM (Object Relational Mapping)이란 객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업이며 데이터베이스의 변형에 유연하다.

TypeORM 특징과 이점

  • 모델을 기반으로 데이터베이스 테이블 체계를 자동으로 생성
  • 데이터베이스에서 개체를 쉽게 삽입, 업데이트 및 삭제 가능
  • 테이블 간의 매핑 (일대일, 일대다 및 다대다)
  • 간단한 CLI 명령을 제공
  • TypeORM은 간단한 코딩으로 ORM 프레임 워크를 사용하기 쉬움
  • TypeORM은 다른 모듈과 쉽게 통합 가능

모듈 설치

npm i typeorm @nestjs/typeorm mysql2

  • @nestjs/typeorm: NestJS에서 TypeORM을 사용하기 위해 연동시켜줌
  • typeorm: TypeORM 모듈
  • mysql2: MySQL 모듈

애플리케이션에 연결하기

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

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 부수적인 모듈들에 모두 적용이 된다.

3. Entity와 Repository

Entity 생성하기

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',
}
  • @Entity(): Board 클래스가 엔티티임을 나타냄, CREATE TABLE board 부분
  • @PrimaryGeneratedColumn(): id 컬럼이 Board 엔티티의 기본 키임을 나타냄
  • @Column(): Board 엔티티의 title 및 description과 같은 다른 열을 나타냄

Repository 생성하기

Repository
엔티티 개체와 함께 작동하며 엔티티 검색, 삽입, 수정, 삭제 등을 처리한다.
데이터베이스에 관련 된 일(검색, 삽입, 수정, 삭제 등)은 서비스에서 하는게 아닌 Repository에서 한다.(Repository Pettern)

현재 버전업으로 인해 기존 Repository 파일 생성 시 사용되었던 @EntityRepository() 데코레이터가 더이상 지원되지 않는다.

이에 대한 Repository 생성은 다음 [NestJS] EntityRepository is deprecated 해결에서 확인하는 것이 좋겠다.

profile
사부작 사부작

0개의 댓글