[ Nest ] postgresDB를 이용한 CRUD 앱 만들기 (3)
🌈 프로그래밍/Nest JS

[ Nest ] postgresDB를 이용한 CRUD 앱 만들기 (3)

반응형

 

안녕하세요? 수구리입니다.

이번 포스팅에서는 원래는 CRUD를 구현하기 이전에 소개를 했어야 했는데 뒤늦게나마

postgres와 Nest를 연결하는 방법을 소개하도록 하겠습니다.

우선, 이전 게시물 중에서 TypeORM을 Nest Framework위에 적용하기 위해서 필요한 설치 과정은 아래의 포스팅에서 확인해주시기 바랍니다!

2021.11.17 - [프로그래밍/Nest JS] - [ Nest JS ] TypeORM & pg module 설치 명령어

 

[ Nest JS ] TypeORM & pg module 설치 명령어

안녕하세요? 수구리입니다. 저번 포스팅에서는 Nest 애플리케이션에 DB를 적용하기 위해서 Postgre와 pgAdmin을 설치하였다. 이전 글 참고! [ Nest JS ] Postgres 설치 pgAdmin으로 Server와 DB를 구축해보자 안..

tasddc.tistory.com

 

설치가 완료되었다면 config를 연결하는 방법이 여러 가지로 존재합니다. 우선 방법 1부터 알아보겠습니다.

공식문서를 참고하여 작성하였습니다!

Database | NestJS - A progressive Node.js framework

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

 

[ 방법 1: config 파일 생성 ]

설치가 완료되었으면 프로젝트에서 typeORM와 연동을 하기 위해서 config 파일을 정의해주어야 합니다!

[ typeorm.config.ts ]

src/configs/typeorm.config.ts 생성

 

export const typeORMConfig: TypeOrmModuleOptions = {
    type: 'typeorm',
    host: 'localhost',
    port: 5432,
    username: 'root',
    password: 'root',
    database: 'boardproject',
    entities: [Board],
    synchronize: true
}

entities는 현재 Board에 대한 Entity만 있으므로 하나입니다. 나중에 User에 대한 Entity도 넣어주어야 합니다.

만약 Entity들을 모두 한번에 가져오게 하려면 아래와 같이 수정할 수 있습니다.

entities: [__dirname + '/../**/*.entity.{js,ts}']

위와 같이 한다면 현재 만들어진 모든 Entity들을 가져올 수 있습니다.

 

[ app.module.ts ]

다음으로는 root module인 app.module에 위에서 정의한 DB config 파일을 불러와 줄 수 있도록 합니다.

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { BoardsModule } from './boards/boards.module';
import { typeORMConfig } from './configs/typeorm.configs';

@Module({
  imports: [
    TypeOrmModule.forRoot(typeORMConfig),
    BoardsModule,
  ],
})
export class AppModule { }

 

[ board entity 생성하기 ]

다음으로는 typeORM을 쓰는 이유인 board entity를 정의할 것입니다.

DB를 사용하려면 DB에 table을 CEARE 문을 사용해서 정의해주고, 그에 맞게 값을 넣어주었는데

typeORM은 반대로 class를 만들어주면 자동으로 DB에서 table을 만들어줄 수 있게 해 줍니다!

import { BaseEntity, Column, Entity, ManyToMany, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
import { BoardStatus } from "./board-status.enum";

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

    @Column("varchar")
    title: string;

    @Column("varchar")
    description: string;

    @Column("varchar")
    status: BoardStatus;
}

위와 같은 board entity class를 정의해줌으로써 TypeORM은 DB의 Board Entity에 해당하는 테이블을 자동 생성하고,

이름을 board로 지정하여 아래와 같은 테이블이 만들어질 수 있게 됩니다.

 

[ 방법 2: yaml 파일로 config 정의하기 ]

다음 소개할 방법으로는 yaml 파일로 DB의 정보들을 정의하는 방법입니다.

사실 yaml 뿐만 아니라 다양한 형식 xml, json 등으로도 가능합니다.

위에서 소개한 [ 방법 1 ]로도 충분히 가능하지만, 개발 환경이나 운영 환경에 따라서 코드를 다르게 넣어줘야 할 때가 있습니다. 예를 들어 개발 모드에서 빌드해서 테스트하는 경우가 있고, 배포 모드로 빌드하는 경우 각 설정이 다르겠죠?

또한, 이런 환경 설정 자체가 노출이 되지 않도록 해야 하는 부분도 분명히 존재합니다. 따라서, [ 방법 2 ]는 설정 파일을 보다 안전하게 설정하는 방법이라고 생각해주시면 됩니다.

[ win-node-env 모듈 설치 ]

우선, 윈도우에서는 기본적으로 환경 변수를 지원하지 않기 때문에, 아래와 같은 명령어로 전역 설치를 해줍니다.

npm install -g win-node-env

( 참고 : MAC에서는 config라는 모듈 설치 )

위에서 postgres와 연결하기 위해서 configs라는 폴더를 만들었었죠?

그 폴더 내에서 yaml 형식(또는 json)의 파일을 만들어주도록 하겠습니다.

현재 config라는 폴더는 src와 같은 위치에 있습니다..!

// default.yaml
server:
  port: 3000

db:
  type: 'postgres'
  port: 5432
  database: 'boardproject'

jwt:
  expiresIn: 3600

default.yaml : 기본 설정에 대한 파일로 port 번호, db의 type와 port 번호 그리고 database 이름에 대한 설정

// development.yaml
db:
  host: 'localhost'
  username: 'root'
  password: 'root'
  synchronize: true

jwt:
  secret: 'secret'

development.yaml : default에서 설정한 것과 더불어 개발 환경에 필요한 정보

// production.yaml
db:
  synchronize: false

production.yaml : default에서 설정한 것과 더불어 배포 환경에서 필요한 설정

 

여기서 development와 production의 차이점은 synchronize에 있습니다.

개발을 할 때에는 Entity의 column이 수정되거나, 바뀌면 synchronize(동기화)가 켜져 있기 때문에 DB의 테이블도 바뀌게 됩니다.

하지만, production 즉, 배포를 한 상태인데 synchronize를 켜주면 엄청난 사태가 발생하겠죠?? 매우 조심!

그럼 이제 위에서 정의한 파일들을 적용시켜 줍시다.

적용하는 방법은 아래와 같이 import 시켜주면 됩니다.

import * as config from 'config';

 

 

[ main.ts ]

import { Logger } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

import * as config from 'config';

declare const module: any;

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  const serverConfig = config.get('server');
  const port = serverConfig.port;
  await app.listen(port);

  if (module.hot) {
    module.hot.accept();
    module.hot.dispose(() => app.close());
  }
}
bootstrap();

위의 main.ts에서는 server의 port 번호(3000)를 가져오는 데 사용되었습니다.

 

[ typeorm.config.ts ]

DB와 관련된 설정도 있었죠? 바로 typeorm.config.ts 파일로 가서 수정해줍시다!

import { TypeOrmModuleOptions } from "@nestjs/typeorm";
import { Board } from "src/boards/board.entity";

import * as config from 'config';

const dbConfig = config.get('db');

export const typeORMConfig: TypeOrmModuleOptions = {
    type: dbConfig.type,
    host: process.env.RDS_HOSTNAME || dbConfig.host,
    port: process.env.RDS_PORT || dbConfig.port,
    username: process.env.RDS_USERNAME || dbConfig.username,
    password: process.env.RDS_PASSWORD || dbConfig.password,
    database: process.env.RDS_DB_NAME || dbConfig.database,
    entities: [Board],
    synchronize: dbConfig.synchronize
}

jwt(인증)과 관련된 부분은 추후에 포스팅하여 추가하도록 하겠습니다. (User Entity와 jwt를 사용할 예정)

이상으로 postgresDB를 Nest 프레임워크에서 사용하기 위한 설정 방법에 대해서 알아보았습니다.

감사합니다.

반응형