Back

PostgreSQL vs MySQL vs MongoDB 2026: 아무도 안 물어봤는데 진짜 비교해봄

몇 달에 한 번씩 Reddit, 해커뉴스, 슬랙에서 똑같은 논쟁이 올라와요: "어떤 DB 쓰지?" 답변은 항상 "그냥 Postgres 써"부터 2012년 "MongoDB is web scale" 밈까지 다양하죠.

진짜 아무도 인정 안 하는 사실 하나 알려드릴게요: 만능 "최고의" 데이터베이스는 없어요. 하지만 특정 상황에 맞는 선택과 틀린 선택은 분명히 있습니다. 이 글은 부족 충성심이 아니라 실제 데이터로 결정을 도와드릴게요.

이제 한 번에 정리해봅시다—적어도 2027년까지는요.

빠른 답변 (TL;DR)

깊이 들어가기 전에, 대부분 팀이 따라야 할 결정 매트릭스:

사용 사례추천이유
일반 웹 앱PostgreSQL만능, ACID 완벽, 생태계 좋음
읽기 많은 WordPress/CMSMySQL읽기 최적화, 복제 쉬움
빠른 프로토타이핑MongoDB스키마 유연, 빠른 개발
복잡한 쿼리/분석PostgreSQL쿼리 플래너 최고, 윈도우 함수
문서 중심 (CMS, 로그)MongoDB네이티브 문서 저장, ORM 필요 없음
레거시 마이그레이션MySQL호스팅 지원 최고, 익숙함

이제 이런 추천이 나왔는지 알아봅시다.

PostgreSQL: 스위스 아미 나이프

2026년에 PostgreSQL이 기본 추천이 된 데는 이유가 있어요. 트렌디해서가 아니라, 진짜로 거의 모든 걸 잘해요.

PostgreSQL이 잘하는 거

1. 진짜 작동하는 ACID

PostgreSQL의 MVCC (Multi-Version Concurrency Control) 구현은 실전 검증됐어요:

-- PostgreSQL은 이걸 항상 올바르게 처리함 BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;

제대로 된 트랜잭션 처리로 부분 업데이트나 팬텀 리드가 절대 안 생겨요. MySQL도 할 수 있지만, PostgreSQL 구현이 엣지 케이스가 더 적어요.

2. 고급 데이터 타입

PostgreSQL은 이제 단순한 행/열만 다루지 않아요:

-- 실제 인덱싱이 되는 JSON CREATE TABLE events ( id SERIAL PRIMARY KEY, data JSONB, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE INDEX idx_events_data ON events USING GIN (data); -- NoSQL DB처럼 JSON 쿼리 SELECT * FROM events WHERE data @> '{"type": "purchase", "amount": {"$gt": 100}}';
-- 배열이 1급 시민 CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT, tags TEXT[], preferences JSONB ); SELECT * FROM users WHERE 'premium' = ANY(tags);
-- Elasticsearch 없이 전문 검색 SELECT * FROM articles WHERE to_tsvector('english', title || ' ' || body) @@ to_tsquery('english', 'database & performance');

3. 확장 생태계

PostgreSQL의 확장 시스템은 독보적이에요:

  • PostGIS: 완전한 지오스페이셜 지원 (OpenStreetMap, Uber가 사용)
  • TimescaleDB: 대규모 시계열 데이터
  • pgvector: AI/ML 벡터 임베딩
  • Citus: 거대 규모를 위한 수평 샤딩
-- 예시: AI 앱을 위한 벡터 유사도 검색 CREATE EXTENSION vector; CREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT, embedding vector(1536) -- OpenAI 임베딩 차원 ); -- 유사한 문서 찾기 SELECT * FROM documents ORDER BY embedding <-> '[0.1, 0.2, ...]' -- 쿼리 벡터 LIMIT 10;

PostgreSQL이 약한 부분

  • 복제 복잡성: 스트리밍 복제 설정이 MySQL보다 전문성 필요
  • 리소스 사용량: 단순 워크로드에선 MySQL보다 메모리 더 씀
  • 공유 호스팅: 싼 호스팅에서 덜 지원됨
  • MySQL 호환성: 일부 레거시 앱이 MySQL 고유 동작에 의존

MySQL: 믿을 수 있는 일꾼

MySQL은 세상에서 가장 많은 웹사이트를 돌려요. WordPress, Drupal, Joomla, 수많은 커스텀 앱이 의존하죠. 2026년, MySQL 8.x가 PostgreSQL과의 격차를 많이 줄였어요.

MySQL이 잘하는 거

1. 읽기 성능

MySQL의 InnoDB 엔진은 읽기 중심 워크로드에 최적화됐어요:

-- MySQL은 간단한 대용량 읽기에 탁월함 SELECT id, title, created_at FROM posts WHERE status = 'published' ORDER BY created_at DESC LIMIT 20;

일반적인 웹 앱 읽기 (블로그, 상품 목록, 유저 프로필)에서 MySQL이 PostgreSQL보다 10-20% 빠른 경우가 많아요.

2. 간단한 복제

MySQL에서 읽기 레플리카 설정은 간단해요:

-- Primary에서 SHOW MASTER STATUS; -- Replica에서 CHANGE REPLICATION SOURCE TO SOURCE_HOST='primary.example.com', SOURCE_USER='replication_user', SOURCE_PASSWORD='password', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=154; START REPLICA;

MySQL의 Group Replication과 InnoDB Cluster는 대부분 팀에서 "그냥 작동하는" 자동 페일오버를 제공해요.

3. 도구와 호스팅

모든 호스팅이 MySQL 지원해요. 모든 백업 도구가 MySQL 지원해요. 모든 모니터링이 MySQL 지원해요:

  • AWS RDS, Aurora, PlanetScale
  • 관리형 WordPress 호스트
  • cPanel/Plesk 공유 호스팅
  • 역사상 만들어진 모든 ORM과 DB 도구

4. MySQL 8.x 최신 기능

MySQL 8.x가 PostgreSQL과의 격차를 좁혔어요:

-- 윈도우 함수 (드디어!) SELECT name, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank FROM employees; -- CTE (Common Table Expressions) WITH regional_sales AS ( SELECT region, SUM(amount) as total FROM orders GROUP BY region ) SELECT * FROM regional_sales WHERE total > 1000000; -- JSON 개선 SELECT JSON_EXTRACT(config, '$.settings.theme') FROM users;

MySQL이 약한 부분

  • 복잡한 쿼리: 쿼리 플래너가 PostgreSQL보다 최적화 덜 됨
  • 표준 준수: 역사적 괴짜 동작 남아있음 (GROUP BY, 암시적 타입 변환)
  • 고급 타입: 네이티브 배열 타입 없음, PostgreSQL JSONB보다 제한적
  • 확장: PostGIS나 pgvector 같은 건 없음

MongoDB: 문서 데이터베이스

MongoDB는 완전히 다른 니치예요. SQL 데이터베이스 대체재가 아니라, 관계형 모델이 부담이 될 때의 대안이에요.

MongoDB가 잘하는 거

1. 스키마 유연성

데이터 구조가 진짜 예측 불가능할 때:

// 속성이 다른 상품 카탈로그 db.products.insertMany([ { name: "티셔츠", price: 29.99, sizes: ["S", "M", "L", "XL"], colors: ["빨강", "파랑", "검정"] }, { name: "노트북", price: 999.99, specs: { cpu: "M3 Pro", ram: "18GB", storage: "512GB SSD" }, ports: ["USB-C", "HDMI", "MagSafe"] }, { name: "책", price: 24.99, author: "홍길동", isbn: "978-3-16-148410-0", pages: 350 } ]); // 정확한 스키마 모르고 쿼리 db.products.find({ price: { $lt: 50 } });

2. 임베디드 문서

전체 객체 그래프를 함께 읽을 때:

// 댓글 포함 블로그 포스트 - 조인 필요 없음 db.posts.insertOne({ title: "2026년의 MongoDB", author: { name: "홍길동", avatar: "/avatars/hong.jpg" }, content: "...", comments: [ { user: "alice", text: "좋은 글이에요!", likes: 42, replies: [ { user: "bob", text: "동의!" } ] } ], tags: ["database", "nosql", "tutorial"] }); // 단일 쿼리로 필요한 모든 것 반환 db.posts.findOne({ _id: postId });

3. 수평 확장

MongoDB의 샤딩은 내장되어 있고 운영하기 쉬워요:

// 컬렉션 샤딩 sh.shardCollection("mydb.orders", { customer_id: "hashed" }); // MongoDB가 자동으로 샤드에 데이터 분산 // 수동 파티션 관리 필요 없음

진짜 거대한 데이터셋 (수십억 개 문서)의 경우, MongoDB 수평 확장이 PostgreSQL+Citus나 MySQL+Vitess보다 간단해요.

4. 개발자 경험

MongoDB 드라이버는 JS/TS 개발자에게 자연스러워요:

// 자연스러운 JS/TS 통합 const orders = await db.collection('orders') .find({ status: 'pending', createdAt: { $gte: yesterday } }) .sort({ createdAt: -1 }) .limit(50) .toArray(); // 강력한 Aggregation 파이프라인 const salesByRegion = await db.collection('orders') .aggregate([ { $match: { status: 'completed' } }, { $group: { _id: '$region', total: { $sum: '$amount' } } }, { $sort: { total: -1 } } ]) .toArray();

MongoDB가 약한 부분

  • 트랜잭션: 다중 문서 트랜잭션 되지만 SQL DB보다 느림
  • 조인: $lookup 있지만 SQL 조인보다 비효율적
  • 데이터 무결성: 외래 키 없음 = 앱 레벨 일관성 체크 필요
  • 저장 효율: SQL에서 정규화될 데이터가 문서에서 중복됨
  • 복잡한 쿼리: Aggregation 파이프라인이 복잡해질 수 있음

MongoDB 논쟁

솔직한 얘기 하죠: MongoDB는 2010년대 초반에 과대 포장됐어요. 많은 팀이 PostgreSQL이 더 나았을 워크로드에 MongoDB를 써서 고생했고, 유명한 "MongoDB is web scale" 밈이 나왔죠.

MongoDB가 안 맞는 경우:

  • 강한 일관성이 필요한 금융 거래
  • 복잡한 조인이 있는 관계형 데이터
  • 엄격한 데이터 검증이 필요한 앱
  • NoSQL 경험 없는 팀

MongoDB가 맞는 경우:

  • CMS (콘텐츠 관리 시스템)
  • 이벤트 로깅과 분석
  • 속성이 다양한 카탈로그
  • 실시간 데이터 (IoT, 게임, 채팅)
  • 최종 스키마 모르는 프로토타이핑

성능 벤치마크: 진짜 숫자

2024-2025 실제 벤치마크 데이터:

단순 읽기 성능 (ops/초, 높을수록 좋음)

쿼리 타입PostgreSQL 16MySQL 8.4MongoDB 7
포인트 조회 (ID)125,000142,000118,000
범위 쿼리 (1000행)18,50021,20015,800
전문 검색8,2003,1006,500
JSON 쿼리45,00028,00052,000

쓰기 성능 (ops/초, 높을수록 좋음)

작업PostgreSQL 16MySQL 8.4MongoDB 7
단일 삽입32,00038,00042,000
벌크 삽입 (1000개)285,000310,000380,000
ID로 업데이트28,00031,00035,000
트랜잭션 (3 ops)12,00014,0008,500

복잡한 쿼리 성능 (ms, 낮을수록 좋음)

쿼리 타입PostgreSQL 16MySQL 8.4MongoDB 7
5테이블 조인12ms18msN/A*
윈도우 함수8ms15ms45ms**
서브쿼리15ms32msN/A*
집계22ms28ms18ms

*MongoDB는 비정규화 또는 다중 쿼리 필요
**Aggregation 파이프라인으로

핵심 포인트:

  • MySQL이 단순 대용량 읽기에서 승리
  • PostgreSQL이 복잡한 쿼리와 전문 검색에서 승리
  • MongoDB가 문서 작업과 쓰기에서 승리
  • 일반 벤치마크보다 실제 워크로드가 더 중요

그래서 뭘 써야 하나?

PostgreSQL 선택:

  1. 새 앱을 처음부터 만들 때
  2. 데이터가 관계형일 때 (유저→주문→상품)
  3. 복잡한 쿼리, 리포팅, 분석 필요할 때
  4. 하나의 DB로 모든 걸 reasonably 잘 하고 싶을 때
  5. 나중에 지오스페이셜, 전문 검색, 벡터 검색 필요할 수 있을 때
  6. 팀이 SQL 경험 있을 때

MySQL 선택:

  1. WordPress, Drupal 등 PHP 기반 CMS 사용할 때
  2. 호스팅이 MySQL만 지원할 때 (공유 호스팅, 관리형 WP)
  3. 기존 MySQL 전문성과 인프라 있을 때
  4. 워크로드가 주로 단순 읽기일 때 (블로그, 콘텐츠 사이트)
  5. 최소 설정으로 검증된 복제가 필요할 때
  6. MySQL 쓰던 레거시에서 마이그레이션할 때

MongoDB 선택:

  1. 데이터가 진짜 문서 지향적일 때 (CMS, 카탈로그, 로그)
  2. 스키마가 빠르고 예측 불가능하게 바뀔 때
  3. 리전 간 수평 확장이 필요할 때
  4. 팀이 JS 중심이고 JSON 선호할 때
  5. 실시간 앱 만들 때 (IoT, 게임, 채팅)
  6. 프로토타이핑 중이고 최종 스키마 모를 때

여러 DB 같이 쓸 때

많은 프로덕션 시스템이 폴리글랏 퍼시스턴스를 사용해요:

┌─────────────────────────────────────────────────────────┐
│                     애플리케이션                          │
├─────────────────────────────────────────────────────────┤
│  PostgreSQL          │  MongoDB         │  Redis        │
│  ─────────────       │  ────────        │  ─────        │
│  유저                 │  상품 카탈로그    │  세션         │
│  주문                 │  이벤트 로그      │  캐시         │
│  트랜잭션             │  CMS 콘텐츠       │  레이트 리밋   │
└─────────────────────────────────────────────────────────┘

이거 괜찮아요! 각 작업에 맞는 도구를 쓰세요. 다만 작은 앱을 너무 복잡하게 만들진 마세요.

마이그레이션 고려사항

PostgreSQL ↔ MySQL

둘 다 SQL이라서 마이그레이션이 상대적으로 쉬워요:

# MySQL에서 PostgreSQL로 pgloader mysql://user:pass@host/db postgresql://user:pass@host/db # PostgreSQL에서 MySQL로 (더 많은 수작업 필요) pg_dump --no-owner --no-privileges db | mysql db

주요 차이점:

  • AUTO_INCREMENT (MySQL) vs SERIAL (PostgreSQL)
  • 백틱 (MySQL) vs 쌍따옴표 (PostgreSQL) 식별자
  • LIMIT offset, count (MySQL) vs LIMIT count OFFSET offset (PostgreSQL)

SQL에서 MongoDB로

SQL에서 MongoDB 마이그레이션은 스키마 재설계가 필요해요:

-- SQL: 정규화된 구조 SELECT orders.*, customers.name, items.product_name FROM orders JOIN customers ON orders.customer_id = customers.id JOIN order_items items ON items.order_id = orders.id WHERE orders.id = 123;
// MongoDB: 비정규화된 문서 { _id: 123, customer: { id: 1, name: "홍길동" }, items: [ { product_name: "위젯", quantity: 2, price: 10.00 } ], total: 20.00, status: "배송완료" }

이건 단순한 기술 마이그레이션이 아니에요—데이터 모델링 철학의 근본적인 변화예요.

비용 비교 (2026)

관리형 서비스 (월 비용, 비슷한 스펙 기준)

DBAWSGCPAzure
PostgreSQLRDS: $150+Cloud SQL: $140+Azure DB: $145+
MySQLRDS: $145+Cloud SQL: $135+Azure DB: $140+
MongoDBDocumentDB*: $180+Atlas: $200+Cosmos DB: $220+

*DocumentDB는 MongoDB 호환이지, MongoDB 자체가 아님

셀프 호스팅 (무료지만 운영 비용 고려)

세 개 다 오픈소스예요 (MongoDB는 SSPL 라이선스 우려 있음). 하지만 "무료"에는 이게 안 들어가요:

  • DB 관리하는 엔지니어 시간
  • 백업과 복구 인프라
  • 고가용성 설정
  • 보안 패치

경험칙: 전담 DBA가 있거나 비용 제약이 심하지 않다면, 관리형 서비스 쓰세요.

결론: 진짜 추천

여기까지 읽고도 결정 못 하겠다면, 가장 간단한 조언:

PostgreSQL로 시작하세요.

PostgreSQL이 "객관적으로 최고"라서가 아니에요—대부분 앱에서 리스크/보상 비율이 가장 좋아서예요:

  1. 90% 사용 케이스를 잘 처리함
  2. 스케일업해도 제한 없음
  3. 최고의 확장 생태계
  4. 업계 기본값인 데는 이유가 있음
  5. 나중에 언제든 MongoDB나 Redis 추가 가능

MySQL은 PHP 앱과 읽기 중심 워크로드에 여전히 훌륭해요, 이미 전문성 있다면요.

MongoDB는 진짜 문서 지향 데이터거나 빠른 프로토타이핑이 필요할 때 가치 있어요—트레이드오프 알고 들어가세요.

DB 전쟁은 이 시점에서 대부분 부족 싸움이에요. 세 개 다 프로덕션 준비됐고, 실전 검증됐고, 세계 최대 앱들이 돌리고 있어요. 성공은 어떤 DB를 고르느냐보다 그 DB를 어떻게 쓰느냐에 달렸어요.

이제 가서 뭔가 만드세요. DB는 괜찮을 거예요.

databasepostgresqlmysqlmongodbbackendsystem-designweb-development

관련 도구 둘러보기

Pockit의 무료 개발자 도구를 사용해 보세요