📌 서론
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
- blocking과 non-blocking 모두 사용되도록 설계된 웹 서버이다. 주요 기능은 아래와 같다.
- 대규모 트래픽으로부터 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')
구동 모습
📌 참고 자료
'Spring' 카테고리의 다른 글
🤔 @RequestBody - DTO, Map 무엇을 선택할까? (0) | 2020.11.18 |
---|---|
🤔 @Component, @Bean, @Configuration 차이는 무엇일까? (0) | 2020.11.15 |
❓ @Controller, @RestController 차이점 (0) | 2020.03.20 |
⏰ WebTestClient Timeout (0) | 2020.03.20 |
👐 OSIV(Open Session In View) (0) | 2020.03.20 |