Skip to content

@IntegrationTest 어노테이션을 개선한다. #110

@strongmhk

Description

@strongmhk

🎈 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

  • @IntegrationTest에서 @Transactional 제거
  • DB 롤백이 필요한 테스트 클래스에만 @Transactional 명시적으로 추가
  • Redis를 사용하는 통합 테스트에서 테스트 전후 Redis cleanup 전략 추가
  • 필요 시 TransactionalIntegrationTest 커스텀 어노테이션 분리 검토
  • AuthControllerIntegrationTest, DeviceControllerIntegrationTest의 @Transactional(propagation = Propagation.NOT_SUPPORTED) 필요 여부 재검토
  • 테스트 실행 후 MySQL/Redis 상태가 테스트 간에 독립적으로 유지되는지 확인
  • 관련 통합 테스트 전체 실행 후 회귀 여부 확인

📚 Reference

Metadata

Metadata

Assignees

Labels

Type

No fields configured for Task.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions