6:05Better Stack
Log in to leave a comment
No posts yet
PostgreSQL은 이제 단순한 데이터 저장소를 넘어섰습니다. 2025년 스택 오버플로우 설문 조사에서 MySQL을 15% 포인트 차이로 따돌리고 1위를 차지한 건 우연이 아닙니다. 이 강력한 DB 위에 PostgREST를 얹으면 Node.js나 Python으로 지루한 CRUD API를 짤 필요가 없습니다. 하지만 결제 연동이나 복잡한 권한 설정 앞에서는 다들 망설입니다. "이게 정말 서버 없이 될까?"라는 의문이 들기 때문입니다. 결론부터 말하면 가능합니다. 그것도 아주 우아하게요.
PostgREST를 쓰면서 가장 걱정하는 부분이 결제 승인이나 이메일 발송 같은 외부 HTTP 호출입니다. DB 안에서 외부 서버를 기다리는 건 끔찍한 생각입니다. 하지만 pg_net 확장 모듈을 쓰면 이야기가 달라집니다. libcurl 기반으로 작동하는 이 툴은 외부 API 응답을 기다리지 않고 비동기로 요청을 던집니다.
토스페이먼츠 같은 결제 API를 연동할 때 이 방식은 빛을 발합니다. 메인 트랜잭션은 데이터만 저장하고 바로 끝냅니다. 실제 API 호출은 백그라운드 큐에서 처리하죠. 이렇게 하면 외부 서버 상태와 상관없이 API 응답 속도를 200ms 미만으로 묶어둘 수 있습니다. 시스템 전체 처리량이 3배 이상 뛰는 걸 보면 그동안 왜 API 서버에서 그 고생을 했나 싶을 겁니다.
재고를 확인하고 주문을 처리하는 복잡한 로직을 보통 백엔드 코드의 if-else 문으로 해결합니다. 하지만 이건 데이터 오염의 시작입니다. 대신 pg_jsonschema를 써보세요. Rust로 작성된 이 확장은 10만 건의 JSON 패턴 매칭을 48ms 만에 끝냅니다.
방법은 명확합니다. 테이블에 CHECK 제약 조건을 걸거나 BEFORE INSERT 트리거를 만드세요. 조건이 맞지 않으면 RAISE EXCEPTION으로 에러를 던지면 됩니다. 이때 SQLSTATE를 PT402로 지정하면 PostgREST가 알아서 클라이언트에게 402 Payment Required 코드를 보냅니다. 백엔드에서 유효성 검사 코드를 짜느라 허비하던 5시간을 아껴서 더 중요한 데이터 모델링에 쓰세요.
PostgREST는 클라이언트의 URL 파라미터가 그대로 쿼리가 됩니다. 편리하지만 위험합니다. 인덱스 없는 컬럼으로 필터링을 걸면 바로 성능 지옥이 펼쳐집니다. 이때 pg_stat_statements는 필수입니다. 어떤 쿼리가 자원을 갉아먹는지 실시간으로 보여주기 때문입니다.
실제로 EXPLAIN (ANALYZE, BUFFERS) 명령으로 실행 계획을 뜯어보고 순차 스캔을 인덱스 스캔으로 바꾸는 것만으로도 성능이 3배 이상 좋아집니다. 클라우드 비용이 30% 줄어드는 건 덤입니다. 복잡한 계산이 필요하다면 PostgreSQL 18의 가상 생성 컬럼에 인덱스를 거는 것도 좋은 방법입니다.
보안을 위해 백엔드에 미들웨어를 덕지덕지 붙이는 건 이제 그만두세요. PostgREST는 PostgreSQL의 행 수준 보안(RLS)을 100% 활용합니다. JWT에 담긴 사용자 정보를 current_setting 함수로 읽어와 SQL 수준에서 권한을 제어합니다.
"유료 구독자만 이 글을 볼 수 있게 하라"는 정책은 CREATE POLICY 문 하나면 끝납니다. 개발자가 코드에서 권한 체크 함수를 호출하는 걸 깜빡해서 데이터가 유출되는 사고를 원천 차단합니다. 비밀번호 변경처럼 민감한 작업은 SECURITY DEFINER 옵션이 붙은 함수로 캡슐화하면 그만입니다. 보안 로직이 DB에 집중되니 관리가 훨씬 편해집니다.
PostgREST 아키텍처에서 스키마 변경은 곧 API 업데이트입니다. 이걸 수동으로 하면 반드시 사고가 납니다. dbmate 같은 도구를 써서 모든 변경 사항을 .sql 파일로 관리해야 합니다.
GitHub Actions에 파이프라인을 걸어두면 코드를 푸시할 때마다 스테이징 서버에 자동으로 반영됩니다. 마이그레이션이 끝나면 PostgREST에 SIGUSR1 신호를 보내거나 NOTIFY pgrst, 'reload schema'를 실행하세요. 다운타임 없이 API가 최신 상태로 갱신됩니다. 1인 개발자라도 엔터프라이즈급 운영 안정성을 가질 수 있는 가장 확실한 방법입니다.