🎈 About Issue 🎈
현재 @IntegrationTest 커스텀 어노테이션은 SpringBootTest, test profile, MySQL/Redis Testcontainers 초기화와 함께 @Transactional까지 포함하고 있다.
@Transactional // 각 테스트 메서드 종료 시 롤백
@SpringBootTest
@ActiveProfiles("test")
@ContextConfiguration(initializers = {
MySQLContainerInitializer.class,
RedisContainerInitializer.class
})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public @interface IntegrationTest {
}
@Transactional은 테스트 데이터 롤백을 위해 편리하지만, 현재 프로젝트의 통합 테스트는 MySQL뿐 아니라 Redis도 함께 검증한다.
DB 트랜잭션은 테스트 종료 시 롤백되지만 Redis 데이터는 롤백 대상이 아니기 때문에 테스트 간 상태 오염 가능성이 있다.
또한 @IntegrationTest라는 범용 통합 테스트 어노테이션에 @Transactional이 기본 포함되어 있으면, Redis/외부 API/비동기 처리까지 포함하는 통합 테스트에서도 기본적으로 테스트 트랜잭션이 열린다. 이 경우 실제 운영 요청의 트랜잭션 흐름과 테스트 환경의 트랜잭션 흐름이 달라질 수 있다.
따라서 @IntegrationTest는 통합 테스트 환경 구성만 담당하도록 변경하고, DB 롤백이 필요한 테스트에서는 @Transactional을 명시적으로 붙이는 구조로 개선합니다.
✅ Todo
📚 Reference
🎈 About Issue 🎈
현재
@IntegrationTest커스텀 어노테이션은 SpringBootTest, test profile, MySQL/Redis Testcontainers 초기화와 함께@Transactional까지 포함하고 있다.@Transactional은 테스트 데이터 롤백을 위해 편리하지만, 현재 프로젝트의 통합 테스트는 MySQL뿐 아니라 Redis도 함께 검증한다.DB 트랜잭션은 테스트 종료 시 롤백되지만 Redis 데이터는 롤백 대상이 아니기 때문에 테스트 간 상태 오염 가능성이 있다.
또한
@IntegrationTest라는 범용 통합 테스트 어노테이션에@Transactional이 기본 포함되어 있으면, Redis/외부 API/비동기 처리까지 포함하는 통합 테스트에서도 기본적으로 테스트 트랜잭션이 열린다. 이 경우 실제 운영 요청의 트랜잭션 흐름과 테스트 환경의 트랜잭션 흐름이 달라질 수 있다.따라서
@IntegrationTest는 통합 테스트 환경 구성만 담당하도록 변경하고, DB 롤백이 필요한 테스트에서는@Transactional을 명시적으로 붙이는 구조로 개선합니다.✅ Todo
@IntegrationTest에서@Transactional제거@Transactional명시적으로 추가@Transactional(propagation = Propagation.NOT_SUPPORTED)필요 여부 재검토📚 Reference
@IntegrationTest는@Transactional,@SpringBootTest,@ActiveProfiles("test"), MySQL/Redis Testcontainers initializer 설정을 함께 포함하고 있음.