1장. PostgreSQL 개요와 철학
"가장 앞선 오픈소스 RDBMS"라는 평가는 마케팅이 아니라 30년 설계 결정의 누적입니다. PostgreSQL이 무엇이고, 왜 그렇게 만들어졌는지부터 시작합니다.
① PostgreSQL의 정체(ORDBMS)와 Berkeley 기원 ② 세 가지 설계 가치 — 표준 준수·확장성·신뢰성 ③ MySQL·Oracle·ClickHouse와 갈라지는 지점 ④ "선택할 이유" 일곱 가지와 릴리즈 정책
1.1 PostgreSQL은 무엇인가 — "객체-관계형"의 의미
PostgreSQL은 객체-관계형 데이터베이스 관리 시스템(ORDBMS)입니다. 그냥 RDBMS가 아니라 앞에 "객체"가 붙는 이유는, 처음부터 사용자 정의 타입·함수·연산자·인덱스를 일급 시민으로 다루도록 설계되었기 때문입니다. 쉽게 말해 "DB 엔진이 모르는 데이터도 규칙만 알려주면 저장·검색·인덱싱해 주는" 구조입니다.
역사도 짧지 않습니다.
- 1986년 — UC Berkeley의 Michael Stonebraker가 이끄는 POSTGRES 프로젝트로 출발.
- 1994년 — SQL 인터프리터가 추가되어 Postgres95로 공개.
- 1996년 — 오픈소스 커뮤니티로 이관되며 지금의 이름 PostgreSQL이 됨.
- 2026년 현재 — PostgreSQL 18(2025-09 릴리스)이 최신 안정 버전, 17도 주요 운영 라인.
Stonebraker의 목표였던 "관계형 모델 + 객체 지향적 확장성"이라는 유산이 오늘날의 Extension 모델, 함수형 인덱스, 사용자 정의 타입의 뿌리입니다.
1.2 타협 없는 ACID — DDL도 롤백된다
PostgreSQL은 ACID(원자성·일관성·격리성·내구성)를 완전히 준수합니다. 특히 인상적인 부분은 DDL(스키마 변경)조차 트랜잭션 안에서 되돌릴 수 있다는 점입니다. MySQL에서는 DDL이 묵시적 커밋을 일으키기 때문에 불가능한 일이죠. 아래 애니메이션으로 그 차이를 확인해 보세요.
BEGIN으로 트랜잭션을 엽니다. 지금부터 일어나는 모든 일은 "가계약" 상태입니다.
CREATE TABLE을 실행합니다. 테이블이 만들어지지만 아직 이 트랜잭션 안에서만 보이는 상태입니다.
ALTER TABLE로 컬럼도 추가합니다. 스키마 변경(DDL)이 트랜잭션 안에 차곡차곡 쌓입니다.
문제가 생겨 ROLLBACK! 데이터 변경뿐 아니라 CREATE·ALTER까지 전부 되돌아갑니다.
결과: 아무 일도 없었던 것처럼 깨끗합니다. 이 성질 덕분에 Flyway·Alembic 같은 마이그레이션 도구가 "실패하면 전부 롤백"이라는 안전한 전략을 쓸 수 있습니다.
BEGIN;
CREATE TABLE orders (id bigserial PRIMARY KEY, amount numeric);
ALTER TABLE orders ADD COLUMN created_at timestamptz DEFAULT now();
-- 뭔가 잘못됐다면? ROLLBACK 한 번으로 CREATE까지 전부 되돌림
ROLLBACK;
1.3 세 가지 설계 가치 — 표준 준수 · 확장성 · 신뢰성
PostgreSQL 커뮤니티가 공개적으로 내세우는 가치는 세 가지입니다.
📐 SQL 표준 준수
SQL:2023까지의 주요 기능을 선도적으로 구현. Window Function(8.4부터), CTE·Recursive CTE, LATERAL JOIN, SQL/JSON 경로 표현식 모두 표준을 따릅니다.
🧩 확장성
커널을 고치지 않고 타입·연산자·함수·인덱스 access method를 추가할 수 있는 구조. CREATE EXTENSION 한 줄이 그 정점입니다.
🛡 신뢰성
"데이터는 절대 잃지 않는다." WAL 기반 내구성, fsync·full_page_writes 기본 ON, 체크섬 옵션(initdb -k)까지.
예를 들어 full_page_writes는 WAL 크기를 키우지만, 끄면 정전 시 페이지가 반쯤만 기록되는 torn page 위험이 있습니다. PostgreSQL은 이런 상황에서 항상 안전한 쪽을 기본값으로 택합니다.
확장성의 실체 — 3계층 구조
확장성이 어떻게 동작하는지 애니메이션으로 봅시다. 핵심은 작고 안정적인 Core 위에, 커널 수정 없이 기능이 얹히는 그림입니다.
맨 아래에 PostgreSQL Core가 있습니다. 파서·플래너·실행기·스토리지 엔진 — 작고 안정적으로 유지되는 심장부입니다.
CREATE EXTENSION pgvector; 한 줄로 벡터 검색(AI 임베딩) 기능이 추가됩니다. 커널 코드는 한 줄도 바꾸지 않았습니다.
같은 방식으로 PostGIS(지리정보), pg_stat_statements(쿼리 통계), TimescaleDB(시계열)… 거대한 생태계가 Core 위에 얹힙니다.
맨 위에는 사용자 정의 계층 — CREATE TYPE·CREATE FUNCTION·CREATE OPERATOR로 여러분의 코드도 같은 구조에 참여합니다. 이 3계층이 PostgreSQL 유연성의 정체입니다.
-- 한 줄씩이 곧 "새 기능 설치"
CREATE EXTENSION pg_stat_statements; -- 쿼리 성능 분석
CREATE EXTENSION pg_trgm; -- 유사도 검색
CREATE EXTENSION postgis; -- 지리정보
CREATE EXTENSION pgvector; -- 벡터 임베딩(AI/ML)
CREATE EXTENSION pgcrypto; -- 암호화
1.4 다른 DB와 어디서 갈라지나
모든 데이터베이스는 OLTP(단건 트랜잭션) ↔ OLAP(분석) 스펙트럼 위에 놓입니다. PostgreSQL은 OLTP 중앙에 있으면서 가벼운 분석까지 수용하는 범용(general-purpose) 포지션입니다. "일단 PostgreSQL로 시작하라"는 업계 격언의 근거죠.
| 항목 | PostgreSQL | MySQL(InnoDB) |
|---|---|---|
| MVCC 구현 | In-heap 다중 버전 (새 버전을 테이블에 append) | Undo log (변경 전 이미지를 별도 영역에) |
| UPDATE 비용 | 새 버전 생성 → Bloat → VACUUM 필요 | Undo 영역 기록 → 주기적 purge |
| DDL 트랜잭션 | 완전 지원 | 대부분 묵시적 커밋(8.0 Atomic DDL로 개선) |
| 기본 저장 구조 | Heap + B-tree (모든 인덱스가 대등) | Clustered index (PK가 곧 데이터 순서) |
| 표준 준수도 | 매우 높음 | 느슨한 편 |
Oracle과 비교하면 라이선스(무료 BSD 유사 vs 상용)와 RAC(공유 디스크 클러스터)의 부재가 가장 큰 차이입니다. ClickHouse는 아예 범주가 다릅니다 — 컬럼형 OLAP 전용이라 "둘 중 하나"가 아니라 서비스는 PostgreSQL, 분석은 ClickHouse로 둘 다 쓰는 아키텍처가 표준입니다. SQLite는 서버리스 임베디드 DB로 용도 자체가 다릅니다.
PostgreSQL의 모든 인덱스는 대등하게 heap을 참조하므로 secondary index 조회가 MySQL보다 유리합니다. 반면 UPDATE가 새 튜플을 만들기 때문에 VACUUM 운영(8장)이 필수가 됩니다. 이 트레이드오프가 3·4·8장의 배경입니다.
1.5 PostgreSQL을 선택할 일곱 가지 이유
- Extension 생태계 — PostGIS, TimescaleDB, pgvector, Citus, pg_trgm…
- 풍부한 기본 타입 —
JSONB,UUID,ARRAY,RANGE,INET,TSVECTOR등이 네이티브. - 6종 인덱스 — B-tree 외에 Hash·GIN·GiST·SP-GiST·BRIN(5장 상세).
- 강력한 SQL 표현력 — CTE·Recursive·Window·LATERAL.
- Row-Level Security — SaaS 멀티테넌시의 표준 패턴.
- 함수형·부분 인덱스 — 인덱스를 "조건부·표현식 기반"으로.
- 다중 프로시저 언어 — PL/pgSQL, PL/Python, C 함수까지.
-- (5) RLS: 쿼리마다 WHERE tenant_id를 안 붙여도 격리가 강제된다
ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON orders
USING (tenant_id = current_setting('app.current_tenant')::int);
-- (6) 부분 인덱스: "활성 사용자만" 인덱싱 → 크기·쓰기 비용 절감
CREATE INDEX idx_active_users ON users (created_at)
WHERE status = 'active';
1.6 버전과 릴리즈 정책 — 예측 가능한 1년 주기
- 메이저 버전: 매년 9~10월 출시 (예: 16 → 17 → 18).
- 지원 기간: 각 메이저 버전은 최초 릴리즈 후 5년 지원, 이후 EOL.
- 마이너 버전: 분기별 버그·보안 수정. 재시작만 필요, dump/restore 불필요.
- 메이저 업그레이드:
pg_upgrade로 in-place, 또는 logical replication으로 무중단.
프로덕션에는 최신 메이저에서 하나 뒤(예: 18 출시 시 17)를 쓰는 편이 보수적입니다. 단, 마이너 버전은 항상 최신으로 유지하세요 — 보안 패치 누락은 금물입니다.
✍️ 이해도 체크
BEGIN; CREATE TABLE t (...); ROLLBACK;을 실행하면 어떻게 될까요?CREATE EXTENSION 한 줄로 PostGIS(공간 타입+인덱스), pgvector(벡터 타입+인덱스) 같은 깊은 수준의 기능이 추가됩니다. 이것이 Berkeley POSTGRES 시절부터 이어진 "객체-관계형" 설계의 유산입니다.이 장의 원문 문서: chapters/ch01_postgresql_overview.md — SQL 표준 준수 세부 항목, MySQL·Oracle·SQLite 비교표 전체, 릴리즈 정책 상세가 담겨 있습니다.