본문 바로가기
Spring/인프런 토비의 Spring Boot

섹션 7-5 [조건부 자동구성] 자동 구성 정보 대체하기

by include_hoany 2024. 6. 27.

자동 구성 정보 대체하기

Spring Boot애플리케이션 구성 정보를 작성하는 방식은 크게 두 가지 나뉘어진다는 부분을 우리는 이전 공부한 내용을 토대로 이해할 수 있습니다.

애플리케이션 로직을 담당하는 빈들을 사용자 구성 정보 방식으로 등록을 하고 주로 컴포넌트 스캔에 의해서 등록을 시킵니다.  일정한 패키지에 빈 클래스들을 등록합니다. 그리고 주로 기술과 관련된 빈들은 스프링 부트의 자동 구성 동작 방식에 의해서 말 그대로 자동으로 등록되게 구성합니다.

이러한 이점을 통해 우리는 기존 스프링 프레임워크의 자율성으로 인해 환경을 구성하는데까지 너무나 많은 기술들을 결정하여 설정 했어야 하는 것에 비해 스프링 부트는 여러 개발자들에 의해 결정되고 노하우를 통해 정한 기술들을 미리 정의 하여 빠르게 스프링 프레임워크 기반의 웹 애플리케이션을 개발할 수 있는 이점을 얻게 되었습니다.

우리는 앞서 @Conditional을 통해 자동구성정보 등록을 통한 수많은 기술중 어던 기술들을 Bean으로 등록해야할지 Spring Container가 결정할 수 있도록 구성하는 방법을 확인하였습니다.  

 

자동 구성 정보 대체하기

자동구성정보 등록을 통해 등로할수도 있지만 인프라 스트럭처빈을 자동구성정보를 통해 등록하는것이 아닌 사용자 구성정보 등록을 통해 대체할 수도 있습니다. 이번 시간에는 이러한 방법이 어떻게해서 구현되는지 확인 해보도록 하겠습니다.

 

// 사용자 구성정보 ServletWebServerFactory
@Configuration(proxyBeanMethods = false)  
public class WebServerConfiguration {  
  
    @Bean  
    ServletWebServerFactory customServerFactory() {  
        TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();  
        serverFactory.setPort(9090);  
        return serverFactory;  
    }  
}

사용자 구성정보를 통해 Tomcat Servlet Container를 등록하고 

 

@MyAutoConfiguration  
@ConditionalMyOnClass("org.apache.catalina.startup.Tomcat")  
public class TomcatWebServerConfig {  
  
    @Bean("tomcatWebServerFactory")  
    @ConditionalOnMissingBean  
    public ServletWebServerFactory servletWebServerFactory() {  
        return new TomcatServletWebServerFactory();  
    }  
}

기존에 등록해 두었던 자동구성정보에 @ConditionalOnMissingBean 애노테이션을 등록합니다. @ConditionalOnMissingBean은 이미 등록되어있는 Bean이라면 해당 빈은 등록을 하지않는 역할을 하는데 기존에 자동구성정보를 등록학때 DeferredImportSelector구현체를 통해 등록을 했습니다. 이러한 이유는 구성정보 등록 순서때분인데 사용자 구성정보가 등록이 된 후 자동 구성정보를 등록하게 돕니다. 따라서 사용자 구성정보를 이미 등록을 했다면 자동구성정보에서는 같은 Bean을 생성하지 않게 됩니다.