#PostgreSQL

27 편의 글

PostgreSQL LISTEN/NOTIFY: 어디까지 쓰며 언제 메시지 큐로 넘어가나
4 분 소요

PostgreSQL LISTEN/NOTIFY: 어디까지 쓰며 언제 메시지 큐로 넘어가나

PostgreSQL 내장 pub/sub인 LISTEN/NOTIFY의 실전 사용 범위를 정리합니다. 트랜잭션과 함께 커밋 시점에 발행되는 동작 원리, 8000바이트 페이로드 한도와 "키만 보내라" 원칙, 리스너가 없으면 사라지는 휘발성, 대량 발행 시 커밋 직렬화 병목이라는 규모의 한계, 그래서 정석이 되는 "알림은 깨우는 신호 + 작업은 SKIP LOCKED 테이블 큐" 조합, 그리고 진짜 메시지 큐로 넘어가는 기준까지 다루겠습니다.

PostgreSQL Row-Level Security: 멀티테넌트 격리를 DB가 강제하게 만들기
4 분 소요

PostgreSQL Row-Level Security: 멀티테넌트 격리를 DB가 강제하게 만들기

행 단위 접근 제어(RLS)의 실전 도입을 다룹니다. WHERE tenant_id 누락이라는 멀티테넌트 최악의 사고를 애플리케이션 규율이 아니라 DB 강제로 막는 구조, ENABLE ROW LEVEL SECURITY와 CREATE POLICY의 기본형, current_setting으로 요청마다 테넌트를 지정하는 표준 패턴과 커넥션 풀 주의점, 성능의 조건(tenant_id 인덱스), 그리고 RLS를 안 쓰는 게 나은 경우까지 다루겠습니다.

timestamptz 함정 모음: PostgreSQL 시간 처리에서 틀리기 쉬운 것들
5 분 소요

timestamptz 함정 모음: PostgreSQL 시간 처리에서 틀리기 쉬운 것들

PostgreSQL 시간 처리의 실전 함정을 모았습니다. timestamptz가 시간대를 저장한다는 오해, 결과가 세션 TimeZone에 따라 달라 보이는 원리, AT TIME ZONE이 타입에 따라 반대로 동작하는 이중성, date_trunc·날짜 그룹핑이 자정 기준을 어디에 두느냐로 달라지는 문제, 미래 일정은 timestamptz만으로 부족한 이유(시간대 규칙 변경), now()와 clock_timestamp()의 차이까지 다루겠습니다.

UUID vs bigint 기본 키: 성능 차이의 실체와 uuidv7
4 분 소요

UUID vs bigint 기본 키: 성능 차이의 실체와 uuidv7

기본 키 논쟁의 단골 주제인 UUID vs bigint를 실측 가능한 근거로 정리합니다. bigint가 기본값인 이유(크기·삽입 지역성·조인 비용), UUID v4가 인덱스에 무작위로 삽입되어 쓰기와 캐시 효율을 떨어뜨리는 원리, 시간순 정렬로 그 문제를 대부분 해소한 uuidv7과 PostgreSQL 18 내장 함수, uuidv7의 남는 트레이드오프(생성 시각 노출·16바이트), 그리고 내부 bigint + 외부 UUID 병행 설계까지 다루겠습니다.

N+1 쿼리 문제: 증상, 탐지, 해결까지
4 분 소요

N+1 쿼리 문제: 증상, 탐지, 해결까지

ORM을 사용하는 서비스가 느려지는 가장 흔한 원인인 N+1 쿼리를 다룹니다. 목록 하나에 쿼리가 101번 나가는 구조가 만들어지는 원리(지연 로딩), 애플리케이션 로그와 pg_stat_statements의 calls로 탐지하는 법, JOIN·IN 일괄 로딩·ORM의 즉시 로딩 옵션이라는 세 가지 해법, 그리고 "화면이 필요로 하는 데이터를 쿼리 수가 아니라 모양으로 설계한다"는 예방 원칙까지 다루겠습니다.

PostgreSQL upsert 정석: ON CONFLICT 사용법과 함정
4 분 소요

PostgreSQL upsert 정석: ON CONFLICT 사용법과 함정

"있으면 갱신, 없으면 삽입"을 경쟁 조건 없이 처리하는 ON CONFLICT를 다룹니다. SELECT 후 INSERT 방식이 동시성에서 깨지는 이유, DO NOTHING과 DO UPDATE의 사용법, EXCLUDED로 새 값을 참조하는 법, 충돌 판정 대상(유니크 제약)을 명시해야 하는 이유, 갱신이 필요 없을 때도 행이 잠기는 비용, MERGE와의 관계, 그리고 시퀀스가 건너뛰는 현상까지 다루겠습니다.

pgvector 실전: PostgreSQL로 벡터 검색을 운영할 때 알아야 할 것
4 분 소요

pgvector 실전: PostgreSQL로 벡터 검색을 운영할 때 알아야 할 것

임베딩 검색을 별도 벡터 DB 없이 PostgreSQL로 운영하는 실전 가이드입니다. vector 타입과 거리 연산자, HNSW 인덱스가 기본값인 이유와 IVFFlat과의 비교, 필터 조건과 함께 쓸 때의 과소 검색 문제와 반복 인덱스 스캔(0.8.0), halfvec으로 저장 크기를 절반으로 줄이고 최대 4000차원을 다루는 방법, 그리고 "전용 벡터 DB가 필요한 시점은 언제인가"의 판단 기준까지 다루겠습니다.

PostgreSQL vs MySQL: 2026년에 새 프로젝트라면 어느 쪽인가
4 분 소요

PostgreSQL vs MySQL: 2026년에 새 프로젝트라면 어느 쪽인가

두 오픈소스 RDBMS의 선택 기준을 정리합니다. 결론은 "새 프로젝트는 특별한 이유가 없으면 PostgreSQL, MySQL 생태계에 이미 서 있다면 MySQL 유지"입니다. MySQL 8.0 지원 종료(2026-04)와 8.4 LTS 전환 시점, 기능 폭(JSONB·윈도 함수·확장)과 MVCC 구현 차이, 복제 생태계의 성숙도 차이, 그리고 어느 쪽을 골라도 되는 경우까지 판단 기준을 다루겠습니다.

PostgreSQL 실전 강좌 #9 백업·PITR·업그레이드: 장애 직전으로 돌아가는 기술
4 분 소요

PostgreSQL 실전 강좌 #9 백업·PITR·업그레이드: 장애 직전으로 돌아가는 기술

실전 편의 마무리로 데이터를 지키는 마지막 층을 다룹니다. pg_dump 논리 백업의 한계를 넘는 물리 백업(pg_basebackup)과 WAL 아카이빙의 조합, 원하는 시각으로 되감는 PITR(Point-In-Time Recovery)의 원리와 복구 목표 설정, "삭제 사고는 페일오버로 못 돌린다"는 복제와 백업의 역할 구분, 메이저 버전 업그레이드의 세 가지 길(pg_dump·pg_upgrade·논리 복제), 그리고 트랙 전체의 회고까지 다루겠습니다.

PostgreSQL 실전 강좌 #8 복제와 고가용성: 스트리밍 복제, 읽기 분산, 페일오버
4 분 소요

PostgreSQL 실전 강좌 #8 복제와 고가용성: 스트리밍 복제, 읽기 분산, 페일오버

DB 서버 한 대의 한계를 넘는 표준 수단인 복제를 다룹니다. WAL을 그대로 흘려보내는 스트리밍(물리) 복제의 원리, 비동기 복제의 복제 지연과 read-your-writes 문제, 동기 복제의 트레이드오프, 읽기 부하를 스탠바이로 분산할 때의 주의점, 자동 페일오버에 필요한 것들(Patroni 등)과 스플릿 브레인, 테이블 단위로 골라 보내는 논리 복제의 용도, 그리고 관리형 서비스와의 대응 관계까지 다루겠습니다.

PostgreSQL 실전 강좌 #7 파티셔닝: 거대 테이블을 시간 단위로 나누기
4 분 소요

PostgreSQL 실전 강좌 #7 파티셔닝: 거대 테이블을 시간 단위로 나누기

수억 행 테이블의 표준 처방인 선언적 파티셔닝을 다룹니다. 파티셔닝이 실제로 해결하는 문제(오래된 데이터 삭제가 DROP 한 방·파티션 프루닝·VACUUM 부담 분산)와 해결하지 않는 문제, RANGE 파티셔닝으로 월별 테이블을 만드는 문법, 파티션 키가 PK에 포함되어야 하는 제약, 파티션 프루닝이 적용되는 쿼리 조건, 새 파티션을 계속 만들어야 하는 운영 부담과 pg_partman, 그리고 "언제 도입하는가"의 판단 기준까지 다루겠습니다.

PostgreSQL 실전 강좌 #6 잠금과 동시성: 데드락, DDL 락, SKIP LOCKED
4 분 소요

PostgreSQL 실전 강좌 #6 잠금과 동시성: 데드락, DDL 락, SKIP LOCKED

MVCC가 다 해결해 주지 않는 영역, 잠금을 다룹니다. 행 잠금(쓰기끼리의 충돌)과 테이블 잠금(DDL)의 층위, 잠금 대기를 pg_locks와 pg_blocking_pids로 추적하는 법, 데드락이 나는 구조(교차 순서 갱신)와 예방 규칙(같은 순서로 잡기), SELECT FOR UPDATE로 읽고-판단-쓰기를 안전하게 만드는 법, 그리고 작업 큐의 표준 패턴 FOR UPDATE SKIP LOCKED까지 다루겠습니다.