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 _id → id 필드 변경 대응
- 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. 참고자료 / 공식 문서
- Prisma 공식 문서: https://www.prisma.io/docs
- Prisma Migrate: https://www.prisma.io/docs/concepts/components/prisma-migrate
- PostgreSQL 공식 문서: https://www.postgresql.org/docs/
- Mongoose Docs: https://mongoosejs.com/docs/
정리
이 마이그레이션의 핵심은 단순한 DB 교체가 아니라
"데이터 모델 + 아키텍처 + 개발 경험(DX)을 동시에 개선하는 것"
- Prisma → 타입 안정성과 생산성 확보
- PostgreSQL → 데이터 정합성 확보
- Service Layer → 확장 가능한 구조 확보
반응형
'DB' 카테고리의 다른 글
| 데드락(Deadlock) — MikroORM/PostgreSQL 실전 예제로 이해하기 (0) | 2026.01.05 |
|---|---|
| 파티셔닝의 정의와 예시, 고려해야 하는 시점 (2) | 2025.08.02 |
| 스플릿 브레인의 정의와 발생 시나리오 정리 (0) | 2025.08.02 |
| [데이터 중심 어플리케이션 설계하기] 2과. 데이터 모델과 질의 언어 (0) | 2025.07.13 |
| [데이터 중심 어플리케이션 설계하기] 1과. 신뢰 할 수 있고 확장 가능 하며 유지 보수 하기 쉬운 애플리케이션 (1) | 2025.07.13 |
댓글