~/VibeHandbook
무료 PDF

데이터베이스

postgresql.org

PostgreSQL

무엇인가

PostgreSQL은 성숙한 오픈소스 관계형 데이터베이스로, 데이터를 타입이 지정된 테이블에 저장하며 (구조적 질의 언어), 트랜잭션, 데이터 무결성을 강력하게 지원한다. 정확성, 확장성, 그리고 JSONB(Postgres의 바이너리 타입), 전문 검색(full-text search), 윈도우 함수 같은 풍부한 기능으로 잘 알려져 있다. 신뢰할 수 있는 구조화된 데이터가 필요한 대부분의 애플리케이션 백엔드에서 기본 선택이다.

강점

  • 전액 이체가 완전히 끝나거나 완전히 취소되거나 둘 중 하나인 은행 송금을 떠올려 보라. 절대 절반만 처리되지 않는다. 이 전부-아니면-전무 보장을 ACID(원자성·일관성·격리성·지속성) 트랜잭션이라 하며, Postgres는 기본적으로 강력한 일관성을 제공한다.
  • 강력한 SQL: 조인, CTE(공통 테이블 표현식), 윈도우 함수, 집계 함수.
  • JSONB, 배열, 범위(range), 사용자 정의 타입을 포함한 유연한 타입.
  • PostGIS(지리공간), pgvector(임베딩) 같은 확장.
  • 강력한 제약 조건, 외래 키, 체크 규칙으로 데이터 품질을 강제한다.

트레이드오프

  • 수직 확장은 쉽지만, 수평 샤딩은 추가 도구가 필요하다.
  • 모델이 진화함에 따라 스키마 마이그레이션이 필요하다.
  • 아주 작은 프로젝트에는 단일 파일 데이터베이스보다 운영이 무겁다.
  • 클라이언트당 연결 모델은 대규모에서 풀러(PgBouncer)가 필요하다.

언제 사용하는가

관계형 데이터, 트랜잭션, 또는 리포팅 요구가 있는 거의 모든 앱의 기본값으로 PostgreSQL을 선택하라: SaaS(서비스형 소프트웨어) 백엔드, 전자상거래, 분석, 그리고 제약 조건과 조인의 이점을 누리는 모든 것.

바이브 코딩 적합성

AI를 지시할 때 엔티티와 그 관계를 알려주고, 기본 키, 외래 키, NOT NULL 제약 조건, 합리적인 인덱스를 갖춘 정규화된 스키마를 만들도록 요청하라. 주입(injection)을 막기 위해 매개변수화된 쿼리를 고집하고(절대 문자열로 연결한 SQL을 쓰지 말 것), 다단계 쓰기는 트랜잭션으로 감싸도록 AI에게 요청하라. 좋은 팁: AI에게 되돌릴 수 있는 마이그레이션 파일도 생성하게 하라. 추가하는 각 인덱스도 설명하게 하라. 그러면 적용하기 전에 읽기/쓰기 트레이드오프를 이해할 수 있다.

CREATE TABLE users (
  id         BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  email      TEXT NOT NULL UNIQUE,
  created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE orders (
  id       BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  user_id  BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  total    NUMERIC(10,2) NOT NULL CHECK (total >= 0),
  status   TEXT NOT NULL DEFAULT 'pending'
);

CREATE INDEX idx_orders_user_id ON orders(user_id);

-- 매개변수화된 쿼리 (연결이 아닌 플레이스홀더)
SELECT o.id, o.total
FROM orders o
WHERE o.user_id = $1 AND o.status = $2;