du.study기록공간

Spring boot Web embedded Container(server) 변경 본문

스프링

Spring boot Web embedded Container(server) 변경

du.study 2020. 5. 10. 20:13
728x90

이번에는 간단하게 스프링 부트 웹에서 제공하는 내장 Container를 변경하는법을 기록하려 합니다.

현재 회사에서는 성능 테스트 결과 및 사용 가이드등의 이유로 Undertow 내장 모듈을 사용하여 사용중에 있습니다. 

이번에 스프링부트를 사용하는 도중, 기본으로 Tomcat을 사용하고 있어서 찾아보게 되었고 해당 부분을 Undertow로 변경하려 합니다.

 

우선 spring-boot-starter-web 을 살펴보면 다음과 같은 모듈을 내장하고 있습니다.

스트링 부트 웹모듈을 보면 내부적으로 tomcat을 내장하고 있습니다. 그리고 이로 인하여 Spring.factories 에 있는 EmbeddedWebServerFactoryCustomizerAutoConfiguration 를 호출하게됩니다.

 

이 속에서 해당 코드를 호출하여 톰켓을 사용하게 됩니다.

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class })
public static class TomcatWebServerFactoryCustomizerConfiguration {

  @Bean
  public TomcatWebServerFactoryCustomizer tomcatWebServerFactoryCustomizer(Environment environment,
      ServerProperties serverProperties) {
    return new TomcatWebServerFactoryCustomizer(environment, serverProperties);
  }

}

 그리고 해당 클래스 아래를 살펴보면 다음과 같은 코드도 존재합니다.

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Undertow.class, SslClientAuthMode.class })
public static class UndertowWebServerFactoryCustomizerConfiguration {

  @Bean
  public UndertowWebServerFactoryCustomizer undertowWebServerFactoryCustomizer(Environment environment,
      ServerProperties serverProperties) {
    return new UndertowWebServerFactoryCustomizer(environment, serverProperties);
  }

}

Undertow 클레스와 SslClientAuthMode 가 있을경우, 해당부분에 대한 Bean을 생성하게 됩니다.

결과적으로 실행하게 되면 Tomcat관련 로그가 기록에 남는것을 볼 수 있습니다.

 

그럼 Pom file에서 tomcat을 제거하고 Untertow를 추가하겠습니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

dependency에서 tomcat을 제거하고 undertow를 추가하였습니다. 그결과로 로그에서 톰켓이 사라지고 undertow가 노출되는것이 확인되었습니다.

 

추가로 확인은 해봐야겠지만 exclusion을 제거하지 않을경우, tomcat을 사용하는것을 확인하였습니다. (아마 bean이 있을경우, 가장 먼저 선언된 빈을 사용한다던지.. 추후에 확인해보겠습니다.)

 

이외에도 spring boot에서 undertow를 사용하는이유로 http2설정이 간단한 점 등의 장점이 있어 쓰인다고 합니다.

728x90
Comments