프로퍼티 클래스의 분리

Sol's·2023년 6월 1일
0

토비의 스프링 부트

목록 보기
26/31

개발을 하다보면 재사용 해야하는 프로퍼티도 생길 수 있습니다.
필드에 지정하면 재사용 하기 힘들어 집니다.
그래서 프로퍼티의 값을 별도의 클래스추출해 보겠습니다.

우선 프로퍼티를 하나 더 추가해 보겠습니다.

가장 많이 사용하는 Port를 넣겠습니다.

@MyAutoConfiguration
@ConditionalMyOnClass("org.apache.catalina.startup.Tomcat")
public class TomcatWebServerConfig {
    @Value("${contextPath:}")// application.properties에서 읽어옵니다.
    String contextPath;

    @Value("${port:8080}")// application.properties에서 읽어옵니다.
    int port;
    @Bean("tomcatWebServerFactory")
    @ConditionalOnMissingBean // 같은 타입의 Bean이 없다면 생성해라
    public ServletWebServerFactory servletWebServerFactory(){
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.setContextPath(this.contextPath);
        factory.setPort(port);
        return factory;
    }
}

자세히 보면 @Value("${port:8080}")port옆에 :8080이 있습니다.
이것을 만약port와 일치하는 키가 없다면, 디폴트 설정을하는 것입니다.

프로퍼티 클래스 분리

프로퍼티 클래스를 만들어 줍니다.

public class ServerProperties {
    private String contextPath;

    private int port;

    public void setContextPath(String contextPath) {
        this.contextPath = contextPath;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getContextPath() {
        return contextPath;
    }

    public int getPort() {
        return port;
    }
}

프로퍼티 클래스를 빈으로 등록합니다.
이떄, Binder를 통해 간편하게 환경변수를 설정 할 수 있습니다.
environment의 키와 ServerProperties클래스의 필드가 매칭되면 값을 주입합니다.

@MyAutoConfiguration
public class ServerPropertiesConfig {
    @Bean
    public ServerProperties serverProperties(Environment environment) {
        return Binder.get(environment).bind("", ServerProperties.class).get();
    }
}

당연히 Bean으로 등록하기 떄문에 자동구성설정에 추가해 줍니다.

tobyspring.config.autoconfig.ServerPropertiesConfig
tobyspring.config.autoconfig.PropertyPlaceholderConfig
tobyspring.config.autoconfig.TomcatWebServerConfig
tobyspring.config.autoconfig.JettyWebServerConfig
tobyspring.config.autoconfig.DispatcherServletConfig

그리고 사용할 곳에서는 클래스를 주입받아 사용하면 됩니다!

@MyAutoConfiguration
@ConditionalMyOnClass("org.apache.catalina.startup.Tomcat")
public class TomcatWebServerConfig {

    @Bean("tomcatWebServerFactory")
    @ConditionalOnMissingBean // 같은 타입의 Bean이 없다면 생성해라
    public ServletWebServerFactory servletWebServerFactory(ServerProperties properties){
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();

        factory.setContextPath(properties.getContextPath());
        factory.setPort(properties.getPort());

        return factory;
    }

}

profile
배우고, 생각하고, 행동해라

0개의 댓글