fix: Demo Seed의 RLS 호환 트랜잭션 경계를 정리 - #205
Merged
Merged
Conversation
- Demo/Test Seed를 회사별 REQUIRES_NEW 트랜잭션으로 분리하고 시작 직후 tenant context를 설정한다. - 회사 bootstrap부터 운영 fixture 처리까지 제한 Runtime Role에서도 조회·생성·재기동이 멱등하게 동작하도록 한다. - 한 회사의 실패는 해당 회사만 rollback하고 앞서 완료된 회사의 commit은 유지한다. - 기존 DB의 RLS 전환, 제한 Role 재기동, tenant 격리와 파일 fixture 멱등성을 PostgreSQL 테스트로 검증한다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
왜 필요한가요?
PR #135에서 PostgreSQL RLS를 활성화하면 현재 배포 환경의
DEMO_SEED_ENABLED=true조건과 기존 Demo Seed 실행 방식이 충돌할 수 있습니다.기존 Demo Seed runner는 Demo/Test 회사를 하나의 큰 transaction 안에서 처리하고, 기존
company조회 전에 transaction-local tenant context를 설정하지 않았습니다.이 상태에서 RLS가 활성화되면 기존 Demo/Test company 행이 보이지 않아 신규 insert를 시도하고, RLS
WITH CHECK에 의해 SQLSTATE42501로 startup이 실패할 수 있습니다.또한 RLS migration은 Seed runner보다 먼저 commit되므로, startup 실패 후 애플리케이션 이미지만 rollback해도 DB에는 RLS가 활성화된 상태가 남을 수 있습니다.
이 PR은 Demo Seed도 실제 Runtime과 같은 tenant isolation 원칙을 따르도록 transaction과 tenant context 경계를 정리합니다.
REQUIRES_NEWtransaction으로 분리합니다.TenantDatabaseContext로 tenant context를 설정합니다.이 PR은 PR #135의 선행 작업입니다.
Closes #204
무엇이 바뀌나요?
API·도메인·DB 변경:
TenantTransactionExecutor를 추가해 회사별 작업을REQUIRES_NEWtransaction으로 실행합니다.TenantDatabaseContext를 설정하고 그 뒤에 Seed callback을 실행합니다.DemoAuthSeedRunner,DemoWorkerSeedRunner,DemoOperationalSeedRunner의run()전체@Transactional을 제거하고 Demo/Test 회사를 각각 독립 transaction으로 처리합니다.@Order(0) → @Order(1) → @Order(2)와 기존 fixture 의미·멱등성 로직은 유지합니다.권한·Workflow 변경:
SUPERUSER,BYPASSRLS, table ownership 같은 우회 권한을 추가하지 않습니다.app.company_idtenant context를 사용합니다.AI·외부 연동 변경:
문서·배포 변경:
DEMO_SEED_ENABLED=true재기동 회귀를 확인하는 것이 전제입니다.어떻게 검증했나요?
./gradlew.bat clean test실행(전체 성공은 아님)NotificationEventHandlerIntegrationTest.manualTaskCreationDoesNotCreateNotification()1건 실패processAvailable()호출 전에 이벤트를 처리할 수 있는 기존 경쟁 조건으로 추정./gradlew build추가·보강한 주요 테스트:
검증하도록 추가한 핵심 시나리오:
TenantTransactionExecutor가 tenant context를 callback보다 먼저 설정하는지REQUIRES_NEWtransaction에서 실행되는지app.company_id가 pool connection에 남지 않는지관련 테스트 실행 예시:
PostgreSQL 16 통합 테스트:
보안·개인정보
company_id범위를 적용합니다.TenantDatabaseContext의 transaction-localapp.company_id계약을 사용합니다.request_id동작을 변경하지 않습니다.API·DB·운영 영향
.env.example변경이 필요하지 않습니다.DEMO_SEED_ENABLED=true상태에서 재기동 성공, Demo/Test 로그인과 주요 fixture 중복 여부를 확인합니다.화면 또는 응답 예시
API 응답과 화면 변경은 없습니다.
이 PR은 Demo Seed의 transaction/tenant context 경계와 RLS 호환성을 수정하는 서버 내부 변경입니다.