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)로 시작하여, 현재는 독자적인 기능들을 다수 추가하며 발전했습니다.

MariaDB 주요 마일스톤:
  • 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를 최초로 출시하며 데이터베이스 시장의 선두주자로 자리잡았습니다.

Oracle 주요 마일스톤:
  • 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년 오픈소스로 공개되었습니다.

PostgreSQL 주요 마일스톤:
  • 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 라이선스는 업계에서 가장 복잡하고 비용이 높은 것으로 알려져 있습니다:

⚠️ Oracle 라이선스 주의사항:
  • 프로세서 라이선스: CPU 코어 수 × Core Factor로 계산
  • 가상화 환경: VMware 등에서 전체 클러스터 라이선스 필요할 수 있음
  • 클라우드 환경: BYOL(Bring Your Own License) 정책 복잡
  • 라이선스 감사: Oracle의 정기 감사로 예상치 못한 비용 발생 가능
✅ 오픈소스(MariaDB/PostgreSQL) 장점:
  • 라이선스 비용 없음
  • 벤더 종속성 최소화
  • 커뮤니티 지원 활발
  • 클라우드 환경에서 유연한 배포

4. 아키텍처 비교

MariaDB 아키텍처

┌─────────────────────────────────────────┐ │ Connection Layer │ │ (Thread Pool, Connection Handler) │ ├─────────────────────────────────────────┤ │ SQL Layer │ │ (Parser, Optimizer, Query Cache) │ ├─────────────────────────────────────────┤ │ Storage Engine Layer │ │ ┌─────────┬─────────┬─────────────┐ │ │ │ InnoDB │ Aria │ ColumnStore │ │ │ │(Default)│ (MyISAM │ (Columnar) │ │ │ │ │ 대체) │ │ │ │ └─────────┴─────────┴─────────────┘ │ └─────────────────────────────────────────┘

MariaDB의 핵심 특징:

  • 플러거블 스토리지 엔진: InnoDB, Aria, MyRocks, ColumnStore 등 선택 가능
  • Thread Pool: 대규모 동시 연결 처리에 효율적
  • Query Cache: 반복 쿼리 성능 향상 (10.1.7 이후 기본 비활성화)

Oracle 아키텍처

┌─────────────────────────────────────────────┐ │ Oracle Instance │ │ ┌─────────────────────────────────────┐ │ │ │ SGA (System Global Area) │ │ │ │ ┌────────┬─────────┬────────────┐ │ │ │ │ │ Buffer │ Shared │ Large │ │ │ │ │ │ Cache │ Pool │ Pool │ │ │ │ │ └────────┴─────────┴────────────┘ │ │ │ │ ┌────────┬─────────┬────────────┐ │ │ │ │ │ Redo │ Java │ Streams │ │ │ │ │ │ Buffer │ Pool │ Pool │ │ │ │ │ └────────┴─────────┴────────────┘ │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ Background Processes │ │ │ │ (PMON, SMON, DBWn, LGWR, CKPT) │ │ │ └─────────────────────────────────────┘ │ ├─────────────────────────────────────────────┤ │ Oracle Database │ │ (Datafiles, Control Files, Redo Logs) │ └─────────────────────────────────────────────┘

Oracle의 핵심 특징:

  • SGA/PGA 메모리 구조: 정교한 메모리 관리
  • 백그라운드 프로세스: 전용 프로세스로 각 기능 담당
  • 멀티테넌트: 하나의 CDB에 여러 PDB 운영 가능
  • RAC: 여러 노드에서 단일 데이터베이스 공유

PostgreSQL 아키텍처

┌─────────────────────────────────────────────┐ │ PostgreSQL Server │ │ ┌─────────────────────────────────────┐ │ │ │ Shared Memory │ │ │ │ ┌────────┬─────────┬────────────┐ │ │ │ │ │Shared │ WAL │ CLOG │ │ │ │ │ │Buffers │ Buffers │ │ │ │ │ │ └────────┴─────────┴────────────┘ │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ Backend Processes │ │ │ │ (하나의 연결 = 하나의 프로세스) │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ Background Workers │ │ │ │ (Autovacuum, WAL Writer, etc.) │ │ │ └─────────────────────────────────────┘ │ ├─────────────────────────────────────────────┤ │ Storage Layer │ │ (Heap Files, TOAST, Indexes) │ └─────────────────────────────────────────────┘

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 문법 차이

페이징 쿼리

-- MariaDB / MySQL SELECT * FROM employees ORDER BY employee_id LIMIT 10 OFFSET 20; -- Oracle (12c 이상) SELECT * FROM employees ORDER BY employee_id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; -- Oracle (11g 이하) - ROWNUM 사용 SELECT * FROM ( SELECT e.*, ROWNUM rn FROM ( SELECT * FROM employees ORDER BY employee_id ) e WHERE ROWNUM <= 30 ) WHERE rn > 20; -- PostgreSQL SELECT * FROM employees ORDER BY employee_id LIMIT 10 OFFSET 20;

문자열 연결

-- MariaDB SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; -- Oracle SELECT first_name || ' ' || last_name AS full_name FROM employees; -- PostgreSQL (둘 다 지원) SELECT first_name || ' ' || last_name AS full_name FROM employees; SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

UPSERT (INSERT OR UPDATE)

-- MariaDB INSERT INTO users (id, name, email) VALUES (1, 'John', 'john@example.com') ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email); -- Oracle (MERGE) MERGE INTO users t USING (SELECT 1 as id, 'John' as name FROM DUAL) s ON (t.id = s.id) WHEN MATCHED THEN UPDATE SET t.name = s.name WHEN NOT MATCHED THEN INSERT (id, name) VALUES (s.id, s.name); -- PostgreSQL INSERT INTO users (id, name, email) VALUES (1, 'John', 'john@example.com') ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email;

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 표준 준수

💡 핵심 결론

데이터베이스 선택은 프로젝트의 요구사항, 예산, 팀의 역량, 장기적인 확장 계획을 종합적으로 고려해야 합니다. 세 데이터베이스 모두 각자의 강점이 있으며, "최고의 데이터베이스"는 존재하지 않습니다. 오직 "프로젝트에 가장 적합한 데이터베이스"만 있을 뿐입니다.