이 문서는 NestJS 모노레포에서 각 앱(app)마다 개별 PostgreSQL 데이터베이스를 사용하도록 분리한 과정을 정리한 것이다.
CREATE USER menu_user WITH PASSWORD 'menu_pw';
CREATE DATABASE menu_db OWNER menu_user;
.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
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'],
});
# 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
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에서 설정하면 여러 앱 환경 분리에 유용