DB Study

1장. PostgreSQL 개요와 철학

"가장 앞선 오픈소스 RDBMS"라는 평가는 마케팅이 아니라 30년 설계 결정의 누적입니다. PostgreSQL이 무엇이고, 왜 그렇게 만들어졌는지부터 시작합니다.

기초 ⏱ 약 20분 🎬 애니메이션 2개 선수 지식: SQL 기본 문법
🧭
이 장에서 배우는 것

① PostgreSQL의 정체(ORDBMS)와 Berkeley 기원 ② 세 가지 설계 가치 — 표준 준수·확장성·신뢰성 ③ MySQL·Oracle·ClickHouse와 갈라지는 지점 ④ "선택할 이유" 일곱 가지와 릴리즈 정책

1.1 PostgreSQL은 무엇인가 — "객체-관계형"의 의미

PostgreSQL은 객체-관계형 데이터베이스 관리 시스템(ORDBMS)입니다. 그냥 RDBMS가 아니라 앞에 "객체"가 붙는 이유는, 처음부터 사용자 정의 타입·함수·연산자·인덱스를 일급 시민으로 다루도록 설계되었기 때문입니다. 쉽게 말해 "DB 엔진이 모르는 데이터도 규칙만 알려주면 저장·검색·인덱싱해 주는" 구조입니다.

역사도 짧지 않습니다.

Stonebraker의 목표였던 "관계형 모델 + 객체 지향적 확장성"이라는 유산이 오늘날의 Extension 모델, 함수형 인덱스, 사용자 정의 타입의 뿌리입니다.

1.2 타협 없는 ACID — DDL도 롤백된다

PostgreSQL은 ACID(원자성·일관성·격리성·내구성)를 완전히 준수합니다. 특히 인상적인 부분은 DDL(스키마 변경)조차 트랜잭션 안에서 되돌릴 수 있다는 점입니다. MySQL에서는 DDL이 묵시적 커밋을 일으키기 때문에 불가능한 일이죠. 아래 애니메이션으로 그 차이를 확인해 보세요.

🧾 트랜잭션 (BEGIN … ) BEGIN; CREATE TABLE orders … 📦 orders 테이블 (아직 이 트랜잭션에만 보임) ALTER TABLE … ADD COLUMN + created_at 컬럼 ROLLBACK; 💨 테이블·컬럼 모두 소멸! 아무 일도 없었다 CREATE도 ALTER도 흔적 없이 원상 복구 MySQL이라면? CREATE TABLE 시점에 묵시적 COMMIT — 롤백 불가
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 Parser · Planner · Executor · Storage(Heap+WAL) CREATE EXTENSION pgvector; 🗺 PostGIS (공간) 📊 pg_stat_statements (쿼리 통계) ⏱ TimescaleDB 🙋 사용자 정의 계층 CREATE TYPE · CREATE FUNCTION(PL/pgSQL·PL/Python) · CREATE OPERATOR Core는 작고 안정적으로 유지 — 기능은 이 위에 얹는다
-- 한 줄씩이 곧 "새 기능 설치"
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로 시작하라"는 업계 격언의 근거죠.

항목PostgreSQLMySQL(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로 용도 자체가 다릅니다.

⚠️
Heap 구조는 양날의 검

PostgreSQL의 모든 인덱스는 대등하게 heap을 참조하므로 secondary index 조회가 MySQL보다 유리합니다. 반면 UPDATE가 새 튜플을 만들기 때문에 VACUUM 운영(8장)이 필수가 됩니다. 이 트레이드오프가 3·4·8장의 배경입니다.

1.5 PostgreSQL을 선택할 일곱 가지 이유

  1. Extension 생태계 — PostGIS, TimescaleDB, pgvector, Citus, pg_trgm…
  2. 풍부한 기본 타입JSONB, UUID, ARRAY, RANGE, INET, TSVECTOR 등이 네이티브.
  3. 6종 인덱스 — B-tree 외에 Hash·GIN·GiST·SP-GiST·BRIN(5장 상세).
  4. 강력한 SQL 표현력 — CTE·Recursive·Window·LATERAL.
  5. Row-Level Security — SaaS 멀티테넌시의 표준 패턴.
  6. 함수형·부분 인덱스 — 인덱스를 "조건부·표현식 기반"으로.
  7. 다중 프로시저 언어 — 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년 주기

🧭
운영 원칙

프로덕션에는 최신 메이저에서 하나 뒤(예: 18 출시 시 17)를 쓰는 편이 보수적입니다. 단, 마이너 버전은 항상 최신으로 유지하세요 — 보안 패치 누락은 금물입니다.

✍️ 이해도 체크

PostgreSQL에서 BEGIN; CREATE TABLE t (...); ROLLBACK;을 실행하면 어떻게 될까요?
✅ PostgreSQL은 DDL도 트랜잭션에 포함되므로 ROLLBACK 시 CREATE TABLE까지 전부 되돌아갑니다. MySQL이라면 CREATE TABLE 시점에 묵시적 커밋이 발생해 테이블이 남습니다. 이 차이가 마이그레이션 도구의 안전성을 좌우합니다.
PostgreSQL의 확장성(Extensibility) 모델에 대한 설명으로 옳은 것은?
✅ Core / Extension / 사용자 정의의 3계층 구조 덕분에 CREATE EXTENSION 한 줄로 PostGIS(공간 타입+인덱스), pgvector(벡터 타입+인덱스) 같은 깊은 수준의 기능이 추가됩니다. 이것이 Berkeley POSTGRES 시절부터 이어진 "객체-관계형" 설계의 유산입니다.
📚
원문으로 더 깊이

이 장의 원문 문서: chapters/ch01_postgresql_overview.md — SQL 표준 준수 세부 항목, MySQL·Oracle·SQLite 비교표 전체, 릴리즈 정책 상세가 담겨 있습니다.