-
🐱 Tomcat
스프링 부트에서는 기본적으로 내장 서버로 톰캣을 사용한다.
📖 내장 서버(Embedded server)를 사용하는 이유
- 애플리케이션을 더 쉽게 개발하고 배포할 수 있도록 도와준다.
- 개발 및 테스트 용이
- 내장 서버를 사용하면 별도의 WAS를 설치하거나 구성할 필요가 없다.
- 따라서, 애플리케이션을 개발 및 테스트하는데 훨씬 용이
- 애플리케이션 개발 과정에서 코드를 수정하면 서버를 다시 시작해 변경 사항을 반영할 수 있다.
- 단일 패키지 배포
- 내장 서버를 사용 시, 애플리케이션과 서버가 단일 패키지로 묶여 있어 애플리케이션을 쉽게 배포할 수 있다.
- 서버를 설치하거나 구성하는데 필요한 복잡성이 줄어들고 배포 프로세스가 간소화된다.
- 높은 이식성
- 내장 서버를 사용하면 애플리케이션을 다른 환경으로 이식하기가 더 쉽다.
- 실행 환경에 따라 내장 서버를 변경하거나 설정을 변경하여 애플리케이션을 배포할 수 있다.
- 성능 및 안정성
- 애플리케이션을 실행하는데 필요한 서버 프로세스를 단일 프로세스로 관리한다.
- 따라서, 애플리케이션의 성능과 안정성이 향상된다.
- 내장 서버는 특정 서버에서 실행되는 애플리케이션과 달리 애플리케이션과 서버가 동일한 JVM에서 실행되 네트워크 오버헤드가 줄어들고 성능이 향상된다.
⭐️ 내장 서버를 사용하면 애플리케이션을 더 쉽게 개발하고 배포할 수 있다.
⭐️ 더 높은 이식성과 성능 / 안정성을 제공한다.
🧐 아파치 (Apache)란?
아파치는 아파치 소프트웨어 재단에서 관리하는 HTTP 웹 서버이다.
- HTTP 서버로 다양한 추가 기능을 제공
- 구축이 쉽다
- 80포트 사용
⇒ 클라이언트에서 요청하는 HTTP 요청을 처리하는 웹서버
- 정적 타입(HTML, CSS, 이미지 등)의 데이터만을 처리한다.
🔥 Tomcat
톰캣은 아파치 소프트웨어 재단의 웹 애플리케이션 서버이다(WAS)
- 가장 일반적이로 많이 사용되는 WAS
- 자바 서블릿을 실행
- JSP 코드가 포함되어 있는 웹 페이지를 만들어 준다.
- 8080 포트 사용
🆚 Apache 와 Tomcat
톰캣이 아파치의 기능(웹 서버의 기능)을 지원한다.
하지만, 톰캣의 웹 서버 기능은 아파치 웹 서버보다 느리다.
- 웹의 모든 정적/동적 데이터를 WAS가 처리하면 사용자의 요청에 대한 응답이 느려지게 된다.
또한, 아파치의 모든 기능을 제공하지는 않는다.
- 특수 상황에서 아파치 톰캣만으로 구현이 어렵다.
일반적으로 아파치는 프록시 서버로 사용되어 클라이언트의 요청을 받아들이고, 톰캣과 같은 백엔드 서버로 요청을 전달한다.
⇒ 아파치는 정적인 파일들을 처리
⇒ 동적인 콘텐츠를 생성하는데는 톰캣과 같은 백엔드 서버에게 요청을 전달하여 처리하게 된다.
⇒ 아파치와 톰캣 각각 자신의 역할을 수행하면서 웹 서버의 성능을 높일 수 있다.
❓왜 톰캣이 스프링 부트의 기본 내장 서버일까
📖 기본 설정이 편리하다.
- 개발자가 별도의 서버를 설치하거나 구성할 필요가 없다.
📖 안정적이고 범용적이다.
- 톰캣은 이미 많은 사용자들이 사용해왔기 때문에 안정성이 검증되어 있다.
- 또한, 톰캣은 꾸준히 버전 업데이트가 이루어져 보안 이슈나 버그등에 대한 대처가 빠르다.
📖 호환성
- 톰캣은 Java Servlet API, JSP API 등과 호환성이 뛰어나다
📖 설정 용이
- 설정이 비교적 간단하다
📖 적절한 성능
- 톰캣은 동시에 처리 가능한 요청 수가 많아 대규모 웹 애플리케이션에 적합하다.
- 스프링 부트는 Tomcat의 NIO 기능을 활용해 비동기 I/O를 처리해 좋은 성능을 낸다.
🌟 스프링 부트는 기본 설정이 편리하고 안정적이며 범용적인 서버인 톰캣을 내장 서버로 사용한다.
🧾 다른 내장 서버
📍 제티(Jetty)
Jetty는 Eclipse Foundation에서 개발한 Java 웹 애플리케이션 서버이다.
특징
- Jetty는 빠른 시작 시간과 작은 메모리 풋프린트를 가지고 있다.
- 서블릿 컨테이너와 웹 서버를 함께 제공하여, 비동기 요청을 처리를 지원하기 때문에 대규모 트래픽 처리에 적합하다.
📍 언더토(Undertow)
Undertow는 Red Hat에서 개발한 경량 Java 웹 애플리케이션 서버이다.
특징
- 높은 처리량과 낮은 지연 시간을 가지고 있다.
- 비동기 요청 처리를 지원
- WebSocket 및 HTTP/2 프로토콜을 지원해 성능 및 확장성이 뛰어나다.
📍 네티(Netty)
Netty는 JBoss에서 개발한 네트워크 프레임워크이다.
특징
- 다양한 프로토콜을 지원한다.
- TCP 및 UDP 기반의 비동기 네트워크 애플리케이션을 개발할 수 있다.
- TCP, UDP, HTTP, WebSocktes
- 이벤트 기반
- Netty는 이벤트 기반으로 구성되어 네트워크 입출력 처리 시 이벤트를 처리하는 핸들러를 구현할 수 있다.
- 네트워크 I/O 처리를 위해 NIO API를 사용한다.
- 비동기 I/O를 사용하기 때문에 네트워크 입출력을 처리하는데 소요되는 시간을 최소화
- 대규모 트래픽 처리 및 고성능 네트워크 애플리케이션 개발에 적합하다.
- 높은 성능을 제공
대규모 트래픽을 좀 더 효율적으로 처리할 수 있는 서버를 개발하기 위해 많은 사람들이
Tomcat + Spring MVC 환경에서 Netty + Spring Webflux 전환을 고려한다.
참고자료
https://byul91oh.tistory.com/65
'🌱 spring' 카테고리의 다른 글
@TransactionalEventListener 적용해보기 😎 (0) 2024.03.17 🍀 MongoDB - QueryDsl with Spring (0) 2023.05.30 ThreadLocal (0) 2023.01.18 🌊 Connection Pool (0) 2023.01.13 JDBC ❓ (0) 2023.01.13