티스토리 뷰

728x90
반응형
 

지난 글에서는 NestJS와 Fastify에 대한 소개와 기본적인 설정을 마쳤다.

 

이번 글에서는 postgreSQL을 이용한 데이터베이스 연동 파트를 역시 간단하게 살펴볼 예정이다.

 

postgreSQL에 대한 소개는 아래 글에서 확인할 수 있으며,

 

[Database]postgreSQL

 

[Database]postgreSQL

목차 FastAPI와 SQLAlchemy, 그리고 Pydantic을 이용한 토이 프로젝트를 진행하던 중 PostgreSQL을 사용해야 할 일이 생겼다. 그냥 MySQL을 사용했어도 되지만, SQLAlchemy와 궁합이 좋은 디비가 PostgreSQL이라길

gnidinger.tistory.com

 

이 글에서는 postgres 도커 이미지는 이미 받아 가지고 있다 가정하고 진행하겠다.

 

추가로 이 글의 설정을 마치고 나면 프로젝트 구조는 다음과 같이 바뀌게 된다.

 

 

docker run

 

먼저 터미널에 다음과 같이 입력해 도커 컨테이너를 띄운다.

docker run --name postgres_nest -e POSTGRES_USER=test -e POSTGRES_PASSWORD=test1234 -e POSTGRES_DB=test_postgres -p 5432:5432 -d --restart unless-stopped postgres

여기서 유저 네임(test)과 비밀번호(test1234), 디비 이름(test_postgres)을 사용하고 싶은 값으로 바꾸면 된다.

 

포트는 5432이며, -d 명령어를 이용해 백그라운드에서 실행시켰다.

 

또한 --restart unless-stopped를 이용해 시스템 시작 시 자동으로 컨테이너를 띄우도록 했는데,

 

필요에 따라 적절히 잘라서 사용하면 된다.

 

.env

 

이어서 프로젝트 루트 디렉토리에 .env 파일을 만들고 아래와 같이 구성한다.

STAGE=dev

DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=test
DB_PASSWORD=test1234
DB_NAME=test_postgres

개발환경임을 나타내는 STAGE 변수와 방금 구성한 컨테이너의 정보를 입력하는 것이다.

 

사족으로 .env파일은 .gitignore에 지정해 주는 것이 안전하다.

 

/src/config/typeorm.config.ts

 

계속해서 터미널에 아래와 같이 입력해 TypeORM을 설치한다.

npm install @nestjs/typeorm typeorm pg

여기서 TypeORM이란 이름 그대로 타입스크립트를 위한 ORM 라이브러리이다.

 

다양한 데이터베이스를 지원하며, 모델을 바탕으로 스키마를 자동생성해 주고

 

쿼리 빌더를 지원하는 등 여러모로 강력한 녀석이라고 한다.

 

설치가 끝나면 src폴더 아래에 config 폴더를 만들고 그 아래에 typeorm.config.ts를 만들어 아래와 같이 구성한다.

import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';

export const typeOrmConfigAsync = {
  useFactory: async (
    configService: ConfigService,
  ): Promise<TypeOrmModuleOptions> => ({
    type: 'postgres',
    host: configService.get('DB_HOST'),
    port: configService.get('DB_PORT'),
    username: configService.get('DB_USERNAME'),
    password: configService.get('DB_PASSWORD'),
    database: configService.get('DB_NAME'),
    entities: [__dirname + '/../**/*.entity.{js,ts}'],
    synchronize: configService.get('STAGE') === 'dev', // 예를 들어, 'STAGE' 환경 변수를 사용하여 개발 환경인지 확인
  }),
  inject: [ConfigService],
};

디비 연결을 위한 기본적인 설정이라고 보면 되며,

 

맨 아랫줄의 synchronize조건은 STAGE 환경변수가 dev일 경우 true가 되고,

이 true는 스프링으로 치면 ddl-auto: update라고 보면 된다.

 

app.module.ts

 

이어서 아래와 같이 입력해 ConfigModule을 사용할 준비를 한다.

npm install @nestjs/config

여기서 ConfigModule이란 환경 변수를 읽고 관리하기 위해 설계된 NestJS의 모듈이다.

 

내부적으로 dotenv를 기반으로 한다.

 

이어서 app.module.ts 파일을 아래와 같이 구성한다.

 

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { typeOrmConfigAsync } from './config/typeorm.config';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    TypeOrmModule.forRootAsync(typeOrmConfigAsync),
  ],
})
export class AppModule {}

 

코드의 import문 내부에 대해 잠깐 설명하자면

 

  • ConfigModule.forRoot({ isGlobal: true })
    ConfigModule을 전역 모듈로 설정한다. 이를 통해 애플리케이션의 모든 곳에서 환경 변수에 접근할 수 있게 된다.
  • TypeOrmModule.forRootAsync(typeOrmConfigAsync)
    비동기로 TypeORM 설정을 로드한다. 이 설정은 typeorm.config.ts파일에서 정의된 typeOrmConfigAsync 객체에 따라 데이터베이스 연결을 설정한다.

이 구성을 통해, NestJS 애플리케이션은 환경 변수를 관리하고, 데이터베이스 연결을 설정할 수 있게 되며,

 

여기까지 하면 기본적인 디비 연결 작업이 마무리된다.

 

다음 글부터 본격적으로 각종 CRUD를 구현해 보도록 하자.

 

끝!

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함