본문 바로가기
C.W.K.
Stream
Lesson 10 of 10 · published

PostgreSQL 하나로 충분한 이유

~12 min · extensions, philosophy

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

서비스 수를 줄이는 설계

전문 도구 하나의 최대 성능만 비교하면 별도 시스템이 좋아 보여. 하지만 백업, 권한, 장애 대응, 데이터 동기화를 4개 시스템에서 운영하는 비용은 작은 성능 차이보다 커질 수 있어.

  • JSONB와 GIN은 대부분의 문서 저장 사례에서 MongoDB를, tsvector와 GIN은 문서 10억 개 미만의 전문 검색에서 Elasticsearch를 대신할 수 있어.
  • pgvector와 HNSW는 약 10M 이하 벡터 검색을, PostGIS는 공간 정보를 다뤄.
  • TimescaleDB는 시계열을, UNLOGGED 테이블과 LISTEN/NOTIFY는 일부 캐시·메시지 요구를, SKIP LOCKED는 가벼운 작업 대기열에서 Celery나 SQS를 대신할 수 있어.

한계를 솔직히 인정해

페타바이트 분석은 BigQuery·Snowflake, sub-ms 캐시는 Redis, 초당 수백만 쓰기는 Cassandra, 실시간 스트림은 Kafka가 더 잘해. PostgreSQL에서 시작하고 측정된 고통이 생길 때 전문 도구를 더해.

Code

PostgreSQL 하나로 서비스 4개 줄이기·sql
-- 1. Document store (MongoDB 였음)
CREATE TABLE events (id BIGINT PRIMARY KEY, data JSONB);
CREATE INDEX events_data_gin ON events USING gin (data);

-- 2. Full-text search (Elasticsearch 였음)
ALTER TABLE articles ADD COLUMN tsv tsvector
GENERATED ALWAYS AS (to_tsvector('english', body)) STORED;
CREATE INDEX articles_tsv_gin ON articles USING gin (tsv);

-- 3. Vector 검색 (Pinecone 였음)
CREATE EXTENSION vector;
ALTER TABLE documents ADD COLUMN embedding vector(1536);
CREATE INDEX documents_embedding_hnsw
ON documents USING hnsw (embedding vector_cosine_ops);

-- 4. Job 큐 (Celery + Redis 였음)
CREATE TABLE jobs (
    id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    payload JSONB NOT NULL,
    status TEXT NOT NULL DEFAULT 'pending',
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
-- Worker 가 가져옴: SELECT ... FOR UPDATE SKIP LOCKED LIMIT 1

External links

Exercise

현재 아키텍처의 외부 데이터 저장소를 모두 나열해. 각각을 대신할 수 있는 PostgreSQL 기능이나 확장 기능을 찾고, 외부 서비스를 운영하는 비용과 전환할 때 생길 추가 성능 손실을 비교해.

Progress

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

댓글 0

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

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