Node.js 프로젝트에 Prisma 2 도입하며 마이그레이션 전략 정리
배경
회사 프로젝트에서 TypeORM을 사용하고 있었는데, 복잡한 쿼리가 늘어나면서 타입 안정성과 생산성에 한계를 느꼈다. Prisma 2가 안정화되었다는 소식을 듣고 팀 내부 도구부터 전환을 시도했다.
TypeORM vs Prisma 비교
TypeORM은 데코레이터 기반이라 엔티티 클래스가 비대해지는 경향이 있었다.
// TypeORM
@Entity()
class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
email: string;
@OneToMany(() => Post, post => post.author)
posts: Post[];
}
Prisma는 schema.prisma 파일에 선언적으로 정의한다.
model User {
id Int @id @default(autoincrement())
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
authorId Int
author User @relation(fields: [authorId], references: [id])
}
마이그레이션 전략
- 병렬 운영: 기존 TypeORM 코드는 유지하면서 새 기능만 Prisma로 작성
- 스키마 동기화:
prisma db pull로 기존 DB 스키마를 Prisma 스키마로 변환 - 점진적 교체: 읽기 작업부터 Prisma로 전환, 안정성 확인 후 쓰기 작업 전환
주의사항
- Prisma는 raw query 실행 시 타입 추론이 약하다.
$queryRaw에 제네릭 타입을 명시해야 했다 - 트랜잭션 처리 방식이 다르다.
$transactionAPI에 익숙해지는데 시간이 필요했다 - 마이그레이션 파일 관리가 TypeORM과 달라서 초기 세팅에 신경써야 한다
결과
쿼리 작성 속도가 30% 정도 빨라졌고, 타입 오류로 인한 런타임 에러가 확실히 줄었다. 다만 러닝커브가 있어서 팀 전체 적용까지는 시간이 더 필요할 것 같다.