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])
}

마이그레이션 전략

  1. 병렬 운영: 기존 TypeORM 코드는 유지하면서 새 기능만 Prisma로 작성
  2. 스키마 동기화: prisma db pull로 기존 DB 스키마를 Prisma 스키마로 변환
  3. 점진적 교체: 읽기 작업부터 Prisma로 전환, 안정성 확인 후 쓰기 작업 전환

주의사항

  • Prisma는 raw query 실행 시 타입 추론이 약하다. $queryRaw에 제네릭 타입을 명시해야 했다
  • 트랜잭션 처리 방식이 다르다. $transaction API에 익숙해지는데 시간이 필요했다
  • 마이그레이션 파일 관리가 TypeORM과 달라서 초기 세팅에 신경써야 한다

결과

쿼리 작성 속도가 30% 정도 빨라졌고, 타입 오류로 인한 런타임 에러가 확실히 줄었다. 다만 러닝커브가 있어서 팀 전체 적용까지는 시간이 더 필요할 것 같다.

Node.js 프로젝트에 Prisma 2 도입하며 마이그레이션 전략 정리