피드로 돌아가기
Dev.toDatabase
원문 읽기
Subquery 래핑을 통한 RLS 정책 76건 최적화 및 InitPlan 유도
76 RLS policies rewritten in one migration: the auth.uid() init-plan trap in Supabase
AI 요약
Context
Supabase RLS 정책 내 auth.uid() 함수를 직접 호출하여 매 행마다 함수가 재실행되는 성능 저하 발생. 데이터 규모가 작은 개발 환경에서는 인지하지 못했으나, 테이블 성장 시 CPU 오버헤드가 누적되는 구조적 결함 보유.
Technical Solution
- auth.uid()를 (SELECT auth.uid()) 형태의 Subquery로 래핑하여 처리
- Postgres Planner가 함수 호출을 단일 InitPlan으로 승격시켜 쿼리 시작 시 1회만 실행하도록 유도
- 매 행마다 JWT 컨텍스트 할당 및 클레임 읽기 과정을 제거하고 리터럴 값으로 참조하는 구조로 변경
- Supabase Database Advisor의 auth_rls_initplan 린트를 통해 최적화 대상 정책 76건 식별
- DROP 및 CREATE POLICY 구문을 통한 기계적 마이그레이션 수행으로 세만틱 유지하며 최적화 적용
실천 포인트
- RLS 정책 작성 시 auth.uid() 등 함수 호출부를 Subquery로 래핑했는지 확인 - EXPLAIN ANALYZE를 통해 Filter 단계에서 함수가 반복 호출되는지, 혹은 InitPlan으로 호이스팅 되었는지 검증 - CI/CD 파이프라인에 Supabase CLI의 db advisors 검사를 추가하여 회귀 방지 체계 구축 - 대규모 Row 스캔이 예상되는 Junction Table 및 User-write Table의 정책 우선 검토