Nest.js typeorm으로 DB 연결하기

노누리·2022년 6월 10일
3

지난 포스팅에서는 Nest.js 모듈 생성하는 방법과 라우팅하는 방식을 설명했다.

지난 포스팅

이번 포스팅에서는 본격적으로 CRUD 구현을 하기 전 DB에 연결하는 코드를 설명해보려고 한다. 본인은 postgresSQL을 사용하고 있기 때문에 해당 DB로 설명할 예정이다.

database와 연결하기

우선 Nest.js에서 데이터베이스와 연결하기위해서 사용하는 방식은 typeorm이다. mysql을 사용하기 위해 쓰는 Sequelize와 같은 역할을 하는 것이라고 생각하면 된다.

typeorm을 사용하기 위해서는 우선 모듈을 설치해주어야 한다.

npm install --save pg
npm install --save typeorm

이때, typeorm을 설치하게 되면 최신버전으로 설치를 하게 되는데 현재 최신 버전은 0.3 버전이다. 비교적 얼마 전에 업데이트를 해서 구글링을 했을 때 나오는 typeorm 사용법은 0.2 버전으로 나와있다. 때문에 그대로 따라하면 오류가 발생하게 된다.

본인은 0.3 버전으로 설명을 할 것이다.

모듈을 설치한 뒤, database라는 module, repository 파일을 생성해준다.

database.module.ts

import { Module } from '@nestjs/common';
import { databaseProviders } from './database.repository';

@Module({
  providers: [...databaseProviders],
  exports: [...databaseProviders],
})
export class DatabaseModule {}

자주 보던 모듈 형식으로 되어있고 providers와 exports에 레포지토리를 넣어준다.


database.repository.ts

import { DataSource } from 'typeorm';

export const databaseProviders = [
  {
    provide: 'DATA_SOURCE',
    useFactory: async () => {
      const dataSource = new DataSource({
        type: 'postgres',
        host: 'localhost',
        port: 5432,
        username: 'postgres',
        password: 'postgres',
        database: '생성한 데이터베이스 이름',
        entities: [__dirname + '/../**/*.entity{.ts,.js}'],
        synchronize: true,
      });

      return dataSource.initialize();
    },
  },
];

repository에는 DB 연결을 위한 설정을 만들어준다.

type : DB 타입
host : localhost 혹은 DB IP
port : DB 포트 (postgres는 기본으로 5432이 주어진다)
username : DB 유저 (postgres는 기본으로 'postgres')
password : DB 접속을 위한 비밀번호 (postgres는 기본으로 'postgres')
database : 생성한 데이터베이스 이름

그리고 entities는 후에 설명할 예정인데 간단하게 말하자면 DB 테이블이다. 코드에 직접 생성해줄 예정이라 해당하는 entity 파일들의 위치를 배열 형식으로 넣어주는 것이다.


Repository 생성

구버전의 typeorm은 이렇게 하고 엔티티를 생성하면 되었을텐데 업데이트 된 typeorm은 엔티티별 repository를 따로 만들어주어야한다.

board.repository.ts

import { Board } from 'src/entities/board.entity';
import { DataSource } from 'typeorm';

export const boardRepository = [
  {
    provide: 'BOARD_REPOSITORY',
    useFactory: (dataSource: DataSource) => dataSource.getRepository(Board),
    inject: ['DATA_SOURCE'],
  },
];

위 코드처럼 생성해주고 board.module에 board.repository.tsdatabase.module.ts를 추가해주어야 사용할 수 있다!

board.module.ts

import { Module } from '@nestjs/common';
import { DatabaseModule } from 'src/database/database.module';
import { boardRepository } from 'src/repository/board.repository';
import { BoardController } from './board.controller';
import { BoardService } from './board.service';

@Module({
  imports: [DatabaseModule],
  controllers: [BoardController],
  providers: [...boardRepository, BoardService],
})
export class BoardModule {}

이렇게 하면 데이터베이스 연결을 위한 준비가 끝났다. entity를 생성해보자.


entity 생성

폴더의 위치는 취향에 따라 다르다. 본인은 src 폴더 바로 밑에 entities라는 폴더를 생성하여 그곳에 entity 파일을 생성했다.

대신 database.respository.ts 파일의 entities 부분에 파일의 위치를 잘 설정해주어야 한다!

board.entity.ts

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Board extends BaseEntity {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  title!: string;

  @Column()
  description!: string;
}

위 코드처럼 entity 파일을 생성해준다.

BaseEntity를 상속받고 @Entity() 데코레이터를 선언하여 엔티티임을 알려준다.

@Column()은 예상했듯이 테이블 필드를 나타내고 @PrimaryGeneratedColumn()을 사용하면 자동으로 값이 하나씩 증가하는 id 값을 가질 수 있다.

위의 코드는 id라는 식별자와 title, description이라는 문자열 형식의 필드를 가진 board라는 테이블을 만들어둔 것이다.

이렇게 테이블 구조까지도 모두 만들었다.

마지막으로 app.module.ts에 board.module을 추가해주자.

@Module({
  imports: [BoardModule],
  controllers: [AppController, BoardController],
  providers: [AppService, BoardService],
})
export class AppModule {}

npm run start:dev 명령어를 통해 실행시켜주면 처음에 설정해둔 postgres 데이터베이스 내에 board라는 테이블이 새로 생성된 것을 확인할 수 있다.

위 이미지의 movie와 users는 따로 만들어둔 것이니 board 테이블만 확인하면 된다!


Nest.js에서 DB와 연결도 끝났다! 본격적으로 다음 포스팅에서 CRUD 구현에 들어가면 될 것 같다. 0.2 버전의 typeorm과 0.3 버전의 typeorm 사이에서 시간을 많이 잡아먹었는데 nestjs 공식문서에 정리가 잘 되어있어 확인하기가 편했다.

아래의 링크를 참고하면 될 것 같다!

참고 Nestjs typeorm 공식 문서

profile
백엔드 개발자입니다.

0개의 댓글