C.W.K.
Stream
Lesson 05 of 10 · published

PostgreSQL 의 강점 한 페이지

~15 min · foundations, features

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

날 세운 스위스 아미 나이프

대부분 DB 는 한 길 골라. PostgreSQL 은 거부해. 같은 엔진이 OLTP 워크로드 돌리면서 document 스토리지, full-text search, geospatial 쿼리, vector similarity, analytical aggregation 까지 다 처리. 적정 사이즈로 돌아가는 Postgres 한 인스턴스가 많은 아키텍처에서 특화 시스템 서너 개를 대체할 수 있고, operational story 도 네 개가 아니라 한 개면 돼.

헤드라인

  • JSONB — B-tree, GIN, expression 인덱스 다 되는 document 스토리지. JSON 안 쿼리가 first-class.
  • Full-text searchtsvector, tsquery, ranking, 다국어 stemming. Elasticsearch 안 끌어와도 되는 경우가 대부분.
  • 풍부한 타입 시스템 — array, enum, range, custom composite, generated column.
  • Window function, CTE, lateral join, MERGE — 모든 모던 SQL 기능, 보통 경쟁자보다 먼저.
  • Extension — PostGIS (geo), pgvector (AI 임베딩), TimescaleDB (시계열), pg_trgm (퍼지), pg_stat_statements (쿼리 텔레메트리).
  • Logical replication — 클러스터 전체 아니라 테이블 단위 복제. 버전 간 blue/green 마이그레이션 가능.

조용한 슈퍼파워

LISTEN/NOTIFY 가 Postgres 를 저용량 메시지 버스로 만들어. Row-level security 가 multi-tenant 룰을 DB 안으로. EXCLUDE 제약이 스케줄링 앱의 range 겹침 방지. 각각이 외부 의존성 하나씩 + 그 운영 비용을 지워줘.

Code

JSONB + 인덱스 + 쿼리 + 집계·sql
CREATE TABLE events (
    id         INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    occurred_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    data       JSONB NOT NULL
);

CREATE INDEX events_data_gin ON events USING gin (data);

INSERT INTO events (data) VALUES
('{"type":"click","page":"/home"}'),
('{"type":"click","page":"/blog"}'),
('{"type":"signup","plan":"pro"}');

SELECT data->>'page' AS page, COUNT(*)
FROM   events
WHERE  data @> '{"type":"click"}'
GROUP  BY 1;
Full-text search + ranking·sql
SELECT id, title,
       ts_rank(to_tsvector('english', body),
               to_tsquery('english', 'postgres & performance')) AS score
FROM   articles
WHERE  to_tsvector('english', body)
       @@ to_tsquery('english', 'postgres & performance')
ORDER  BY score DESC
LIMIT  10;
Range 타입이 더블 부킹 막음·sql
CREATE TABLE bookings (
    room    TEXT NOT NULL,
    during  TSRANGE NOT NULL,
    EXCLUDE USING gist (room WITH =, during WITH &&)
);
-- 같은 방 시간 겹치는 두 예약: INSERT 에서 거절.

External links

Exercise

현재 스택의 외부 의존성 하나 골라 (Redis cache, Elasticsearch index, vector DB, message queue). PostgreSQL 기능/extension 으로 대체하면 어떤 모양일지 스케치. trade-off 솔직하게 — 가끔은 '둘 다 유지' 가 정답이지만, 그 이유는 알아야 함.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.