콘텐츠로 이동

PostgreSQL

개요

PostgreSQL은 30년 넘게 이어져 온 오픈소스 관계형 데이터베이스예요. 데이터를 행과 열로 된 테이블에 담고, SQL로 질의하는 구조를 갖추고 있죠. 개발자들이 많이 쓰는 이유는 "제대로 된" 관계형 DB라는 점이에요 — ACID 트랜잭션, 외래 키, 인덱스, 동시성 제어(MVCC) 같은 기능이 기본으로 갖춰져 있고, JSONB처럼 비관계형 데이터까지 다룰 수 있도록 확장되어 있어요.

왜 제품에서 그대로 쓸 정도로 신뢰하는지가 궁금하다면, 핵심은 다른 DB로는 하기 어려운 "무엇이든 나눠서 맞춰 쓸 수 있는" 유연함이에요. 관계형으로 다뤄야 할 데이터는 물론, JSON 문서처럼 자유로운 형태까지 한 곳에서 처리하고, 부족한 기능은 확장(extension)으로 채워 넣어요.

상태 배지

  • 🟢 운영 — 사용자·구독·권한처럼 정합성이 중요한 데이터의 주 저장소로 실제 제품에서 쓰고 있어요.

핵심 개념

  • 관계형 모델 — 데이터를 테이블(관계)로 나누고, 기본 키·외래 키로 서로 연결해요. 중복을 줄이고 무결성을 지키는 데 강해요.
  • ACID 트랜잭션 — 여러 작업을 하나의 트랜잭션으로 묶어, 모두 성공하거나 모두 취소되도록 보장해요. 원자성(Atomicity)·일관성(Consistency)·격리성(Isolation)·지속성(Durability).
  • MVCC (Multiversion Concurrency Control) — 트랜잭션이 데이터를 덮어쓰는 대신 이전 버전을 남겨두고, 읽는 트랜잭션은 자신의 시점 스냅샷을 봐요. 그래서 읽기와 쓰기가 서로를 막지 않아요.
  • 인덱스 — 원하는 행을 빨리 찾기 위한 별도 구조. B-tree가 기본이고, 부분·표현식·GIN 등 상황에 맞는 인덱스를 만들 수 있어요.
  • JSONB — 문서형 데이터를 저장하는 타입. 자유로운 형태의 데이터를 관계형 안에서 다룰 수 있게 해줘요.
  • 확장(Extension) — 핵심 외 필요한 기능을 얹는 방식. pgvector(벡터)·TimescaleDB(시계열) 같은 확장이 대표적이에요.

사용 사례 / 실제 적용

PostgreSQL은 멀티테넌트 제품에서 정합성이 생명인 데이터의 주 저장소예요.

  • 사용자·계정·권한 — 관계가 꼬여 있어 중복 없이 정규화해서 다뤄야 하는 데이터예요. 외래 키와 트랜잭션으로 무결성을 지켜요.
  • 구독·청구 — 돈이 오가는 작업은 중간에 끊기는 걸 용납 못 해요. 트랜잭션 단위로 묶어 원자성을 보장해요.
  • 테넌트 격리 — 테넌트(회사·팀)마다 데이터를 나눠서, 절대로 다른 테넌트의 데이터가 섞이지 않게 해요.
  • JSONB — 노트·캔버스처럼 구조가 자유로운 일부 데이터도 PostgreSQL 안에서 처리해서, 저장소를 추가로 두지 않아도 되는 경우가 있어요.
  • 확장 얹어 쓰기 — 벡터 검색(pgvector)이나 시계열(TimescaleDB)이 필요해지면 별도 DB 대신 확장으로 PostgreSQL 위에 올려요.

심화 챕터

PostgreSQL의 핵심 원리는 아래 챕터에서 공식 문서를 기준으로 더 깊게 다뤄요.

  • 트랜잭션·ACID·격리 수준 — MVCC가 어떻게 동시성을 관리하는지
  • 인덱스 — B-tree·부분·표현식·GIN 인덱스 언제 왜 쓰는지
  • JSONB — 문서 저장과 쿼리, GIN 인덱스 활용
  • VACUUM — 왜 주기적 정리가 필요한지, autovacuum 튜닝

더 알아보기