From 344d55e68eaade6c9bb10b9882a5b1525d0aadbe Mon Sep 17 00:00:00 2001 From: pkdee Date: Thu, 2 Jul 2026 01:35:17 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20V11=20RLS=20=EC=85=80=ED=94=84=EB=9D=BD?= =?UTF-8?q?=20=EB=B6=80=ED=8C=85=20=EC=8B=A4=ED=8C=A8=EC=99=80=20=EC=BB=A4?= =?UTF-8?q?=EB=84=A5=EC=85=98=20=ED=92=80=20=EC=86=8C=EC=A7=84=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - V11 에서 flyway_schema_history 에 ENABLE RLS 거는 줄 제거(Flyway 가 잠근 이력 테이블에 ACCESS EXCLUSIVE 재요청 → statement timeout → 부팅 실패) - application-prod.yml 에 HikariCP maximum-pool-size=5·minimum-idle=1 추가(Supabase 풀러 session mode 15 한도 내 리비전 교체) Closes #57 --- src/main/resources/application-prod.yml | 7 +++++++ src/main/resources/db/migration/V11__enable_rls.sql | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 851e646..2ec398a 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -8,6 +8,13 @@ spring: url: ${DB_URL} username: ${DB_USERNAME} password: ${DB_PASSWORD} + # Supabase 커넥션 풀러(session mode)는 클라이언트 15개 한도. 리비전 무중단 교체 시 + # 구/신 리비전이 잠깐 공존하므로 리비전당 커넥션을 낮게 잡아 한도를 넘지 않게 한다. + # (기본값은 max=idle=10 → 리비전 2개면 20 > 15 로 EMAXCONNSESSION 발생.) + # 상세: docs/가이드/azure/배포.md, docs/02-아키텍처/기술스택.md. + hikari: + maximum-pool-size: 5 + minimum-idle: 1 # API 문서(OpenAPI/Swagger UI)는 운영에서 비활성 — 공개 엔드포인트 정보노출 최소화(local 에선 활성). springdoc: diff --git a/src/main/resources/db/migration/V11__enable_rls.sql b/src/main/resources/db/migration/V11__enable_rls.sql index 5f59e75..decce4c 100644 --- a/src/main/resources/db/migration/V11__enable_rls.sql +++ b/src/main/resources/db/migration/V11__enable_rls.sql @@ -5,10 +5,14 @@ -- 데이터 접근은 전부 Spring 서버(테이블 owner role = RLS 우회) 경유이고, client 는 public -- 테이블을 Supabase REST 로 직접 읽지 않으므로 정책(policy)은 두지 않는다(= anon 전면 차단). -- --- 멱등: ENABLE ROW LEVEL SECURITY 는 이미 켜진 테이블엔 no-op 이라 운영 DB(수동 활성화됨)와 --- 충돌하지 않는다. 테스트는 @DataJpaTest(H2)+ddl-auto 로 돌아 이 마이그레이션을 실행하지 않는다. +-- 테스트는 @DataJpaTest(H2)+ddl-auto 로 돌아 이 마이그레이션을 실행하지 않는다. -- -- 컨벤션: 앞으로 새 public 테이블을 만드는 마이그레이션은 RLS 활성화를 함께 포함한다(ADR-0027). +-- +-- 주의: Flyway 내부 테이블(flyway_schema_history)에는 여기서 RLS 를 걸지 않는다. 마이그레이션 +-- 도중 Flyway 가 그 테이블을 잠그고 있어, 같은 테이블에 ACCESS EXCLUSIVE 가 필요한 ENABLE RLS +-- 를 걸면 자기 자신과 락 충돌로 무한 대기한다(fresh DB 에서 부팅 멈춤). 이력 테이블 노출 차단이 +-- 필요하면 Flyway 밖(수동/별도 경로)에서 적용한다. ALTER TABLE public.tasks ENABLE ROW LEVEL SECURITY; ALTER TABLE public.events ENABLE ROW LEVEL SECURITY; @@ -18,4 +22,3 @@ ALTER TABLE public.calendar_connections ENABLE ROW LEVEL SECURITY; ALTER TABLE public.external_events ENABLE ROW LEVEL SECURITY; ALTER TABLE public.time_debts ENABLE ROW LEVEL SECURITY; ALTER TABLE public.users ENABLE ROW LEVEL SECURITY; -ALTER TABLE public.flyway_schema_history ENABLE ROW LEVEL SECURITY;