본문 바로가기

Spring

👨🏻‍💻 Undertow 적용하기 (다른 WAS 적용해보기)

📌 서론

SpringBoot를 사용하면서 내장 WAS가 디폴트로 설정되어 있는 Tomcat 이외에 다른 WAS를 사용해보겠다는 생각이 다소 없었던 것 같다.

SpringBoot 관련 스터디를 진행하면서 아래와 같은 피드백을 받았고, 이번 기회에 다른 WAS를 적용해보려고 한다.


📌 Tomcat, Jetty, Netty, Undertow

Tomcat, Jetty, Netty는 자세히는 몰라도 한 번씩은 들어봤다. 사실 Undertow는 처음 들어봤다.

피드백 중에 Undertow를 왜 적용 해보라고 하는 것일까? 라는 생각과, Tomcat 보다 장점이 있기 때문이지 않을까? 라고 생각했다.

그래서 그냥 사용하기 보다 다른 선택지들을 비교하며 사용해보려고 한다.

Tomcat

  • 커뮤니티가 활발하며, 자바 진영에서 가장 많이 사용되고 있는 WAS이다.
  • 스프링부트에서 기본 내장 WAS로 설정되어 있다.
  • Tomcat을 서비스에 사용하기에 무리가 있다고 하는 개발자도 보인다.
  • Tomcat 8.5부터 좋아졌다고 하지만 여전히 문제점이 존재하는 것으로 보인다.

아래와 같이 Tomcat을 따로 추가하지 않아도 기본적으로 Tomcat이 설정된다.

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

 

implementation('org.springframework.boot:spring-boot-starter-web')

Jetty

  • 적은 메모리를 사용하여 가볍고, 빠르다.
  • 경량 WAS라고도 불린다.
  • 규모가 있는 프로젝트에 적용하기엔 무리가 있지만, 자신의 상황에 맞게 선택하는 것이 좋다.
<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-jetty</artifactId>
</dependency>

 

implementation('org.springframework.boot:spring-boot-starter-web') {
	exclude module: 'spring-boot-starter-tomcat'
}
implementation('org.springframework.boot:spring-boot-starter-jetty')

Netty

  • Async, Event-Driven 방식의 네트워크 애플리케이션 프레임워크이다.
  • Netty는 Spring WebFlux에서 기본 내장 WAS으로 제공된다.
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

 

implementation('org.springframework.boot:spring-boot-starter-webflux')

Undertow

  • JBoss는 J2EE 규격을 모두 만족하는 WAS를 제공하는데 최근 Tomcat을 버리고 Netty를 기반으로 Undertow를 만들었다.
  • Undertow를 공식 문서에서 아래와 같이 소개하고 있다.
    • blocking과 non-blocking 모두 사용되도록 설계된 웹 서버이다. 주요 기능은 아래와 같다.
      • High Performance
      • Embeddable
      • Servlet 4.0
      • Web Sockets
      • Reverse Proxy
  • 대규모 트래픽으로부터 Tomcat보다 안정적이라고 평가를 받고 있다.
  • 벤치마크 테스트에서 안정성을 증명한 사례가 많이 보이고 있다. (Tomcat과 Undertow 비교)

org.springframework.boot.autoconfigure.web.servlet에서 ServletWebServerFactoryAutoConfiguration.java 를 열어보면

아래와 같이 SpringBoot는 Tomcat, Jetty와 더불어 Undertow를 내장 WAS로 쉽게 설정할 수 있게 지원하고 있다.

...
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class, EmbeddedTomcat.class, EmbeddedJetty.class, EmbeddedUndertow.class})
public class ServletWebServerFactoryAutoConfiguration {
...

📌 Undertow 적용하기

비교하고 보니 디폴트로 제공하는 Tomcat보다 Undertow가 더 낫다고 생각이 든다.
(Spring WebFlux에서 기본 내장 WAS를 Netty로 제공하는 것을 보면, Tomcat의 시대는 지나지 않을까..?)

Undertow는 아래와 같이 설정하면 사용할 수 있다.

<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>

 

implementation('org.springframework.boot:spring-boot-starter-web') {
	exclude module: 'spring-boot-starter-tomcat'
}
implementation('org.springframework.boot:spring-boot-starter-undertow')

 

구동 모습

Tomcat 적용
Undertow 적용


📌 참고 자료

 

Undertow

There are two ways to end an exchange, either by fully reading the request channel, and calling shutdownWrites() on the response channel and then flushing it, or by calling HttpServerExchange.endExchange(). When endExchange() is called Undertow will check

undertow.io

 

Spring Boot 공식 지원 내장 WAS 인 Undertow 을 씁시다.

Java 가 Web 개발에서 두각을 나타내면서 WAS(Web Application Server) 라는 용어를 널리 사용하게 만들었습니다. 처음의 의도와 달리 WAS 을 지칭하는 의미는 점차 확대되었고, Java 에서는 Apache Tomcat(이하 T

zepinos.tistory.com

 

Undertow 와 Tomcat 의 간단한 비교

2019/01/23 - [Programming/Java] - Spring Boot 공식 지원 내장 WAS 인 Undertow 을 씁시다. 이전에 Spring Boot 에서 Embedded Tomcat 대신에 Undertow 을 사용하자고 글을 작성한 적이 있습니다. 글의 내용에..

zepinos.tistory.com

 

Spring Boot 내장 WAS 종류와 특징

스프링 부트 내장 WAS의 종류와 특징입니다. 최대한 쉽게 적어봤어요. Tomcat ~7버전까지 대규모 트래픽에서 불안정하다 vs 아니다 등의 의견이 분분했고, 8버전은 폭망했지만, 8.5버전으로 대응하여

gofnrk.tistory.com

 

JBOSS

오픈소스 미들웨어 – 제이보스(JBoss) 제이보스(JBoss)는 자바를 기반으로 하는 오픈 소스 미들웨어의 총칭으로, 대표적으로는 Java EE 스펙을지원하는 제이보스 애플리케이션 서버가 있다. Ja

creator0609.tistory.com