728x90
반응형
1. Migration의 개념
- Migration은 DB 스키마 변경 내역을 코드로 관리하는 방법.
- 장점:
- 스키마 변경 기록이 남아 협업/배포 시 일관성 유지.
- 로컬, 스테이징, 프로덕션에 동일하게 반영 가능.
- 구성:
- up 메서드 → 변경 적용
- down 메서드 → 변경 롤백
2. Migration 생성 방식 2가지
① 자동 생성 (migration:generate)
- 엔티티(Entity) 변경사항을 DB 스키마와 비교하여 자동으로 SQL 생성.
npm run typeorm migration:generate -- -d src/config/migration.config src/database/migrations/migration-name
- 장점: 편함. 엔티티 변경만 하면 됨.
- 단점:
- Enum value 추가, View 변경 등은 감지 불가.
- 설정된 dataSource 파일(-d 옵션) 필요.
② 수동 생성 (migration:create)
- 빈 마이그레이션 파일을 생성하고, SQL 직접 작성.
npm run migration:create --filename="update_<fileName>"
npm run typeorm migration:create src/modules/database/migrations/migration-name
- 장점: 자동 감지 불가한 변경(ENUM 추가, INDEX 수정 등) 가능.
- 단점: SQL 직접 작성해야 함.
3. TypeORM CLI 사용 포인트
- -d <path> → DataSource 설정 파일 경로 지정.
- DataSource는 DB 연결 정보, 엔티티, 마이그레이션 경로 등을 정의한 파일.
- NestJS에서는 TypeOrmModule.forRootAsync 방식과 별개로 CLI용 data-source.ts를 따로 두는 경우 많음.
4. 실제 시나리오 예시
(1) Entity 변경 → 자동 마이그레이션
# Entity 수정 후
npm run typeorm migration:generate -- -d src/config/migration.config src/database/migrations/add-user-table
(2) 자동 감지 불가 변경 → 수동 마이그레이션
npm run typeorm migration:create src/modules/database/migrations/update-user-table
// update-user.ts
import { MigrationInterface, QueryRunner } from "typeorm";
export class UpdateUser1691762712345 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
ALTER TYPE user_type_enum ADD VALUE 'admin';
`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
// 롤백 로직
`DROP TYPE "public"."user_type_enum"`,
}
}
5. 마이그레이션 실행
# 최신 마이그레이션 적용
npm run typeorm migration:run -- -d src/config/migration.config
# 롤백 (최근 실행된 마이그레이션 취소)
npm run typeorm migration:revert -- -d src/config/migration.config
6. Best Practice
- 자동 + 수동 혼합 사용:
- 일반 스키마 변경 → migration:generate
- 복잡한 SQL, enum 변경 → migration:create
- 항상 **버전 관리(Git)**에 마이그레이션 파일 포함.
- 배포 전 로컬/스테이징 환경에서 migration:run 테스트.
<참고>
package.json

728x90
'Tech Notes' 카테고리의 다른 글
| SQL 쿼리 작성 방식 비교 - 파라미터 바인딩 vs 템플릿 리터럴 (0) | 2025.08.12 |
|---|---|
| PostgreSQL JSONB 타입에 문자열 저장하는 완벽 가이드 (3) | 2025.08.12 |
| TaskMaster는 Cursor Pro, Claude Pro와 상관이 없네? (1) | 2025.08.02 |
| Shrimp Task Manager : 워크플로우/프로세스 관리 MCP (2) | 2025.08.02 |
| Claude 에 Notion MCP 연결 오류 (0) | 2025.08.01 |