Projects/[Final] Shopping Mall Project

[트러블슈팅] BeanDefinitionOverrideException 해결하기

montmer27 2026. 5. 7. 00:18

[상황]

다음 테스트가 실패했다.

- contextLoads()

- AdminRefundOptimisticLockControllerTest

- AdminRefundOptimisticLockServiceTest

[원인]

에러 트레이스를 보니 동일하게 BeanDefinitionOverrideException 때문에 실패했다.

[해결 방안]

로그를 좀 더 내려보니 아래와 같은 해결 방식을 제안했다.

Description: The bean 'redisTemplate', defined in class path resource [com/example/allinmarket/common/redis/RedisConfig.class], could not be registered. A bean with that name has already been defined in class path resource [com/example/allinmarket/common/config/TestRedisConfig.class] and overriding is disabled. Action: Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

RedisConfig.class에 정의된 redisTemplate과 같은 이름의 빈이 이미 등록되어서, 사용할 수 없다는 것이었다.

현재 오버라이딩 설정이 꺼져 있어 오버라이딩이 안 되었는데, 오버라이딩을 설정을 켜서 다시 시도해보라는 것이다.

AI의 분석도 동일했다.

원인 분석
1. @SpringBootTest가 전체 애플리케이션 컨텍스트를 로드하면 RedisAutoConfiguration이 실행됨
2. RedisAutoConfiguration이 redisTemplate 빈을 먼저 등록
3. @Import(TestRedisConfig.class) 처리 시 TestRedisConfig.redisTemplate()이 동일한 이름의 빈을 다시 등록하려 함
4. spring.main.allow-bean-definition-overriding=false (기본값) → BeanDefinitionOverrideException

RedisConfig는 @Profile("!test")로 테스트 시 제외되므로 문제 없음. 충돌은 오직 RedisAutoConfiguration vs TestRedisConfig 사이에서 발생. AllInMarketApplicationTests, AdminRefundOptimisticLockServiceTest도 동일 패턴이므로 잠재적으로 동일한 문제를 가짐.

수정 방법
application-test.yml에 spring.main.allow-bean-definition-overriding: true 추가.
- 테스트 프로파일에서만 적용되므로 프로덕션 영향 없음
- TestRedisConfig의 redisTemplate mock이 auto-configured 빈을 정상적으로 override함
- @SpringBootTest + @Import(TestRedisConfig.class) 패턴을 사용하는 모든 테스트를 한 번에 해결

수정 파일
- src/test/resources/application-test.yml — spring.main.allow-bean-definition-overriding: true 추가

트러블슈팅 과정에서 추가 에러도 확인했는데, RedisRepositoriesAutoConfiguration이 redisKeyValueAdapter 빈을 자동 생성하는데, 내부적으로 redisTemplate.getConnectionFactory()를 호출한다. mock RedisTemplate은 Null을 반환하므로 null을 받아 예외가 발생했다. 프로젝트에서 @RedisHash / @EnableRedisRepositories를 전혀 사용하지 않기 때문에, spring.data.redis.repositories.enabled: false를 통해 불필요한 자동설정을 차단해 해결했다.