# 캔 쿠폰 OSIV 회귀 테스트 보강 Plan/TASK ## Goal `CanCouponService.useCanCoupon()`가 OSIV off 환경에서 Spring 트랜잭션 프록시를 통해 호출될 때 `Member.auth` lazy 연관 접근을 포함한 쿠폰 사용 흐름이 예외 없이 완료됨을 검증한다. ### Phase 1: 실제 호출 경로 통합 테스트 추가 - [x] **Task 1.1: `CanCouponServiceIntegrationTest` 추가** - 파일: `src/test/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponServiceIntegrationTest.kt` - RED: 트랜잭션 없는 테스트 메서드에서 인증 회원, lazy `Member.auth`, CAN 쿠폰 fixture를 만든 뒤 Spring 빈 `CanCouponService.useCanCoupon()`를 호출하는 테스트를 작성한다. - GREEN: 기존 `CanCouponService.useCanCoupon()`의 `@Transactional` 경계로 테스트가 통과하는지 확인한다. - REFACTOR: 테스트 fixture를 최소화하고, 쿠폰 사용 후 저장 상태를 확인한다. - 검증 기준: - `./gradlew --no-daemon test --tests kr.co.vividnext.sodalive.can.coupon.CanCouponServiceIntegrationTest` - `./gradlew --no-daemon ktlintCheck` - 검증 기록: - 무엇: `CanCouponServiceIntegrationTest`에서 인증 회원, lazy `Member.auth`, CAN 쿠폰 fixture를 DB에 저장한 뒤 트랜잭션 없는 테스트 메서드에서 Spring 빈 `CanCouponService.useCanCoupon()`를 호출했다. - 왜: 단순 애노테이션 검사가 아니라 OSIV off 환경의 실제 서비스 호출 경로에서 lazy 초기화 예외가 재발하지 않는지 확인하기 위해서다. - 어떻게: 첫 실행 `./gradlew --no-daemon test --tests kr.co.vividnext.sodalive.can.coupon.CanCouponServiceIntegrationTest`는 컨텍스트 부팅 중 Redis 연결 실패로 실패했다. 테스트에 기존 관례인 `EmbeddedRedisInitializer` opt-in과 `@DirtiesContext`를 추가했다. - 결과: 재실행 `./gradlew --no-daemon test --tests kr.co.vividnext.sodalive.can.coupon.CanCouponServiceIntegrationTest`가 `BUILD SUCCESSFUL in 2m 1s`로 통과했다. ## 검증 기록 - Run: `./gradlew --no-daemon test --tests kr.co.vividnext.sodalive.can.coupon.CanCouponServiceTest --tests kr.co.vividnext.sodalive.can.coupon.CanCouponServiceIntegrationTest` - Result: `BUILD SUCCESSFUL in 2m 24s` - Run: `./gradlew --no-daemon ktlintCheck` - Result: `BUILD SUCCESSFUL in 1m 9s` - Run: `git diff --check` - Result: 공백 오류 없이 통과 - Run: `./gradlew tasks --all` - Result: sandbox 환경에서는 `~/.gradle` wrapper lock 파일 접근 제한으로 실패했고, 승인 실행 후 `BUILD SUCCESSFUL in 11s`로 통과했다.