NestJS 앱별 데이터베이스 분리 가이드

ddoachi·2025년 4월 30일

TekaPicker

목록 보기
14/30

이 문서는 NestJS 모노레포에서 각 앱(app)마다 개별 PostgreSQL 데이터베이스를 사용하도록 분리한 과정을 정리한 것이다.


1. 왜 앱별로 DB를 분리하는가?

  • 보안 분리: 한 서비스가 다른 서비스의 테이블을 건드리지 않도록 격리
  • 유지보수 편의: 도메인 단위로 마이그레이션/테스트/백업이 쉬움
  • 스케일링 대응: 트래픽 집중 시 DB 수평 분산 가능

2. PostgreSQL에서 DB 및 유저 생성

CREATE USER menu_user WITH PASSWORD 'menu_pw';
CREATE DATABASE menu_db OWNER menu_user;

3. .env 파일 구성

apps/menu/.env:

DB_HOST=localhost
DB_PORT=5432
DB_NAME=menu_db
DB_USER=menu_user
DB_PASSWORD=tekapicker

루트 .env:

MENU_ENV_PATH=apps/menu/.env

4. data-source.ts 설정

경로: libs/database/src/menu/data-source.ts

import * as dotenv from 'dotenv';
import { resolve } from 'path';
import { DataSource } from 'typeorm';
import { Menu } from './entities/menu.entity';
import { DailyMenu } from './entities/daily-menu.entity';

dotenv.config({ path: resolve(__dirname, '../../../../.env') });
dotenv.config({ path: process.env.MENU_ENV_PATH || resolve(__dirname, '../../../../apps/menu/.env') });

export default new DataSource({
  type: 'postgres',
  host: process.env.DB_HOST,
  port: Number(process.env.DB_PORT),
  username: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  entities: [Menu, DailyMenu],
  migrations: ['libs/database/src/menu/migrations/*.ts'],
});

5. migration 생성 및 실행

# migration 생성
npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli \
  -d libs/database/src/menu/data-source.ts \
  migration:generate libs/database/src/menu/migrations/AddMenuTables

# migration 실행
npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli \
  -d libs/database/src/menu/data-source.ts \
  migration:run

6. 디렉토리 구조 예시

libs/
└── database/
    └── src/
        └── menu/
            ├── entities/
            │   ├── menu.entity.ts
            │   └── daily-menu.entity.ts
            ├── migrations/
            │   └── 171xxx-AddMenuTables.ts
            └── data-source.ts

apps/
└── menu/
    ├── .env
    └── src/

참고

  • .env는 CLI 실행 시 자동 로딩되지 않기 때문에 dotenv.config()로 명시적으로 경로 지정 필요
  • process.env.MENU_ENV_PATH를 루트 .env에서 설정하면 여러 앱 환경 분리에 유용
profile
내일도 풀스택

0개의 댓글