본문 바로가기
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

한 엔진으로 넓은 문제를 푼다

많은 데이터베이스는 잘하는 일 하나에 집중해. PostgreSQL은 관계형 트랜잭션을 중심에 두면서도 문서 저장, 전문 검색, 공간 질의, 벡터 유사도, 분석 집계까지 같은 엔진 안에서 처리해. 규모가 알맞다면 PostgreSQL 인스턴스 하나가 특화 시스템 서너 개를 대신하고, 운영해야 할 장애·백업·권한 체계도 하나로 줄여줘.

무엇을 품고 있나

  • JSONB는 B-tree·GIN·표현식 색인을 쓸 수 있는 문서 저장소야. JSON 내부도 정식 질의 대상으로 다뤄.
  • 전문 검색tsvectortsquery, 순위 계산, 여러 언어의 어간 처리를 제공해. 규모에 따라 Elasticsearch 없이도 충분해.
  • 풍부한 자료형에는 배열, 열거형, 범위, 사용자 정의 복합형, 생성 열이 있어.
  • 윈도 함수·CTE·LATERAL JOIN·MERGE처럼 현대 SQL에 기대하는 기능을 폭넓게 지원해.
  • 확장 기능으로 PostGIS의 공간 정보, pgvector의 AI 임베딩, TimescaleDB의 시계열, pg_trgm의 유사 문자열, pg_stat_statements의 질의 통계를 더할 수 있어.
  • 논리 복제는 군집 전체가 아니라 필요한 테이블을 골라 복제해. 버전 사이를 안전하게 전환하는 배포에도 쓸 수 있지.

눈에 덜 띄는 힘

LISTENNOTIFY를 쓰면 적은 양의 메시지를 전달할 수 있고, 행 수준 보안은 여러 고객의 데이터를 나누는 규칙을 데이터베이스 안에 둬. EXCLUDE 제약은 예약 시간처럼 서로 겹치면 안 되는 범위를 막아줘. 기능 하나를 제대로 쓰면 외부 서비스 하나와 그 운영 비용을 통째로 덜 수 있어.

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;
전문 검색과 결과 순위·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;
범위 자료형으로 이중 예약 막기·sql
CREATE TABLE bookings (
    room    TEXT NOT NULL,
    during  TSRANGE NOT NULL,
    EXCLUDE USING gist (room WITH =, during WITH &&)
);
-- 같은 방 시간 겹치는 두 예약: INSERT 에서 거절.

External links

Exercise

현재 기술 구성에서 외부 의존성 하나를 골라. Redis 캐시, Elasticsearch 색인, 벡터 데이터베이스, 메시지 대기열 가운데 무엇이든 좋아. PostgreSQL 기능이나 확장 기능으로 바꾼 모습을 그려 보고, 손해와 이득을 솔직하게 적어. 둘 다 유지하는 답도 가능하지만 이유가 분명해야 해.

Progress

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

댓글 0

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

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