스프링 부트에서 조건(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'
}
조건에 따라
Bean
으로 등록될지 말지를 결정하는 어노테이션입니다.
@Conditional( 'Condition 인터페이스를 구현한 클래스' )
처럼 사용됩니다.
구현체에는 matches()
함수를 오버라이드 하여 Bean으로 등록할 것인지 말지 결정하면 됩니다.
return 값으로 True 또는 False를 정하면 됩니다.
static class JettyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}
이제 적용해 보겠습니다!
이제 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으로 등록할 것인지 말지 결정하였습니다.
하지만 실무에서 이렇게 한다면 힘들게 추상화 작업을 한 이유가 없습니다.
그래서 다음글에서는 하드코딩한 리턴값을 동적으로 선택 할수 있게 바꿔보겠습니다.