@Conditional을 이용해 Jetty 서버 구성 추가

Sol's·2023년 5월 31일
0

토비의 스프링 부트

목록 보기
21/31

스프링 부트에서 조건(Condition)에 따라 Tomcat을사용할지, Jetty를 사용할지 결정하는 방법을 알아보겠습니다.

우선 build.gradle에 jetty를 추가해 줍니다.
Tomcat이 없는것 같지만, Tomcat은 starter-web에 들어있습니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-jetty'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

@Conditional

조건에 따라 Bean으로 등록될지 말지를 결정하는 어노테이션입니다.

@Conditional( 'Condition 인터페이스를 구현한 클래스' ) 처럼 사용됩니다.

구현체에는 matches()함수를 오버라이드 하여 Bean으로 등록할 것인지 말지 결정하면 됩니다.
return 값으로 True 또는 False를 정하면 됩니다.

static class JettyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return true;
        }
    }

이제 적용해 보겠습니다!

Bean으로 등록

이제 JettyServletWebServerFactory를 Bean으로 등록시켜주어야 합니다.

가독성을 위해 내부클래스를 사용하였습니다!

여기서 중요한 것은 @Conditional이 추가된 것입니다.

@MyAutoConfiguration
@Conditional(JettyWebServerConfig.JettyCondition.class)
public class JettyWebServerConfig {
    @Bean("jettyWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new JettyServletWebServerFactory();
    }

    static class JettyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return true;
        }
    }
}

톰캣도 똑같이 @Conditional을 추가해서 만들어 줍니다.

@MyAutoConfiguration
@Conditional(TomcatWebServerConfig.TomcatCondition.class)
public class TomcatWebServerConfig {
    @Bean("tomcatWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory(){
        return new TomcatServletWebServerFactory();
    }

    static class TomcatCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return false;
        }
    }
}

자동 구성 정보 등록

META-INF.sping 파일에 스트링 값으로 자동구성정보를 넘겨주어야 합니다.

tobyspring.config.autoconfig.TomcatWebServerConfig
tobyspring.config.autoconfig.JettyWebServerConfig
tobyspring.config.autoconfig.DispatcherServletConfig

Jetty 서버가 잘 동작하는것을 확인 하였습니다!

보완해야할것

현재는 Condition의 구현체에서 matches 메소드에 return 값을 하드코딩으로 Bean으로 등록할 것인지 말지 결정하였습니다.

하지만 실무에서 이렇게 한다면 힘들게 추상화 작업을 한 이유가 없습니다.
그래서 다음글에서는 하드코딩한 리턴값을 동적으로 선택 할수 있게 바꿔보겠습니다.

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

0개의 댓글