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;