DB

MongoDB(Mongoose) → PostgreSQL(Prisma) 마이그레이션 가이드 (Service Layer 포함)

Joonfluence 2026. 3. 22.

1. 문서 제목 제안

  • MongoDB(Mongoose) → PostgreSQL(Prisma) 마이그레이션 가이드 (Service Layer 포함)

2. 기술 개요 요약

MongoDB(Mongoose) 기반의 NoSQL 구조에서 PostgreSQL(Prisma ORM) 기반의 관계형 데이터 구조로 전환하면서, 타입 안정성, 데이터 정합성, 개발자 경험(DX)을 개선하고 Service Layer를 도입해 아키텍처의 유지보수성과 확장성을 높이는 것이 핵심이다. 특히 Prisma는 스키마 기반 타입 생성과 직관적인 마이그레이션 워크플로우를 제공하여 생산성을 크게 향상시킨다.


3. 핵심 기능 / 개념 정리

3.1 Mongoose vs Prisma 비교

항목 Mongoose (MongoDB) Prisma (PostgreSQL)
데이터 구조 Schema-less Schema-based
타입 안정성 수동 TS 인터페이스 자동 타입 생성
관계 관리 애플리케이션 레벨 DB 레벨 (FK)
마이그레이션 별도 관리 Prisma Migrate
개발 경험 보통 매우 우수 (자동완성, Studio)

3.2 Prisma 데이터 모델링

model User {
  id        String   @id @default(cuid())
  email     String   @unique
  password  String
  token     String?
  createdAt DateTime @default(now())
}

model Category {
  id       String    @id @default(cuid())
  name     String    @unique
  products Product[]
}

model Product {
  id          String   @id @default(cuid())
  name        String
  price       Float
  categoryId  String
  category    Category @relation(fields: [categoryId], references: [id])

  @@index([price])
}

핵심 포인트

  • @relation으로 명시적인 관계 정의
  • @@index로 쿼리 성능 개선
  • cuid() 기반 ID 생성 (정렬 + URL 친화성)

3.3 Service Layer 아키텍처

구조

Controller → Service → Prisma Client → DB

역할 분리

계층 역할
Controller HTTP 요청/응답 처리
Service 비즈니스 로직
ORM (Prisma) DB 접근

4. 사용 예시 및 코드 스니펫

4.1 Service Layer 예시

// userService.ts
export const createUser = async (data: RegisterInput) => {
  const hashedPassword = await bcrypt.hash(data.password, 10);

  return prisma.user.create({
    data: {
      ...data,
      password: hashedPassword,
    },
  });
};

4.2 Controller에서의 사용

// userController.ts
export const register = async (req, res) => {
  const user = await userService.createUser(req.body);

  res.json({
    isAuth: true,
    _id: user.id, // 하위 호환성 유지
    email: user.email,
  });
};

4.3 Prisma 마이그레이션 워크플로우

# 1. 스키마 수정
schema.prisma

# 2. 마이그레이션
npx prisma migrate dev

# 3. 타입 생성
npx prisma generate

# 4. 시드 데이터
npx prisma db seed

5. 실제 사용 시 주의점 / Best Practice

5.1 _idid 필드 변경 대응

  • MongoDB: _id
  • PostgreSQL/Prisma: id

해결 전략

  • API 응답에서 _id로 매핑하여 하위 호환 유지
  • 점진적 클라이언트 수정 권장

5.2 Service Layer 도입 시 장점

  • DB 변경 영향 최소화
  • 테스트 용이성 증가
  • 캐싱/로깅/트랜잭션 확장 가능

5.3 Prisma 사용 시 Best Practice

  • select / include로 필요한 데이터만 조회
  • 인덱스 적극 활용 (@@index)
  • 대량 데이터 처리 시 pagination 필수 (skip, take)
  • 트랜잭션: prisma.$transaction() 활용

5.4 성능 및 확장 고려

  • Redis 캐싱은 Service Layer에서 처리
  • 읽기-heavy API는 캐시 우선 전략 적용
  • 필터링 쿼리는 복합 인덱스 고려

6. 참고자료 / 공식 문서


정리

이 마이그레이션의 핵심은 단순한 DB 교체가 아니라

"데이터 모델 + 아키텍처 + 개발 경험(DX)을 동시에 개선하는 것"

  • Prisma → 타입 안정성과 생산성 확보
  • PostgreSQL → 데이터 정합성 확보
  • Service Layer → 확장 가능한 구조 확보
반응형

댓글