inblog logo
|
vlogue
    Java & Spring Boot

    Spring Boot Auto-Configuration 순서 의존성 문제

    Spring Boot Auto-Configuration
    김주혁's avatar
    김주혁
    Jun 19, 2026
    Spring Boot Auto-Configuration 순서 의존성 문제
    증상원리해결

    증상


    spring-boot-starter-web을 통해 Jackson 라이브러리와 ObjectMapper 자동 구성이 정상적으로 포함돼 있음에도 다음 오류로 애플리케이션 기동이 실패했습니다.
    Required error handler delegate is missing: rabbit
    Rabbit 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

    vlogue

    RSS·Powered by Inblog