TestForge Blog

MongoDB vs PostgreSQL — 어떤 DB를 선택해야 할까?

MongoDB와 PostgreSQL의 실질적인 차이점 비교. 데이터 모델, 성능, 트랜잭션, 운영 비용까지 선택 기준을 실무 관점에서 정리합니다.

TestForge Team ·

핵심 차이

항목PostgreSQLMongoDB
데이터 모델관계형 (테이블)문서 (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 데이터

어느 하나가 절대 우위에 있지 않습니다.
”어떤 데이터를, 어떻게 사용할 것인가”가 선택 기준입니다.