Contents
see List📑 목차 (Table of Contents)
1. 개요 및 소개
현대 애플리케이션 개발에서 데이터베이스 선택은 프로젝트의 성공을 좌우하는 핵심 결정 중 하나입니다. 이 문서에서는 가장 널리 사용되는 세 가지 관계형 데이터베이스 관리 시스템(RDBMS)인 MariaDB, Oracle Database, PostgreSQL을 다양한 관점에서 심층 비교합니다.
| 항목 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 개발사 | MariaDB Foundation/Corporation | Oracle Corporation | PostgreSQL Global Development Group |
| 최초 릴리스 | 2009년 | 1979년 | 1996년 (Ingres 기반 1986년) |
| 라이선스 | GPLv2 (오픈소스) | 상용 라이선스 | PostgreSQL License (오픈소스) |
| 작성 언어 | C, C++ | C, C++, Assembly | C |
| 주요 특징 | MySQL 호환, 경량, 빠른 속도 | 엔터프라이즈급, 포괄적 기능 | 표준 준수, 확장성, 고급 기능 |
2. 역사와 발전 배경
🐬 MariaDB의 탄생
MariaDB는 2009년 MySQL의 원 개발자인 Michael "Monty" Widenius가 Oracle의 Sun Microsystems 인수 후 MySQL의 미래에 대한 우려로 시작한 프로젝트입니다. MySQL의 완전한 포크(fork)로 시작하여, 현재는 독자적인 기능들을 다수 추가하며 발전했습니다.
- 2009년: MariaDB 5.1 최초 릴리스
- 2012년: MariaDB 5.5 - MySQL 5.5 기반
- 2013년: MariaDB 10.0 - Galera Cluster 통합
- 2017년: MariaDB 10.2 - 윈도우 함수, JSON 지원
- 2023년: MariaDB 11.x - 성능 개선, 새로운 기능
🔴 Oracle Database의 역사
Oracle은 1977년 Larry Ellison, Bob Miner, Ed Oates가 설립한 SDL(Software Development Laboratories)에서 시작되었습니다. 1979년 상용 RDBMS를 최초로 출시하며 데이터베이스 시장의 선두주자로 자리잡았습니다.
- 1979년: Oracle V2 - 최초 상용 SQL RDBMS
- 1983년: Oracle V3 - C언어로 재작성, 이식성 확보
- 1992년: Oracle 7 - PL/SQL, 트리거, 스토어드 프로시저
- 2001년: Oracle 9i - RAC(Real Application Clusters)
- 2013년: Oracle 12c - 멀티테넌트 아키텍처, In-Memory
- 2023년: Oracle 23c - JSON Relational Duality, AI Vector Search
🐘 PostgreSQL의 진화
PostgreSQL은 1986년 UC Berkeley의 POSTGRES 프로젝트에서 시작되었습니다. Michael Stonebraker 교수가 이끈 이 프로젝트는 객체-관계형 데이터베이스의 선구자였으며, 1996년 오픈소스로 공개되었습니다.
- 1996년: PostgreSQL 6.0 - 오픈소스 공개
- 2005년: PostgreSQL 8.0 - Windows 네이티브 지원
- 2010년: PostgreSQL 9.0 - 스트리밍 복제
- 2016년: PostgreSQL 9.6 - 병렬 쿼리
- 2020년: PostgreSQL 13 - B-tree 중복 제거
- 2024년: PostgreSQL 17 - 증분 백업, JSON 개선
3. 라이선스 및 비용 구조
💰 비용 비교
| 항목 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 기본 라이선스 | 무료 (GPLv2) | 유료 (Named User Plus 또는 Processor) | 무료 (PostgreSQL License) |
| 엔터프라이즈 지원 | MariaDB Enterprise: 연간 $3,000~$15,000+ | Standard: $17,500/프로세서, Enterprise: $47,500/프로세서 | 무료 (EnterpriseDB 등 유료 지원 선택 가능) |
| 추가 옵션 비용 | 일부 고급 기능 유료 | RAC, Partitioning, Advanced Security 등 별도 과금 | 모든 기능 무료 |
| 숨겨진 비용 | 낮음 | 높음 (라이선스 감사, 추가 옵션) | 매우 낮음 |
Oracle 라이선스의 복잡성
Oracle 라이선스는 업계에서 가장 복잡하고 비용이 높은 것으로 알려져 있습니다:
- 프로세서 라이선스: CPU 코어 수 × Core Factor로 계산
- 가상화 환경: VMware 등에서 전체 클러스터 라이선스 필요할 수 있음
- 클라우드 환경: BYOL(Bring Your Own License) 정책 복잡
- 라이선스 감사: Oracle의 정기 감사로 예상치 못한 비용 발생 가능
- 라이선스 비용 없음
- 벤더 종속성 최소화
- 커뮤니티 지원 활발
- 클라우드 환경에서 유연한 배포
4. 아키텍처 비교
MariaDB 아키텍처
MariaDB의 핵심 특징:
- 플러거블 스토리지 엔진: InnoDB, Aria, MyRocks, ColumnStore 등 선택 가능
- Thread Pool: 대규모 동시 연결 처리에 효율적
- Query Cache: 반복 쿼리 성능 향상 (10.1.7 이후 기본 비활성화)
Oracle 아키텍처
Oracle의 핵심 특징:
- SGA/PGA 메모리 구조: 정교한 메모리 관리
- 백그라운드 프로세스: 전용 프로세스로 각 기능 담당
- 멀티테넌트: 하나의 CDB에 여러 PDB 운영 가능
- RAC: 여러 노드에서 단일 데이터베이스 공유
PostgreSQL 아키텍처
PostgreSQL의 핵심 특징:
- 프로세스 기반: 각 연결마다 별도 백엔드 프로세스
- MVCC: 튜플 버전 관리로 동시성 제어
- WAL(Write-Ahead Logging): 데이터 무결성 보장
- 확장성: 사용자 정의 타입, 함수, 연산자 추가 가능
5. 성능 및 확장성
벤치마크 비교 (TPC-C 기준 상대적 성능)
| 워크로드 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 단순 SELECT | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 복잡한 JOIN | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| OLTP (트랜잭션) | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| OLAP (분석) | ⭐⭐⭐ (ColumnStore 시 ⭐⭐⭐⭐) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 동시 사용자 처리 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 대용량 데이터 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
확장성 비교
| 확장 방식 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 수직 확장 (Scale-Up) | 최대 수백 GB RAM | 수 TB RAM, 수천 코어 | 수백 GB RAM |
| 수평 확장 (Scale-Out) | Galera Cluster, MaxScale | RAC, Sharding | Citus, Patroni, pgpool-II |
| 읽기 확장 | 비동기 복제, Galera | Active Data Guard | 스트리밍 복제, 논리적 복제 |
| 파티셔닝 | Range, List, Hash, Key | 모든 유형 + Composite | Range, List, Hash (선언적) |
6. 데이터 타입 비교
기본 데이터 타입
| 용도 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 정수 | TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT | NUMBER(p), INTEGER | SMALLINT, INTEGER, BIGINT |
| 실수 | FLOAT, DOUBLE, DECIMAL | NUMBER(p,s), BINARY_FLOAT, BINARY_DOUBLE | REAL, DOUBLE PRECISION, NUMERIC |
| 문자열 | CHAR, VARCHAR, TEXT | CHAR, VARCHAR2, CLOB | CHAR, VARCHAR, TEXT |
| 날짜/시간 | DATE, TIME, DATETIME, TIMESTAMP | DATE, TIMESTAMP, INTERVAL | DATE, TIME, TIMESTAMP, INTERVAL |
| 이진 | BINARY, VARBINARY, BLOB | RAW, BLOB, BFILE | BYTEA |
| JSON | JSON (10.2+) | JSON (12c+), BLOB | JSON, JSONB |
| 배열 | 미지원 | VARRAY, Nested Table | ARRAY (모든 타입) |
| UUID | UUID() 함수 | SYS_GUID() | UUID 타입 |
PostgreSQL 고급 데이터 타입
PostgreSQL은 가장 풍부한 데이터 타입을 제공합니다:
- 범위 타입: INT4RANGE, TSRANGE, DATERANGE 등
- 기하학 타입: POINT, LINE, POLYGON, CIRCLE
- 네트워크 타입: INET, CIDR, MACADDR
- 전문 검색: TSVECTOR, TSQUERY
7. SQL 문법 차이
페이징 쿼리
문자열 연결
UPSERT (INSERT OR UPDATE)
8. 트랜잭션 및 동시성 제어
격리 수준 (Isolation Levels)
| 격리 수준 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| READ UNCOMMITTED | ✅ 지원 | ❌ 미지원 | ✅ (READ COMMITTED로 처리) |
| READ COMMITTED | ✅ 지원 | ✅ 기본값 | ✅ 기본값 |
| REPEATABLE READ | ✅ 기본값 (InnoDB) | ❌ 미지원 | ✅ 지원 |
| SERIALIZABLE | ✅ 지원 | ✅ 지원 | ✅ 지원 (SSI) |
MVCC 구현 차이
MariaDB (InnoDB): Undo 로그를 사용하여 이전 버전 재구성. 롤백 세그먼트에서 관리.
Oracle: Undo 테이블스페이스에 이전 이미지 저장. SCN(System Change Number) 기반 일관성.
PostgreSQL: 튜플 자체에 버전 정보 저장 (xmin, xmax). VACUUM으로 죽은 튜플 정리.
9. 고가용성 및 복제
복제 옵션 비교
| 복제 유형 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 비동기 복제 | ✅ 기본 복제 | ✅ Data Guard | ✅ 스트리밍 복제 |
| 동기 복제 | ✅ Semi-sync, Galera | ✅ Data Guard Sync | ✅ 동기 복제 |
| 논리적 복제 | ✅ Binlog 기반 | ✅ GoldenGate, Streams | ✅ Logical Replication |
| 멀티마스터 | ✅ Galera Cluster | ✅ RAC, GoldenGate | ⚠️ BDR (서드파티) |
자동 장애 조치
| 솔루션 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 내장 기능 | Galera (자동) | Data Guard Broker | pg_rewind |
| 외부 도구 | MaxScale, MHA | RAC, Clusterware | Patroni, repmgr, pgpool-II |
10. 보안 기능
인증 방식
| 인증 방법 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 암호 기반 | ✅ mysql_native_password, ed25519 | ✅ Password | ✅ md5, scram-sha-256 |
| OS 인증 | ✅ unix_socket | ✅ OS Authentication | ✅ peer, ident |
| LDAP | ✅ (Enterprise) | ✅ | ✅ |
| Kerberos | ✅ GSSAPI | ✅ | ✅ GSSAPI |
암호화
| 암호화 유형 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 전송 암호화 (TLS) | ✅ | ✅ | ✅ |
| 저장 암호화 (TDE) | ✅ (10.1+) | ✅ (Advanced Security 옵션) | ⚠️ pgcrypto, 서드파티 |
| 컬럼 수준 암호화 | ✅ AES_ENCRYPT/DECRYPT | ✅ DBMS_CRYPTO | ✅ pgcrypto |
11. 관리 도구 및 에코시스템
공식 관리 도구
| 기능 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| CLI | mysql, mariadb | SQL*Plus, SQLcl | psql |
| GUI 관리 | - | Enterprise Manager, SQL Developer | pgAdmin |
| 백업 도구 | mariabackup, mysqldump | RMAN, Data Pump | pg_dump, pg_basebackup |
| 모니터링 | Performance Schema | AWR, ASH, ADDM | pg_stat_* 뷰 |
공통 서드파티 도구: DBeaver, DataGrip, HeidiSQL, Navicat
12. 클라우드 지원
주요 클라우드 서비스
| 클라우드 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| AWS | RDS for MariaDB | RDS for Oracle | RDS, Aurora PostgreSQL |
| Azure | Azure Database for MariaDB | Oracle on Azure | Azure Database for PostgreSQL |
| GCP | Cloud SQL for MySQL | Bare Metal Solution | Cloud SQL for PostgreSQL, AlloyDB |
| 전용 클라우드 | SkySQL (MariaDB) | OCI (Oracle Cloud) | Crunchy Bridge, Neon, Supabase |
13. 마이그레이션 고려사항
Oracle → PostgreSQL 마이그레이션
- VARCHAR2 → VARCHAR 또는 TEXT
- NUMBER → NUMERIC, INTEGER, BIGINT
- SYSDATE → CURRENT_TIMESTAMP 또는 NOW()
- NVL() → COALESCE()
- DECODE() → CASE WHEN
- 시퀀스: NEXTVAL → nextval('seq_name')
- ROWNUM → ROW_NUMBER() OVER() 또는 LIMIT
MySQL/MariaDB → PostgreSQL 마이그레이션
- AUTO_INCREMENT → SERIAL 또는 IDENTITY
- TINYINT(1) → BOOLEAN
- ENUM → 체크 제약 또는 별도 테이블
- ON DUPLICATE KEY UPDATE → ON CONFLICT DO UPDATE
- 백틱(`) → 큰따옴표(") 또는 제거
- IFNULL() → COALESCE()
마이그레이션 도구
| 방향 | 추천 도구 |
|---|---|
| Oracle → PostgreSQL | ora2pg, AWS SCT, pgLoader |
| MySQL/MariaDB → PostgreSQL | pgLoader, AWS DMS |
| Oracle → MariaDB | AWS SCT, MariaDB Migration Tool |
14. 사용 사례별 추천
🏢 엔터프라이즈 / 미션 크리티컬
- 24/7 가동, SLA 99.999%: Oracle RAC - 검증된 고가용성
- 복잡한 트랜잭션: Oracle PostgreSQL
- 규정 준수 (금융, 의료): Oracle - 포괄적 보안, 감사 기능
🚀 스타트업 / 웹 애플리케이션
- 빠른 개발, 저비용: MariaDB PostgreSQL
- WordPress, PHP 앱: MariaDB - MySQL 호환
- Rails, Django 앱: PostgreSQL - 프레임워크 기본 지원
📊 데이터 분석 / OLAP
- 대규모 데이터 웨어하우스: Oracle - 파티셔닝, In-Memory
- 중소규모 분석: PostgreSQL - 병렬 쿼리
- 컬럼 기반 분석: MariaDB ColumnStore
🌐 지리공간 데이터
- 고급 GIS 기능: PostgreSQL + PostGIS - 가장 강력한 오픈소스 GIS
- 엔터프라이즈 GIS: Oracle Spatial
📋 15. 종합 요약
한눈에 보는 비교
| 평가 항목 | MariaDB | Oracle | PostgreSQL |
|---|---|---|---|
| 비용 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 성능 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 기능 풍부함 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 확장성 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 사용 편의성 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 커뮤니티 지원 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 클라우드 지원 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
🎯 최종 선택 가이드
MariaDB를 선택해야 할 때: MySQL 호환성 필요, 빠르고 가벼운 DB, PHP 기반 CMS, Galera 멀티마스터
Oracle을 선택해야 할 때: 엔터프라이즈급 지원/SLA, 기존 Oracle 시스템 통합, RAC 고가용성, 복잡한 PL/SQL
PostgreSQL을 선택해야 할 때: 오픈소스+엔터프라이즈 기능, 복잡한 쿼리/데이터 무결성, 고급 데이터 타입, SQL 표준 준수
💡 핵심 결론
데이터베이스 선택은 프로젝트의 요구사항, 예산, 팀의 역량, 장기적인 확장 계획을 종합적으로 고려해야 합니다. 세 데이터베이스 모두 각자의 강점이 있으며, "최고의 데이터베이스"는 존재하지 않습니다. 오직 "프로젝트에 가장 적합한 데이터베이스"만 있을 뿐입니다.