인프라
timestamptz 함정 모음: PostgreSQL 시간 처리에서 틀리기 쉬운 것들
PostgreSQL 시간 처리의 실전 함정을 모았습니다. timestamptz가 시간대를 저장한다는 오해, 결과가 세션 TimeZone에 따라 달라 보이는 원리, AT TIME ZONE이 타입에 따라 반대로 동작하는 이중성, date_trunc·날짜 그룹핑이 자정 기준을 어디에 두느냐로 달라지는 문제, 미래 일정은 timestamptz만으로 부족한 이유(시간대 규칙 변경), now()와 clock_timestamp()의 차이까지 다루겠습니다.
UUID vs bigint 기본 키: 성능 차이의 실체와 uuidv7
기본 키 논쟁의 단골 주제인 UUID vs bigint를 실측 가능한 근거로 정리합니다. bigint가 기본값인 이유(크기·삽입 지역성·조인 비용), UUID v4가 인덱스에 무작위로 삽입되어 쓰기와 캐시 효율을 떨어뜨리는 원리, 시간순 정렬로 그 문제를 대부분 해소한 uuidv7과 PostgreSQL 18 내장 함수, uuidv7의 남는 트레이드오프(생성 시각 노출·16바이트), 그리고 내부 bigint + 외부 UUID 병행 설계까지 다루겠습니다.
N+1 쿼리 문제: 증상, 탐지, 해결까지
ORM을 사용하는 서비스가 느려지는 가장 흔한 원인인 N+1 쿼리를 다룹니다. 목록 하나에 쿼리가 101번 나가는 구조가 만들어지는 원리(지연 로딩), 애플리케이션 로그와 pg_stat_statements의 calls로 탐지하는 법, JOIN·IN 일괄 로딩·ORM의 즉시 로딩 옵션이라는 세 가지 해법, 그리고 "화면이 필요로 하는 데이터를 쿼리 수가 아니라 모양으로 설계한다"는 예방 원칙까지 다루겠습니다.
PostgreSQL upsert 정석: ON CONFLICT 사용법과 함정
"있으면 갱신, 없으면 삽입"을 경쟁 조건 없이 처리하는 ON CONFLICT를 다룹니다. SELECT 후 INSERT 방식이 동시성에서 깨지는 이유, DO NOTHING과 DO UPDATE의 사용법, EXCLUDED로 새 값을 참조하는 법, 충돌 판정 대상(유니크 제약)을 명시해야 하는 이유, 갱신이 필요 없을 때도 행이 잠기는 비용, MERGE와의 관계, 그리고 시퀀스가 건너뛰는 현상까지 다루겠습니다.
테라폼 실전 강좌 #4 ALB와 Auto Scaling: launch template, 대상 그룹, 스케일링 정책
단일 EC2 인스턴스를 로드밸런서 뒤의 Auto Scaling 그룹으로 승격합니다. 인스턴스 정의를 launch template으로 옮기고, ALB와 대상 그룹, 리스너를 연결한 뒤 CPU 타깃 추적 스케일링 정책까지 겁니다. 검증용 단일 인스턴스를 코드에서 지워 IaC의 리소스 제거 흐름을 확인하고, 브라우저로 첫 응답을 받아보겠습니다.
pgvector 실전: PostgreSQL로 벡터 검색을 운영할 때 알아야 할 것
임베딩 검색을 별도 벡터 DB 없이 PostgreSQL로 운영하는 실전 가이드입니다. vector 타입과 거리 연산자, HNSW 인덱스가 기본값인 이유와 IVFFlat과의 비교, 필터 조건과 함께 쓸 때의 과소 검색 문제와 반복 인덱스 스캔(0.8.0), halfvec으로 저장 크기를 절반으로 줄이고 최대 4000차원을 다루는 방법, 그리고 "전용 벡터 DB가 필요한 시점은 언제인가"의 판단 기준까지 다루겠습니다.
PostgreSQL vs MySQL: 2026년에 새 프로젝트라면 어느 쪽인가
두 오픈소스 RDBMS의 선택 기준을 정리합니다. 결론은 "새 프로젝트는 특별한 이유가 없으면 PostgreSQL, MySQL 생태계에 이미 서 있다면 MySQL 유지"입니다. MySQL 8.0 지원 종료(2026-04)와 8.4 LTS 전환 시점, 기능 폭(JSONB·윈도 함수·확장)과 MVCC 구현 차이, 복제 생태계의 성숙도 차이, 그리고 어느 쪽을 골라도 되는 경우까지 판단 기준을 다루겠습니다.