Spring Boot Auto-Configuration 순서 의존성 문제
Spring Boot Auto-Configuration
Jun 19, 2026
증상
spring-boot-starter-web을 통해 Jackson 라이브러리와 ObjectMapper 자동 구성이 정상적으로 포함돼 있음에도 다음 오류로 애플리케이션 기동이 실패했습니다.
Required error handler delegate is missing: rabbitRabbit ErrorHandler 생성 과정을 역추적하면 다음과 같습니다.
RabbitMqAutoConfiguration에서 RabbitPublisher는 다음 조건을 만족해야 생성됩니다.
@ConditionalOnBean({
RabbitTemplate.class,
ObjectMapper.class,
RabbitMqNamingResolver.class
})- RabbitTemplate
- ObjectMapper
- RabbitMqNamingResolver 필요
하지만 조건 평가 시점에 ObjectMapper Bean이 아직 등록되지 않아 RabbitPublisher가 생성 대상에서 제외됐습니다. 그 결과 후속 Bean인 rabbitErrorHandlerDelegate도 생성되지 않았고, 최종적으로
routingErrorHandler 생성이 실패했습니다.
애플리케이션에 ObjectMapper Bean을 직접 등록했을 때 정상 기동된 이유도 사용자 정의 Bean이 자동 구성보다 먼저 등록되어 @ConditionalOnBean 조건을 만족시켰기 때문입니다.
원리
Spring Boot Auto-Configuration은 클래스패스에 클래스가 존재하는지와 Spring 컨테이너에 Bean이 등록돼 있는지를 별도로 판단합니다.
@ConditionalOnClass(ObjectMapper.class)이 조건은 Jackson 라이브러리가 클래스패스에 존재하는지만 확인합니다.
반면 다음 조건은 평가 시점에 Spring Bean 정의가 실제로 등록돼 있어야 합니다.
@ConditionalOnBean(ObjectMapper.class)이번 환경에는 jackson-module-parameter-names와 jackson-databind가 컴파일 및 런타임 클래스패스에 정상 포함돼 있었습니다. 따라서 의존성 누락이 아니라 Bean 등록 시점의 문제였습니다.
ObjectMapper는 JacksonAutoConfiguration에서 생성되고, RabbitPublisher는 사내 라이브러리의 RabbitMqAutoConfiguration에서 생성됩니다. 두 자동 구성 사이에 실행 순서가 명시되지 않으면 Rabbit 구성이 Jackson 구성보다 먼저 조건을 평가할 수 있습니다.
조건 평가 시 ObjectMapper Bean이 없으면 해당 Bean 메서드는 자동 구성 대상에서 제외됩니다. 이후 Jackson 자동 구성이 ObjectMapper를 생성하더라도 이미 제외된 RabbitPublisher가 다시 평가되지는 않습니다.
해결
라이브러리의 RabbitMqAutoConfiguration이 Spring Boot의 Rabbit 및 Jackson 자동 구성 이후에 처리되도록 순서를 명시했습니다.
@AutoConfiguration
@AutoConfigureAfter({
RabbitAutoConfiguration.class,
JacksonAutoConfiguration.class
})
public class RabbitMqAutoConfiguration {
}이를 통해 다음 순서가 보장됩니다.
- JacksonAutoConfiguration → ObjectMapper Bean 등록
- RabbitAutoConfiguration → RabbitTemplate Bean 등록
- RabbitMqAutoConfiguration
- 조건 충족
- RabbitPublisher 생성
- RabbitErrorHandlerDelegate 생성
- RoutingErrorHandler 생성
애플리케이션에서 아래처럼 ObjectMapper를 직접 등록하는 방법도 임시 해결책은 될 수 있습니다.
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}하지만 이 방식은 Spring Boot가 적용하는 Jackson 설정, Java Time 모듈, 직렬화 옵션 및 사용자 정의 모듈을 누락시킬 수 있습니다.
또한 자동 구성 라이브러리의 순서 결함을 사용하는 애플리케이션이 대신 보완하게 됩니다.
Share article