Spring Boot 3.4 + AWS 환경 Tomcat vs JBoss WildFly 성능 비교 분석
개요
클라우드 환경에서 Spring Boot 애플리케이션을 운영할 때 적절한 WAS(웹 애플리케이션 서버) 선택은 성능, 비용, 안정성에 직접적인 영향을 미치는 중요한 결정입니다. Spring Boot 3.4는 가상 스레드, HTTP/3 지원, AOT 컴파일과 같은 새로운 기능을 제공하며, 이러한 기능들이 각 WAS 환경에서 어떻게 작동하는지 이해하는 것이 핵심입니다.
이 글에서는 AWS 클라우드의 다양한 서비스(EC2, ECS, EKS, Lambda 등)에서 Apache Tomcat과 JBoss WildFly의 실제 성능을 비교 분석하고, 실무 환경에 최적화된 WAS 선택 기준을 제시합니다.

Spring Boot 애플리케이션을 위한 WAS를 선택할 때는 각 서버의 핵심 특성과 강점을 명확히 이해해야 합니다. Tomcat과 WildFly는 설계 철학부터 제공하는 기능까지 큰 차이를 보입니다.
Apache Tomcat은 경량화와 단순성에 초점을 맞춘 서블릿 컨테이너입니다. Spring Boot 3.4는 Tomcat 10.1.19를 기본 내장 서버로 사용합니다.
① 경량 설계: 최소한의 메모리로 빠르게 시작 가능하며, 기본 메모리 사용량은 약 320MB 수준입니다.
② 클라우드 친화적: 컨테이너화와 서버리스 환경에 최적화되어 있으며, 콜드 스타트 시간이 4~5초로 매우 짧습니다.
③ Spring Boot 통합: 별도 설정 없이 즉시 사용 가능하며, Spring Boot 3.4의 가상 스레드와 완벽하게 통합됩니다.
④ 간편한 설정: application.properties 파일만으로 대부분의 설정이 가능합니다.
① 고급 엔터프라이즈 기능이 제한적이며, 분산 트랜잭션이나 고급 클러스터링은 외부 솔루션이 필요합니다.
② 내장 관리 콘솔이 없어 외부 모니터링 도구에 의존해야 합니다.
JBoss WildFly는 Red Hat의 풀스택 Jakarta EE 애플리케이션 서버로, 다양한 엔터프라이즈 기능을 내장하고 있습니다. Spring Boot 3.4와 호환되는 최신 버전은 WildFly 30.0.1.Final입니다.
① 완전한 Jakarta EE 구현: JPA, JMS, JTA 등 모든 엔터프라이즈 기능을 기본 제공합니다.
② 고급 클러스터링: Infinispan 기반의 분산 캐싱과 세션 복제 기능이 내장되어 있습니다.
③ 관리 콘솔: 웹 기반 관리 인터페이스를 통해 상세한 모니터링과 설정이 가능합니다.
④ HTTP/3 완전 지원: Undertow 기반으로 QUIC 프로토콜을 포함한 전체 HTTP/3 스택을 지원합니다.
① 높은 리소스 요구사항으로 기본 메모리 사용량이 약 580MB에 달합니다.
② 시작 시간이 길어 EC2 환경에서도 12~13초가 소요되며, Lambda 환경에는 부적합합니다.
Spring Boot 3.4의 주요 신기능에 대한 두 WAS의 지원 수준을 비교하면 다음과 같습니다.
| 기능 | Tomcat | WildFly |
|---|---|---|
| 가상 스레드 지원 | 완전 지원 | 지원 (Undertow 기반) |
| HTTP/3 지원 | 부분 지원 | 완전 지원 |
| 스프링 네이티브 | 완전 지원 | 제한적 지원 |
| AOT 컴파일 | 완전 지원 | 제한적 지원 |
| 리액티브 스트림 | 지원 | 지원 |
Tomcat은 Spring Boot 3.4의 최신 기능들과 더 긴밀하게 통합되어 있으며, 특히 가상 스레드와 AOT 컴파일에서 뛰어난 성능을 보입니다.
공정한 비교를 위해 동일한 하드웨어 환경과 워크로드에서 포괄적인 성능 테스트를 수행했습니다. 모든 테스트는 실제 프로덕션 환경을 시뮬레이션했습니다.
① 인스턴스 타입: m6i.2xlarge (8 vCPU, 32GB RAM)
② 네트워크: 향상된 네트워킹 활성화
③ 스토리지: gp3 EBS 볼륨 (5000 IOPS)
① 운영체제: Amazon Linux 2023
② JDK: Amazon Corretto 21.0.2
③ Spring Boot: 3.4.0
④ Tomcat: 10.1.19 (Spring Boot 내장)
⑤ WildFly: 30.0.1.Final
⑥ 데이터베이스: Amazon RDS PostgreSQL 15.5
다양한 부하 상황에서 응답 시간을 측정한 결과는 다음과 같습니다.
| 테스트 시나리오 | Tomcat 평균 응답시간 | WildFly 평균 응답시간 | 우위 |
|---|---|---|---|
| 단순 요청 (200 동시 사용자) | 28ms | 42ms | Tomcat 33% 우수 |
| 복합 요청 (200 동시 사용자) | 120ms | 115ms | WildFly 4% 우수 |
| 고부하 (2000 동시 사용자) | 210ms | 185ms | WildFly 12% 우수 |
핵심 인사이트: 낮은 부하에서는 Tomcat이 우수하지만, 고부하 상황이나 복잡한 트랜잭션에서는 WildFly의 고급 스레드 관리가 효과를 발휘합니다.
| 환경 | Tomcat | WildFly | 차이 |
|---|---|---|---|
| 일반 스레드 (초당 요청) | 12,500 | 10,800 | Tomcat 16% 우수 |
| 가상 스레드 활성화 (초당 요청) | 28,600 | 22,400 | Tomcat 28% 우수 |
| 가상 스레드 성능 향상율 | 129% | 107% | Tomcat 더 큰 향상 |
① Tomcat 기본 메모리: 320MB (시작 후)
② WildFly 기본 메모리: 580MB (시작 후)
③ Tomcat 고부하 최대: 1.2GB
④ WildFly 고부하 최대: 1.9GB
Tomcat은 메모리 효율성에서 약 45% 우수하며, 이는 컨테이너 환경에서 더 높은 밀도로 배포할 수 있음을 의미합니다.
| 성능 지표 | Tomcat | WildFly | 차이 |
|---|---|---|---|
| 컨테이너 시작 시간 | 8.5초 | 22.3초 | Tomcat 62% 빠름 |
| 최대 처리량 (TPS) | 16,200 | 12,800 | Tomcat 27% 우수 |
| 메모리 사용량 | 1.8GB | 3.2GB | Tomcat 44% 효율적 |
① Pod 시작 시간: Tomcat 15초 vs WildFly 42초
② 수평 확장 지연: Tomcat 35초 vs WildFly 85초
③ 롤링 업데이트 시간: Tomcat 3분 20초 vs WildFly 8분 45초
Kubernetes 환경에서는 Tomcat의 빠른 시작 시간이 결정적 장점으로 작용하여 오토스케일링 효율성이 크게 향상됩니다.
① Tomcat 콜드 스타트: 5.8초 (실용적)
② WildFly 콜드 스타트: 30초 이상 (Lambda 환경에 부적합)
결론: Lambda 환경에서는 Tomcat만 실용적으로 사용 가능하며, WildFly는 콜드 스타트 시간과 메모리 요구사항으로 인해 권장되지 않습니다.
각 WAS의 성능을 극대화하기 위한 실무 최적화 설정을 제공합니다. 모든 설정은 AWS 클라우드 환경에 최적화되어 있습니다.
spring.threads.virtual.enabled=true
# Tomcat 스레드 풀 설정
server.tomcat.threads.max=400
server.tomcat.threads.min-spare=50
# 연결 관리
server.tomcat.max-connections=10000
server.tomcat.accept-count=1500
# Keep-Alive 설정 (ELB 최적화)
server.tomcat.connection-timeout=20000
server.tomcat.keep-alive-timeout=60000
server.tomcat.max-keep-alive-requests=100
# 압축 설정
server.compression.enabled=true
server.compression.min-response-size=2048
JAVA_OPTS="-Xms2g -Xmx4g"
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseStringDeduplication"
# 컨테이너 인식 설정
JAVA_OPTS="$JAVA_OPTS -XX:MaxRAMPercentage=75.0"
# OOM 발생 시 자동 종료
JAVA_OPTS="$JAVA_OPTS -XX:+ExitOnOutOfMemoryError"
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default"
socket-binding="http"
max-connections="15000"
max-post-size="10485760"/>
</server>
</subsystem>
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"
JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=200"
# 문자열 중복 제거
JAVA_OPTS="$JAVA_OPTS -XX:+UseStringDeduplication"
# IPv4 우선 사용
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
<stacks>
<stack name="tcp">
<transport type="TCP"
socket-binding="jgroups-tcp"/>
<!-- AWS 환경용 JDBC_PING 설정 -->
<protocol type="JDBC_PING">
<property name="datasource_jndi_name">
java:jboss/datasources/PingDS
</property>
</protocol>
</stack>
</stacks>
</subsystem>
"family": "spring-boot-tomcat",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "1024",
"memory": "2048",
"containerDefinitions": [{
"name": "app",
"image": "your-ecr-repo/spring-boot-app:latest",
"environment": [
{
"name": "SPRING_THREADS_VIRTUAL_ENABLED",
"value": "true"
},
{
"name": "JAVA_OPTS",
"value": "-XX:MaxRAMPercentage=75.0"
}
],
"healthCheck": {
"command": [
"CMD-SHELL",
"curl -f http://localhost:8080/actuator/health || exit 1"
],
"interval": 30,
"timeout": 5,
"retries": 3
}
}]
}
실제 운영 환경에서 WAS 선택이 AWS 비용에 미치는 영향을 분석하고, 상황별 최적의 선택 기준을 제시합니다.
동일한 워크로드(월간 5억 요청 처리 기준)에서 두 WAS의 비용을 비교했습니다.
| AWS 서비스 | Tomcat 월 비용 | WildFly 월 비용 | 비용 차이 |
|---|---|---|---|
| EC2 인스턴스 기반 | $1,850 | $2,450 | Tomcat 24% 저렴 |
| ECS Fargate | $2,100 | $3,200 | Tomcat 34% 저렴 |
| EKS 클러스터 | $2,450 | $3,350 | Tomcat 27% 저렴 |
Tomcat은 모든 AWS 서비스에서 24~34% 비용 절감 효과를 제공하며, 특히 컨테이너 기반 환경에서 비용 우위가 두드러집니다.
① Tomcat: 더 작은 인스턴스 타입으로 동일 성능 달성
② WildFly: 메모리 최적화 인스턴스(r6g, x2g) 필요
① Tomcat의 빠른 시작 시간으로 불필요한 대기 인스턴스 수를 줄일 수 있어 25~30% 추가 비용 절감
② WildFly는 긴 시작 시간으로 인해 더 많은 버퍼 인스턴스 필요
① Tomcat은 빠른 시작으로 Spot 인스턴스 중단 시 빠른 복구 가능
② 테스트 결과 Tomcat 환경에서 Spot 인스턴스 사용 시 추가 40~50% 비용 절감 가능
① 마이크로서비스 아키텍처
- 경량 컨테이너와 빠른 배포 주기가 중요
- 수평 확장을 통한 부하 분산
- 독립적인 서비스 단위로 개발 및 운영
② 서버리스 및 이벤트 기반 아키텍처
- AWS Lambda, AWS App Runner 사용
- 빈번한 콜드 스타트 발생
- 이벤트 기반 트리거 처리
③ 컨테이너 기반 배포
- ECS, EKS, Fargate 환경
- 빈번한 스케일링과 롤링 업데이트
- 높은 컨테이너 밀도 필요
④ 비용 최적화가 우선
- 스타트업이나 예산 제약이 있는 프로젝트
- Spot 인스턴스 활용 전략
- 리소스 효율성 극대화 필요
① 엔터프라이즈 모놀리식 애플리케이션
- 완전한 Jakarta EE 스펙 필요
- JMS, JTA 등 고급 기능 활용
- 레거시 시스템과의 호환성 중요
② 복잡한 트랜잭션 처리
- 분산 트랜잭션(XA) 필요
- 복수 데이터베이스 간 일관성 유지
- 메시징 시스템과의 트랜잭션 통합
③ 고가용성 클러스터링
- 내장 세션 복제 기능 활용
- 다중 AZ 배포에서 상태 유지
- Infinispan 분산 캐싱 필요
④ JBoss EAP에서 마이그레이션
- 기존 JBoss EAP 사용 조직
- 오픈소스 전환 전략
- 최소한의 애플리케이션 수정으로 이전
| AWS 서비스 | 권장 WAS | 핵심 이유 |
|---|---|---|
| EC2 | 워크로드 기반 | 애플리케이션 특성에 따라 선택 |
| ECS/Fargate | Tomcat | 60% 빠른 시작, 44% 낮은 메모리 |
| EKS | Tomcat | 효율적인 Pod 라이프사이클 |
| Lambda | Tomcat 전용 | 실용적인 콜드 스타트 시간 |
| Elastic Beanstalk | Tomcat | 기본 지원 환경, 빠른 배포 |
| App Runner | Tomcat | 빠른 시작, 리소스 효율성 |
A: 가상 스레드 환경에서는 Tomcat이 20~30% 더 우수한 성능을 보입니다. Tomcat은 Spring Boot 3.4의 가상 스레드 최적화와 긴밀하게 통합되어 있으며, 테스트 결과 처리량이 129% 향상되었습니다(WildFly는 107%). 특히 I/O 집약적인 작업에서 Tomcat의 경량 아키텍처가 가상 스레드의 장점을 극대화합니다.
A: 기술적으로는 가능하지만 실용적이지 않습니다. WildFly 기반 Lambda 함수는 30초 이상의 콜드 스타트 시간이 소요되며, 높은 메모리 요구사항으로 비용이 급증합니다. 테스트 결과 Tomcat 기반 Lambda는 5.8초의 콜드 스타트로 실용적이지만, WildFly는 Lambda의 기본 타임아웃 한계에 근접하여 권장되지 않습니다.
A: WildFly가 세션 관리에서 강점을 보입니다. Infinispan 기반의 고급 클러스터링과 세션 복제 기능을 내장하여 별도의 외부 세션 스토어 없이도 효율적인 관리가 가능합니다. Tomcat은 ElastiCache(Redis)를 별도로 구성해야 하지만, 이 또한 실무에서 검증된 안정적인 방식입니다. 엔터프라이즈급 세션 일관성이 중요하다면 WildFly를, 단순성과 클라우드 네이티브 접근을 선호한다면 Tomcat + ElastiCache 조합이 적합합니다.
A: AOT 컴파일은 Tomcat에서 더 효과적입니다. Spring Boot의 AOT는 내장 Tomcat과 완벽하게 통합되어 시작 시간과 메모리 사용량을 크게 줄입니다. WildFly에서도 적용 가능하지만 모듈식 아키텍처와 전체 Jakarta EE 스택으로 인해 AOT 이점이 제한됩니다. GraalVM Native Image 생성 시 Tomcat 기반 애플리케이션이 더 작은 바이너리와 빠른 시작 시간(2초 이내)을 제공합니다.
A: EKS 환경에서는 다음 요소를 고려해야 합니다.
① Pod 시작 시간: Tomcat 15초 vs WildFly 42초
② 리소스 요구사항: Tomcat은 더 적은 CPU/메모리로 운영 가능
③ HPA 효율성: 빠른 시작 시간이 오토스케일링에 결정적
④ 롤링 업데이트: Tomcat은 3분 20초, WildFly는 8분 45초 소요
대부분의 클라우드 네이티브 워크로드에서 Tomcat이 적합하지만, 상태 유지(stateful) 워크로드나 복잡한 트랜잭션이 필요하면 WildFly를 고려할 수 있습니다.
A: HTTP/3는 WildFly에서 더 완전하게 구현되어 있습니다. WildFly 30+는 Undertow를 통해 QUIC 프로토콜을 포함한 전체 HTTP/3 스택을 네이티브로 지원합니다. Tomcat 10.1은 실험적 지원을 제공하지만 일부 기능이 제한적입니다. 다만 AWS 환경에서는 일반적으로 ALB나 CloudFront가 HTTP/3 연결을 처리하고 백엔드 WAS와는 HTTP/2로 통신하므로, 실제 애플리케이션 성능 차이는 크지 않을 수 있습니다.
A: 비용 최적화를 위한 전략은 다음과 같습니다.
① Tomcat + Graviton 인스턴스: ARM 기반 인스턴스로 추가 20% 비용 절감
② Spot 인스턴스 활용: Tomcat의 빠른 시작으로 Spot 중단 시 빠른 복구, 40~50% 절감
③ Fargate Spot: ECS Fargate Spot으로 최대 70% 절감
④ 오토스케일링 최적화: 빠른 시작 시간으로 버퍼 인스턴스 최소화
⑤ Savings Plans: 안정적인 워크로드에 1년/3년 약정으로 추가 절감
Tomcat을 선택하고 위 전략을 조합하면 WildFly 대비 최대 60~70% 비용 절감이 가능합니다.
A: 반드시 변경할 필요는 없지만 검토는 필요합니다. 다음 경우에는 WildFly를 유지하는 것이 합리적입니다.
① Jakarta EE 전체 스펙을 활용하는 복잡한 애플리케이션
② 분산 트랜잭션(XA) 또는 JMS를 광범위하게 사용
③ 마이그레이션 비용과 위험이 비용 절감 효과를 상회
하지만 다음 경우에는 Tomcat으로 전환을 권장합니다.
① WildFly 고급 기능을 실제로 활용하지 않는 경우
② 컨테이너 또는 서버리스로 현대화 계획이 있는 경우
③ 클라우드 비용 최적화가 중요한 경우
점진적 마이그레이션 전략으로 일부 서비스부터 Tomcat으로 전환하여 효과를 검증한 후 확대하는 것이 안전합니다.
Spring Boot 3.4와 AWS 클라우드 환경에서 Tomcat과 JBoss WildFly의 성능을 종합 비교한 결과, 대부분의 클라우드 네이티브 워크로드에서는 Tomcat이 더 효율적인 선택임을 확인했습니다.
Tomcat의 핵심 장점
① 리소스 효율성 45% 우수 (메모리 사용량 기준)
② 시작 시간 60~65% 단축
③ 가상 스레드 환경에서 129% 성능 향상
④ 클라우드 비용 25~35% 절감
⑤ 컨테이너와 서버리스 환경에 최적화
WildFly가 유리한 경우
① 복잡한 엔터프라이즈 트랜잭션 관리
② 완전한 Jakarta EE 스펙 활용
③ 고부하 상황에서 안정적인 성능
④ 내장 클러스터링과 세션 복제 필요
최종적으로 WAS 선택은 애플리케이션의 요구사항, 워크로드 특성, 비용 우선순위를 종합적으로 고려해야 합니다. 마이크로서비스, 컨테이너, 서버리스 환경에서는 Tomcat이, 엔터프라이즈 모놀리식 애플리케이션에서는 WildFly가 적합합니다.
이 글에서 제공한 성능 데이터와 최적화 전략을 참고하여 프로젝트에 가장 적합한 WAS를 선택하시기 바랍니다.
끝.
'Development > Web' 카테고리의 다른 글
| [Web] Apache Airflow 워크플로우 자동화 방법 (0) | 2025.10.30 |
|---|---|
| [Web] Apache Kafka 완벽 가이드 (0) | 2025.10.24 |
| [Web] JEUS DB Connection Leak 완벽 해결 방법 (0) | 2024.07.24 |
| [Web] Spring Dispatcher Servlet 정의와 동작 원리 (0) | 2022.09.24 |
| [Web] Spring Framework vs Spring Boot 핵심 차이점 완벽 비교 (0) | 2022.09.24 |