PostgreSQL 연결은 공짜가 아니야
백엔드 연결 하나는 프로세스와 약 10MB 메모리를 쓰고 운영 데이터베이스의 max_connections는 흔히 100-200이야. Lambda나 Vercel 같은 서버리스 환경에서 수천 개 실행이 각각 직접 연결하면 감당할 수 없어.
작은 실제 연결 집합을 공유해
pgBouncer는 앱의 많은 연결을 받아 적은 PostgreSQL 연결로 다중화해. 세션 풀링은 클라이언트 세션 동안, 트랜잭션 풀링은 트랜잭션 동안만 실제 연결을 붙잡아. 문장 풀링은 문장마다 연결을 돌려주므로 여러 문장으로 이루어진 트랜잭션을 유지할 수 없어 거의 쓰지 않아.
세션 기능의 대가를 알아
트랜잭션 풀링에서는 SET, prepared statement, LISTEN, 세션 advisory lock처럼 같은 연결에 기대는 기능이 깨질 수 있어. 서버리스에는 대개 트랜잭션 모드가 맞지만 기능별로 확인해.