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;