~/VibeHandbook
$39

데이터베이스

postgresql.org

PostgreSQL

무엇인가

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

강점

  • 기본적으로 ACID 트랜잭션과 강력한 일관성을 제공한다.
  • 강력한 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;