MongoDB vs PostgreSQL — 어떤 DB를 선택해야 할까?
MongoDB와 PostgreSQL의 실질적인 차이점 비교. 데이터 모델, 성능, 트랜잭션, 운영 비용까지 선택 기준을 실무 관점에서 정리합니다.
TestForge Team ·
핵심 차이
| 항목 | PostgreSQL | MongoDB |
|---|---|---|
| 데이터 모델 | 관계형 (테이블) | 문서 (JSON/BSON) |
| 스키마 | 고정 (엄격) | 유연 (없음) |
| 트랜잭션 | ACID 완전 지원 | 4.0+ 다중 문서 지원 |
| JOIN | 자연스러움 | 제한적 ($lookup) |
| 수평 확장 | 복잡 (Citus 등) | 기본 지원 (Sharding) |
| 전문 검색 | 기본 지원 | Atlas Search 필요 |
| 지리 데이터 | PostGIS 확장 | 기본 지원 |
PostgreSQL이 유리한 경우
1. 강한 일관성이 필요한 금융/커머스
-- 원자적 이체 - ACID 보장
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
MongoDB 4.0+도 다중 문서 트랜잭션을 지원하지만 성능 오버헤드가 있습니다.
2. 복잡한 JOIN 쿼리
SELECT
u.name,
COUNT(o.id) as order_count,
SUM(oi.price * oi.quantity) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN order_items oi ON o.id = oi.order_id
WHERE u.created_at > '2026-01-01'
GROUP BY u.id
HAVING total_spent > 100000
ORDER BY total_spent DESC;
3. 데이터 무결성이 중요할 때
-- 외래키, 제약조건으로 데이터 무결성 보장
ALTER TABLE orders
ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
ALTER TABLE products
ADD CONSTRAINT check_price CHECK (price > 0);
4. JSON 데이터도 처리해야 할 때
PostgreSQL의 JSONB는 생각보다 강력합니다.
-- JSONB 인덱스
CREATE INDEX idx_metadata ON products USING GIN (metadata);
-- JSON 필드 쿼리
SELECT * FROM products
WHERE metadata @> '{"category": "electronics", "brand": "Samsung"}';
MongoDB가 유리한 경우
1. 스키마가 자주 바뀌는 초기 개발
// 스키마 없이 바로 저장
await db.products.insertOne({
name: "새 제품",
price: 10000,
// 나중에 필드 추가해도 마이그레이션 불필요
newFeature: "값"
});
2. 중첩된 문서 구조 (embed)
댓글이 많은 소셜 서비스:
// 관련 데이터를 한 문서에 embed → 단일 쿼리
{
_id: "post_1",
title: "게시글",
author: { id: 1, name: "홍길동" },
comments: [
{ user: "김철수", text: "좋아요", createdAt: new Date() },
{ user: "이영희", text: "공감!", createdAt: new Date() }
],
tags: ["tech", "devops"]
}
PostgreSQL이었다면 posts + comments + users 3개 테이블 JOIN 필요.
3. 대용량 수평 확장
// Sharding key 설정
sh.shardCollection("mydb.events", { userId: 1, createdAt: 1 });
PostgreSQL의 수평 확장은 Citus나 Patroni 등 별도 구성 필요.
4. 실시간 이벤트 스트리밍
// Change Streams
const changeStream = db.orders.watch([
{ $match: { "fullDocument.status": "shipped" } }
]);
changeStream.on("change", (change) => {
sendShippingNotification(change.fullDocument);
});
성능 비교
단순 단일 문서 조회: MongoDB ≈ PostgreSQL
복잡한 JOIN 쿼리: PostgreSQL 우위
대량 쓰기 (삽입): MongoDB 약간 우위
집계 파이프라인: 비슷 (PostgreSQL JSON > MongoDB $lookup)
실무 선택 가이드
✅ PostgreSQL 선택:
- 금융, 결제, 재고 관리 (ACID 필수)
- 복잡한 리포팅 쿼리
- 데이터 구조가 명확하고 안정적
- 팀이 SQL에 익숙
- 규제/감사 요구사항 있음
✅ MongoDB 선택:
- 콘텐츠 관리 (블로그, CMS)
- IoT 이벤트 데이터 수집
- 사용자별 설정, 프로필 저장
- MVP / 스키마 확정 전 초기 개발
- 지리 데이터 (MongoDB 2dsphere 인덱스)
함께 사용하는 패턴
많은 프로덕션 시스템은 둘 다 사용합니다.
PostgreSQL: 주문, 결제, 사용자 계정 (핵심 비즈니스 데이터)
MongoDB: 사용자 활동 로그, 이벤트 데이터, 분석용 raw 데이터
어느 하나가 절대 우위에 있지 않습니다.
”어떤 데이터를, 어떻게 사용할 것인가”가 선택 기준입니다.