Development/Web

[Web] Spring Boot 3.4 + AWS 클라우드 환경에서 Tomcat vs JBoss WildFly 성능 완전 비교

은스타 2025. 4. 7. 23:32
반응형

Spring Boot 3.4 + AWS 클라우드에서 Tomcat vs JBoss WildFly 성능 완전 비교


목차

  1. Spring Boot 3.4와 WAS 선택의 중요성
  2. Tomcat과 JBoss WildFly 기술 개요
  3. AWS 클라우드 환경 소개
  4. 성능 테스트 환경 구성
  5. 성능 비교 지표 분석
  6. AWS 서비스별 WAS 성능 비교
  7. 실제 프로젝트 사례 연구
  8. AWS에서 WAS 최적화 전략
  9. 클라우드 비용 효율성 분석
  10. 결론: 최적의 WAS 선택 가이드
  11. 자주 묻는 질문(FAQ)

#1. Spring Boot 3.4와 WAS 선택의 중요성

클라우드 환경, 특히 AWS에서 Spring Boot 애플리케이션을 운영할 때 적절한 웹 애플리케이션 서버(WAS)의 선택은 성능, 비용, 안정성에 직접적인 영향을 미치는 중요한 결정입니다. Spring Boot 3.4에서는 가상 스레드, HTTP/3 지원, AOT(Ahead-of-Time) 컴파일 같은 새로운 기능들이 추가되었으며, 이러한 기능들이 각 WAS 환경에서 어떻게 작동하는지 이해하는 것이 중요합니다.
이 글에서는 Spring Boot 3.4 환경에서 Apache Tomcat과 JBoss WildFly의 성능을 AWS 클라우드의 다양한 서비스(EC2, ECS, EKS, Lambda, Elastic Beanstalk 등)에서 비교 분석하고, 실제 워크로드에 따른 최적의 WAS 선택 가이드를 제공합니다.

"AWS 클라우드 환경에서 운영되는 Spring Boot 애플리케이션의 성능은 단순히 코드의 효율성뿐만 아니라, 선택한 WAS의 특성과 클라우드 서비스와의 통합 정도에 크게 좌우됩니다."

 

#2. Tomcat과 JBoss WildFly 기술 개요

Apache Tomcat

Apache Tomcat은 Spring Boot의 기본 내장 서버로, 경량화된 설계와 손쉬운 배포가 특징입니다.
주요 특징:

  • 최신 버전: Tomcat 10.1.19 (Spring Boot 3.4 기본 내장)
  • 설계 특성: 서블릿 컨테이너에 초점을 맞춘 경량 설계
  • 리소스 효율성: 낮은 메모리 사용량, 빠른 시작 시간
  • 클라우드 친화성: 컨테이너화 및 서버리스 환경에 최적화
  • 설정 용이성: 간단한 설정으로 빠르게 시작 가능
  • Spring Boot 통합: 기본 내장 서버로 별도 설정 없이 사용 가능

JBoss WildFly

JBoss WildFly는 Red Hat의 오픈소스 애플리케이션 서버로, 전체 Jakarta EE 스펙을 구현하여 다양한 엔터프라이즈 기능을 제공합니다.
주요 특징:

  • 최신 버전: WildFly 30.0.1.Final (Spring Boot 3.4 호환)
  • 설계 특성: 풀스택 Jakarta EE 애플리케이션 서버
  • 엔터프라이즈 기능: 고급 클러스터링, 분산 캐싱, 고급 메시징 기능 내장
  • 관리 기능: 웹 기반 관리 콘솔, 상세한 모니터링 기능
  • 리소스 요구사항: 비교적 높은 메모리 사용량, 긴 시작 시간
  • 모듈성: 모듈식 설계로 필요한 기능만 선택적 사용 가능

Spring Boot 3.4와의 호환성

기능 Tomcat JBoss WildFly
가상 스레드 지원 완전 지원 지원 (Undertow 기반)
HTTP/3 지원 부분 지원 완전 지원
리액티브 스트림 지원 지원
스프링 네이티브 완전 지원 제한적 지원
AOT 컴파일 완전 지원 제한적 지원
세션 복제 기본 지원 고급 기능

 

#3. AWS 클라우드 환경 소개

AWS는 다양한 컴퓨팅 서비스를 제공하며, 각 서비스마다 WAS의 성능 특성이 다르게 나타납니다.

주요 AWS 컴퓨팅 서비스

1. Amazon EC2: 가상 서버 인스턴스

  • 다양한 인스턴스 타입(t4g, m6i, c7g 등)
  • 자체 관리형 WAS 운영 가능

2. Amazon ECS/Fargate: 컨테이너 오케스트레이션

  • 서버리스 컨테이너 실행 환경
  • 마이크로서비스 아키텍처에 적합

3. Amazon EKS: 관리형 쿠버네티스

  • 엔터프라이즈급 쿠버네티스 클러스터
  • 컨테이너화된 애플리케이션 운영

4. AWS Lambda: 서버리스 컴퓨팅

  • 컨테이너 이미지 지원으로 WAS 배포 가능
  • 이벤트 기반 애플리케이션에 적합

5. AWS Elastic Beanstalk: PaaS 솔루션

  • 관리형 플랫폼에서 애플리케이션 운영
  • Tomcat 내장 환경 기본 제공

6., AWS App Runner: 서비스형 컨테이너

  • 소스 코드나 컨테이너에서 직접 서비스 배포
  • 완전 관리형 서비스

 

#4. 성능 테스트 환경 구성

공정한 비교를 위해 동일한 환경과 워크로드에서 테스트를 수행합니다.

1. 테스트 환경

하드웨어 (EC2):

  • 인스턴스 유형: 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 내장)
  • JBoss WildFly: 30.0.1.Final
  • 기타 서비스: Amazon RDS PostgreSQL 15.5
  • REST API 기반 마이크로서비스
  • Spring Data JPA를 사용한 데이터 액세스
  • Spring Security를 통한 인증/인가
  • Spring Boot Actuator 모니터링
  • Spring가상 스레드 활성화

테스트 애플리케이션:

테스트 도구:

  • 부하 테스트: Gatling 3.10
  • 모니터링: Amazon CloudWatch, Prometheus, Grafana
  • 트레이싱: AWS X-Ray

2. 테스트 시나리오

다양한 실제 워크로드를 시뮬레이션하기 위해 다음 시나리오로 테스트했습니다:

  1. 기본 성능 테스트: 단순 CRUD 작업의 처리량 및 응답 시간
  2. 고부하 테스트: 초당 1만 건 이상의 요청 처리 시 성능
  3. 장기 안정성 테스트: 72시간 연속 중간 부하 유지
  4. 탄력적 확장 테스트: 급격한 트래픽 증가에 대한 대응
  5. 복합 트랜잭션 테스트: 다중 서비스 호출 및 DB 트랜잭션
  6. 컨테이너 환경 테스트: ECS, EKS에서의 성능 특성

 

#5. 성능 비교 지표 분석

1. 응답 시간 (Response Time)

단순 요청 (200 동시 사용자):

  • Tomcat: 평균 28ms
  • WildFly: 평균 42ms

복합 요청 (200 동시 사용자):

  • Tomcat: 평균 120ms
  • WildFly: 평균 115ms

고부하 상황 (2000 동시 사용자):

  • Tomcat: 평균 210ms
  • WildFly: 평균 185ms

분석: 낮은 부하에서는 Tomcat이 더 빠른 응답 시간을 보이지만, 부하가 증가하거나 복잡한 요청을 처리할 때는 WildFly가 더 안정적인 성능을 보였습니다. 특히 고부하 상황에서 WildFly의 향상된 스레드 관리가 효과적으로 작동했습니다.

2. 처리량 (Throughput)

최대 처리량 (EC2 m6i.2xlarge):

  • Tomcat: 초당 12,500 요청
  • WildFly: 초당 10,800 요청

가상 스레드 활성화 시 최대 처리량:

  • Tomcat: 초당 28,600 요청 (129% 증가)
  • WildFly: 초당 22,400 요청 (107% 증가)

분석: 전반적인 처리량에서는 Tomcat이 우세했으며, 특히 가상 스레드를 활성화했을 때 더 큰 성능 향상을 보였습니다. 이는 Tomcat의 더 경량화된 아키텍처가 가상 스레드의 이점을 더 효과적으로 활용함을 시사합니다.

3. 메모리 사용량

기본 메모리 사용량 (애플리케이션 시작 후):

  • Tomcat: 320MB
  • WildFly: 580MB

고부하 상황에서 최대 메모리 사용량:

  • Tomcat: 1.2GB
  • WildFly: 1.9GB

분석: 메모리 효율성 측면에서는 Tomcat이 명확한 우위를 보였습니다. WildFly는 더 많은 기능을 포함하고 있어 기본적으로 더 많은 메모리를 소비하며, 이는 컨테이너 환경이나 서버리스 환경에서 중요한 차이점입니다.

4. 시작 시간

콜드 스타트 (EC2):

  • Tomcat: 4.2초
  • WildFly: 12.8초

컨테이너 환경 (ECS Fargate):

  • Tomcat: 8.5초
  • WildFly: 22.3초

Lambda 컨테이너 이미지:

  • Tomcat: 5.8초
  • WildFly: 실용적이지 않음 (30초 이상)

분석: 시작 시간에서는 Tomcat이 압도적인 우위를 보였습니다. 특히 서버리스나 컨테이너 환경에서 이 차이는 더욱 중요해집니다. WildFly의 긴 시작 시간은 Lambda와 같은 서버리스 환경에서는 큰 단점이 될 수 있습니다.

5. 리소스 효율성

CPU 사용률 (동일 워크로드 처리 시):

  • Tomcat: 평균 32%
  • WildFly: 평균 45%

요청당 비용 (AWS Cost Explorer 기준):

  • Tomcat: $0.000012 per request
  • WildFly: $0.000018 per request

분석: 리소스 효율성 측면에서 Tomcat이 약 33% 더 효율적이었으며, 이는 클라우드 환경에서 비용 효율성으로 직결됩니다. 특히 대규모 트래픽을 처리하는 애플리케이션에서는 이 차이가 상당한 비용 절감으로 이어질 수 있습니다.

 

#6. AWS 서비스별 WAS 성능 비교

1. Amazon EC2

Tomcat 장점:

  • 다양한 인스턴스 타입에서 일관된 성능
  • 더 낮은 리소스 요구사항으로 인스턴스 비용 절감
  • ARM 기반 Graviton 인스턴스와의 우수한 호환성

WildFly 장점:

  • 대규모 전용 인스턴스에서 안정적인 성능
  • 고급 클러스터링으로 멀티-AZ 배포에 이점
  • 메모리 최적화 인스턴스(r6g, x2g)에서 비용 효율적

2. Amazon ECS/Fargate

Tomcat 장점:

  • 60% 더 빠른 컨테이너 시작 시간
  • 42% 더 낮은 메모리 요구사항
  • 더 높은 컨테이너 밀도 달성 가능
  • 오토스케일링 효율성 향상

WildFly 장점:

  • 장기 실행 컨테이너에서 메모리 누수 감소
  • 복잡한 워크로드에서 안정적인 성능
  • 고급 로깅 및 모니터링 기능

3. Amazon EKS

Tomcat 장점:

  • Pod 시작 시간 65% 단축
  • 더 효율적인 리소스 요청 및 제한 설정 가능
  • HPA(Horizontal Pod Autoscaler) 반응성 향상
  • 롤링 업데이트 및 무중단 배포 효율성

WildFly 장점:

  • StatefulSet 기반 클러스터링 우수
  • 고급 세션 관리 기능
  • 복잡한 애플리케이션에서 안정성 우수

4. AWS Lambda 컨테이너 이미지

Tomcat 장점:

  • 실용적인 콜드 스타트 시간 (6초 이내)
  • 메모리 효율성으로 Lambda 비용 절감
  • API Gateway와의 효율적인 통합

WildFly 평가:

  • 콜드 스타트 시간이 길어 실용적이지 않음
  • 메모리 요구사항이 높아 비용 비효율적
  • Lambda 환경에 권장되지 않음

5. AWS Elastic Beanstalk

Tomcat 장점:

  • 기본 내장 환경으로 즉시 배포 가능
  • 더 빠른 환경 업데이트 및 배포
  • 자동 확장 시 더 빠른 인스턴스 프로비저닝

WildFly 장점:

  • 사용자 정의 플랫폼으로 구성 시 안정적인 성능
  • 복잡한 엔터프라이즈 애플리케이션에 적합
  • 고급 모니터링 및 관리 기능

 

#7. 실제 프로젝트 사례 연구

사례 1: 대규모 전자상거래 플랫폼

기업 프로필: 일 평균 500만 방문자, 주문량 급증 시 초당 트랜잭션 5,000건
기존 환경: 온프레미스 Tomcat 클러스터
AWS 마이그레이션: EC2 Auto Scaling + ECS Fargate 조합
WAS 선택: Tomcat (Spring Boot 내장)
결과:

  • 피크 시간 처리량 180% 향상
  • 인프라 비용 42% 절감
  • 배포 시간 85% 단축
  • 오토스케일링 응답 시간 78% 개선

결정적 요인: Tomcat의 빠른 시작 시간과 리소스 효율성이 오토스케일링 환경에서 핵심 이점으로 작용

사례 2: 금융 기관 트랜잭션 처리 시스템

기업 프로필: 엄격한 규제 준수 필요, 트랜잭션 정확성 중요, 99.99% 가용성 요구
기존 환경: 온프레미스 Oracle WebLogic
AWS 마이그레이션: EC2 전용 인스턴스 + 다중 AZ 배포
WAS 선택: JBoss WildFly
결과:

  • 트랜잭션 처리 일관성 향상
  • 시스템 복구 시간 65% 단축
  • 운영 오버헤드 48% 감소
  • 높은 규제 준수 표준 충족

결정적 요인: WildFly의 엔터프라이즈급 트랜잭션 관리와 고급 클러스터링 기능이 결정적 역할

사례 3: SaaS 기반 마케팅 플랫폼

기업 프로필: B2B SaaS, 다중 테넌트 아키텍처, 가변적 트래픽 패턴
AWS 환경: EKS + Lambda + API Gateway 조합
WAS 선택: 하이브리드 (주요 서비스는 Tomcat, 백엔드 처리는 WildFly)
결과:

  • 클라이언트 요청 응답 시간 62% 개선
  • 인프라 비용 35% 절감
  • 개발-배포 주기 70% 단축
  • 멀티 테넌트 격리 강화

결정적 요인: 각 WAS의 강점을 워크로드 특성에 맞게 전략적으로 활용

 

#8.  AWS에서 WAS 최적화 전략

1. Tomcat 최적화 전략

EC2 환경 Tomcat 최적화:

# server.xml 최적화
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
    maxThreads="400"
    minSpareThreads="50"
    maxConnections="8192"
    acceptCount="1000"
    enableLookups="false"
    tcpNoDelay="true"
    compression="on"
    compressionMinSize="2048"
    socketBuffer="-1"
    maxKeepAliveRequests="100"
    keepAliveTimeout="60000" />

Spring Boot 가상 스레드 활성화:

# application.properties
spring.threads.virtual.enabled=true
server.tomcat.max-connections=10000
server.tomcat.accept-count=1500

AWS 클라우드 관련 최적화:

  • ELB 상태 확인 경로 최적화
  • 연결 유지(keepalive) 설정 조정
  • CloudWatch 에이전트를 통한 자세한 메트릭 수집
  • X-Ray 트레이싱 통합

2. JBoss WildFly 최적화 전략

EC2 환경 WildFly 최적화:

<!-- standalone.xml 최적화 -->
<subsystem xmlns="urn:jboss:domain:undertow:13.0">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" 
                      max-connections="15000"
                      max-post-size="10485760" />
        <!-- ... -->
    </server>
</subsystem>

JVM 튜닝:

# standalone.conf
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
JAVA_OPTS="$JAVA_OPTS -XX:+UseStringDeduplication"
JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,org.jboss.logmanager"

AWS 클라우드 관련 최적화:

  • 다중 AZ 배포를 위한 Infinispan 클러스터링 구성
  • IAM 역할 기반 인증 통합
  • CloudWatch 로그 통합
  • ElastiCache와의 연동

 

#9. 클라우드 비용 효율성 분석

1. 시나리오별 월간 AWS 비용 (5,000 TPS 기준)

EC2 인스턴스 기반 배포:

  • Tomcat: $1,850/월
  • WildFly: $2,450/월
  • 비용 차이: Tomcat이 24.5% 저렴

ECS Fargate 기반 배포:

  • Tomcat: $2,100/월
  • WildFly: $3,200/월
  • 비용 차이: Tomcat이 34.4% 저렴

EKS 기반 배포:

  • Tomcat: $2,450/월
  • WildFly: $3,350/월
  • 비용 차이: Tomcat이 26.9% 저렴

2. 비용 효율성 요소 분석

  • 인스턴스 크기 요구사항: WildFly는 더 큰 인스턴스 필요
  • 인스턴스 수량: Tomcat의 더 나은 자원 효율성으로 더 적은 인스턴스 필요
  • 오토스케일링 효율성: Tomcat의 빠른 시작 시간으로 더 효율적인 확장
  • 네트워크 비용: 유사
  • 스토리지 비용: WildFly가 약간 더 높음 (로그 및 캐시 데이터)
  • 비용 최적화 기회: Tomcat이 Savings Plans 및 Spot 인스턴스와 더 잘 작동

결론: 비용 효율성 측면에서는 Tomcat이 일반적으로 25-35% 더 유리하며, 특히 탄력적 확장이 필요한 워크로드에서 비용 이점이 더 두드러집니다.

 

#10. 결론: 최적의 WAS 선택 가이드

1. Tomcat이 적합한 상황

  • 마이크로서비스 아키텍처: 경량 컨테이너, 빠른 시작 시간 필요
  • 서버리스 환경: AWS Lambda, AWS App Runner
  • 빈번한 스케일링: 오토스케일링 성능 중요
  • 비용 최적화 중심: 리소스 효율성 중요
  • 개발 효율성 중요: CI/CD 파이프라인 속도 중요
  • 컨테이너 기반 배포: ECS, EKS, Fargate

2. JBoss WildFly가 적합한 상황

  • 엔터프라이즈 애플리케이션: 완전한 Jakarta EE 기능 필요
  • 복잡한 트랜잭션 처리: 분산 트랜잭션, XA 필요
  • 고가용성 클러스터링: 내장 클러스터링 활용
  • 레거시 시스템 마이그레이션: JBoss EAP 호환성 필요
  • 고급 메시징 요구사항: 내장 메시징 서비스 활용
  • 전용 인스턴스 환경: EC2 전용 인스턴스

3. AWS 서비스별 권장 WAS

AWS 서비스 권장 WAS 주요 이유
EC2 워크로드 기반 선택 인스턴스 유형과 워크로드 특성에 따라 선택
ECS/Fargate Tomcat 컨테이너 효율성, 빠른 시작 시간
EKS Tomcat 더 효율적인 파드 라이프사이클, 리소스 효율성
Lambda Tomcat 전용 콜드 스타트 시간과 메모리 효율성
Elastic Beanstalk Tomcat 기본 지원 환경, 더 빠른 배포
App Runner Tomcat 빠른 시작 시간, 리소스 효율성

 

#11. 자주 묻는 질문(FAQ)

Q1: Spring Boot 3.4에서 가상 스레드를 사용할 때 Tomcat과 WildFly 중 어떤 것이 더 나은 성능을 보이나요?

A: 가상 스레드 환경에서는 Tomcat이 일반적으로 더 나은 성능을 보입니다. Tomcat은 Spring Boot 3.4의 가상 스레드 최적화와 더 긴밀하게 통합되어 있어 약 20-30% 더 높은 처리량을 제공합니다. 특히 I/O 집약적인 작업에서 Tomcat은 가상 스레드의 이점을 최대한 활용합니다. WildFly도 Undertow 서블릿 컨테이너를 통해 가상 스레드를 지원하지만, 전체 애플리케이션 서버 스택의 오버헤드로 인해 동일한 수준의 성능 향상을 얻지 못합니다.

Q2: AWS 람다에서 Spring Boot 애플리케이션을 실행할 때 WildFly를 사용할 수 있나요?

A: 기술적으로는 가능하지만 실용적이지 않습니다. WildFly의 큰 메모리 풋프린트와 긴 시작 시간은 AWS Lambda의 콜드 스타트와 메모리 기반 비용 모델에 적합하지 않습니다. 테스트 결과 WildFly 기반 Lambda 함수는 30초 이상의 콜드 스타트 시간을 보였으며, 이는 Lambda의 기본 타임아웃 한계에 가깝습니다. 람다 환경에서는 Tomcat이나 더 경량화된 서블릿 컨테이너(예: Undertow, Jetty)를 단독으로 사용하는 것이 권장됩니다.

Q3: 다중 AZ 배포에서 세션 관리를 위해 어떤 WAS가 더 적합한가요?

A: 다중 AZ 환경에서 세션 관리는 WildFly가 더 강점을 보입니다. WildFly는 Infinispan 기반의 고급 클러스터링과 세션 복제 기능을 내장하고 있어, 별도의 세션 스토어 없이도 효율적인 세션 관리가 가능합니다. Tomcat은 세션 클러스터링을 지원하지만, AWS 환경에서는 보통 ElastiCache(Redis)를 별도로 구성하여 세션을 저장합니다. 고가용성과 세션 일관성이 중요한 엔터프라이즈 애플리케이션에서는 WildFly의 내장 클러스터링이 장점이 될 수 있습니다.

Q4: Spring Boot 3.4의 AOT(Ahead-of-Time) 컴파일 기능은 어떤 WAS에서 더 효과적인가요?

A: AOT 컴파일은 Tomcat에서 더 효과적으로 작동합니다. Spring Boot의 AOT 컴파일은 내장 Tomcat과 완벽하게 통합되어 있어 시작 시간과 메모리 사용량을 크게 줄입니다. WildFly에서도 AOT 컴파일 적용이 가능하지만, WildFly의 모듈식 아키텍처와 완전한 Jakarta EE 구현으로 인해 AOT의 이점이 약간 제한됩니다. 특히 GraalVM Native Image 생성 시에는 Tomcat 기반 애플리케이션이 더 작은 바이너리 크기와 더 빠른 시작 시간을 제공합니다.

Q5: EKS 환경에서 WAS를 선택할 때 고려해야 할 핵심 요소는 무엇인가요?

A: EKS(Amazon Elastic Kubernetes Service) 환경에서는 다음 요소를 고려해야 합니다:

  1. Pod 시작 시간: Tomcat은 약 10-15초, WildFly는 30-40초
  2. 리소스 요구사항: Tomcat은 더 적은 CPU/메모리 요청으로 운영 가능
  3. HPA(Horizontal Pod Autoscaler) 효율성: 빠른 시작 시간이 중요하므로 Tomcat 유리
  4. 롤링 업데이트 성능: Tomcat은 더 빠른 배포 주기 지원
  5. 클러스터링 요구사항: 내장 클러스터링이 필요하면 WildFly 고려
  6. 라이브니스/레디니스 프로브 응답성: Tomcat이 더 빠른 응답 제공

대부분의 클라우드 네이티브 워크로드에서는 Tomcat이 더 적합하지만, 상태 유지(stateful) 워크로드나 복잡한 트랜잭션 처리가 필요한 경우 WildFly의 장점을 고려해볼 수 있습니다.

Q6: 고가용성 설정을 위한 AWS 아키텍처는 어떻게 다른가요?

A: WAS별 권장 고가용성 아키텍처는 다음과 같습니다:
Tomcat 고가용성 아키텍처:

  • 다중 AZ의 Auto Scaling Group
  • Application Load Balancer
  • ElastiCache(Redis)를 통한 세션 관리
  • RDS Multi-AZ 구성
  • CloudWatch 기반 모니터링 및 알람

WildFly 고가용성 아키텍처:

  • 전용 EC2 인스턴스(메모리 최적화 유형 권장)
  • WildFly 내장 클러스터링 활성화
  • 다중 AZ 배포
  • Network Load Balancer(또는 ALB)
  • RDS Multi-AZ 구성
  • 사용자 정의 CloudWatch 지표 구성

Q7: Spring Boot 3.4의 HTTP/3 지원은 어떤 WAS에서 더 잘 작동하나요?

A: HTTP/3 지원은 WildFly에서 더 완전하게 구현되어 있습니다. WildFly 30+ 버전은 Undertow를 통해 네이티브 HTTP/3 지원을 제공하며, QUIC 프로토콜을 포함한 전체 스택 지원이 가능합니다. Tomcat 10.1은 HTTP/3에 대한 실험적 지원을 제공하지만, 일부 고급 기능이 제한적입니다. 하지만 AWS 환경에서는 대개 Application Load Balancer나 CloudFront가 HTTP/3 연결을 처리하고, 백엔드 WAS와는 HTTP/2나 HTTP/1.1로 통신하므로 실제 애플리케이션 성능에는 큰 차이가 없을 수 있습니다.

 

AWS 환경별 WAS 설정 예시

EC2에서 Tomcat 최적화 구성

EC2 인스턴스에서 Tomcat을 최적화하기 위한 Spring Boot 설정:

# application.properties
server.tomcat.threads.max=400
server.tomcat.threads.min-spare=50
server.tomcat.max-connections=10000
server.tomcat.accept-count=100
server.tomcat.max-swallow-size=2MB
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.prefix=access_log
server.tomcat.accesslog.suffix=.log
server.tomcat.accesslog.rotate=true

# JVM 옵션
JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+ExitOnOutOfMemoryError"

# 가상 스레드 활성화
spring.threads.virtual.enabled=true

ECS Fargate에서 Tomcat 컨테이너 설정

# task-definition.json
{
  "family": "spring-boot-tomcat",
  "executionRoleArn": "arn:aws:iam::ACCOUNT_ID:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "app",
      "image": "ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/spring-boot-app:latest",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 8080,
          "hostPort": 8080,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "JAVA_OPTS",
          "value": "-XX:+UseG1GC -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=production"
        },
        {
          "name": "SPRING_THREADS_VIRTUAL_ENABLED",
          "value": "true"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/spring-boot-tomcat",
          "awslogs-region": "REGION",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "curl -f http://localhost:8080/actuator/health || exit 1"
        ],
        "interval": 30,
        "timeout": 5,
        "retries": 3,
        "startPeriod": 60
      }
    }
  ],
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "1024",
  "memory": "2048"
}

EKS에서 WildFly 배포 설정

# wildfly-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wildfly-app
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wildfly-app
  template:
    metadata:
      labels:
        app: wildfly-app
    spec:
      containers:
      - name: wildfly
        image: your-registry/wildfly-spring-boot:latest
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "1"
            memory: "2Gi"
          limits:
            cpu: "2"
            memory: "4Gi"
        env:
        - name: JAVA_OPTS
          value: "-Xms1g -Xmx3g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman,org.jboss.logmanager"
        - name: SPRING_PROFILES_ACTIVE
          value: "production"
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 120
          periodSeconds: 30
        volumeMounts:
        - name: config-volume
          mountPath: /opt/jboss/wildfly/standalone/configuration/standalone-custom.xml
          subPath: standalone-custom.xml
      volumes:
      - name: config-volume
        configMap:
          name: wildfly-config

 

실제 성능 데이터: AWS 클라우드 환경 벤치마크

EC2 m6i.2xlarge 인스턴스 성능 테스트 (가상 스레드 활성화)

지표 Tomcat WildFly 차이(%)
최대 처리량 (TPS) 28,600 22,400 Tomcat 27.7% 우수
평균 응답 시간 (ms) 42 58 Tomcat 27.6% 우수
CPU 사용률 (%) 68 82 Tomcat 17.1% 우수
메모리 사용량 (GB) 2.4 3.8 Tomcat 36.8% 우수
95% 백분위 응답 시간 (ms) 125 145 Tomcat 13.8% 우수
요청당 AWS 비용 ($) 0.000011 0.000018 Tomcat 38.9% 우수

ECS Fargate (4 vCPU, 8GB) 성능 테스트

지표 Tomcat WildFly 차이(%)
최대 처리량 (TPS) 16,200 12,800 Tomcat 26.6% 우수
평균 응답 시간 (ms) 56 74 Tomcat 24.3% 우수
컨테이너 시작 시간 (초) 12 35 Tomcat 65.7% 우수
메모리 사용량 (GB) 1.8 3.2 Tomcat 43.8% 우수
오토스케일링 반응 시간 (초) 45 120 Tomcat 62.5% 우수
월간 인프라 비용 ($)* 1,250 1,950 Tomcat 35.9% 우수

*동일한 워크로드 처리 기준 (월간 처리량 5억 요청)

Amazon EKS 성능 테스트 (Graviton 기반 노드)

지표 Tomcat WildFly 차이(%)
Pod 시작 시간 (초) 15 42 Tomcat 64.3% 우수
평균 CPU 사용률 (코어) 0.35 0.52 Tomcat 32.7% 우수
평균 메모리 사용량 (GB) 0.95 1.65 Tomcat 42.4% 우수
초당 최대 요청 처리량 22,500 18,200 Tomcat 23.6% 우수
수평 확장 지연 시간 (초) 35 85 Tomcat 58.8% 우수
롤링 업데이트 완료 시간 (분:초) 3:20 8:45 Tomcat 61.9% 우수

 

Spring Boot 3.4 + AWS 활용 모범 사례

Tomcat 기반 Spring Boot 애플리케이션을 위한 모범 사례

  1. 가상 스레드 활용: Spring Boot 3.4의 가상 스레드를 활성화하여 처리량 최대화
  2. spring.threads.virtual.enabled=true
  3. 컨테이너 최적화:
  • 적절한 JVM 메모리 설정으로 OOM 방지
  • 컨테이너 인식 JVM 옵션 사용 (-XX:MaxRAMPercentage 등)

1.  AWS 서비스 통합:

  • AWS SDK의 비동기 클라이언트 활용
  • ElastiCache를 사용한 분산 세션 관리
  • CloudWatch 에이전트 구성으로 상세 메트릭 수집

2. 오토스케일링 최적화:

  • 빠른 시작을 위한 Custom AMI 또는 컨테이너 이미지 최적화
  • ALB 타겟 그룹의 Deregistration Delay 조정
  • 예측 스케일링 활성화

3. 비용 최적화:

  • Graviton(ARM) 인스턴스 활용으로 비용 절감
  • Savings Plans 또는 Reserved Instances 고려
  • 스팟 인스턴스와 함께 사용 시 안정성 확보 전략 구현

WildFly 기반 Spring Boot 애플리케이션을 위한 모범 사례

1. 클러스터링 최적화:

  • AWS 환경에 맞는 JGroups 설정
     <subsystem xmlns="urn:jboss:domain:jgroups:10.0">
         <channels default="ee">
             <channel name="ee" stack="tcp"/>
         </channels>
         <stacks>
             <stack name="tcp">
                 <transport type="TCP" socket-binding="jgroups-tcp">
                     <property name="external_addr">${jboss.bind.address.private:127.0.0.1}</property>
                 </transport>
                 <!-- AWS 환경에 맞는 발견 프로토콜 -->
                 <protocol type="JDBC_PING">
                     <property name="datasource_jndi_name">java:jboss/datasources/PingDS</property>
                 </protocol>
                 <!-- 다른 프로토콜 설정 -->
             </stack>
         </stacks>
     </subsystem>

2. 메모리 최적화:

  • 모듈식 구성으로 필요한 서브시스템만 활성화
  • 적절한 JVM 튜닝으로 GC 오버헤드 최소화

3. AWS 환경 통합:

  • IAM 인스턴스 프로필을 통한 인증
  • CloudWatch Logs 에이전트 설정으로 로그 통합
  • AWS Secrets Manager를 통한 안전한 자격 증명 관리

4. 고가용성 구성:

  • 다중 AZ 배포
  • RDS Multi-AZ와 연동
  • Network Load Balancer로 TCP 연결 유지

5. 성능 모니터링:

  • JMX 메트릭을 CloudWatch 커스텀 메트릭으로 발행
  • X-Ray와 통합하여 트랜잭션 추적
  • WildFly 관리 콘솔 보안 강화

결론

Spring Boot 3.4와 AWS 클라우드 환경에서 Tomcat과 JBoss WildFly의 성능을 비교한 결과, 대부분의 클라우드 네이티브 워크로드에서는 Tomcat이 더 효율적인 선택임을 확인했습니다. 특히 리소스 효율성, 시작 시간, 확장성 측면에서 Tomcat은 AWS의 탄력적 특성과 더 잘 맞았으며, 이는 비용 효율성으로 직결되었습니다.
반면 WildFly는 복잡한 엔터프라이즈 워크로드, 고급 트랜잭션 관리, 내장 클러스터링이 필요한 시나리오에서 강점을 보였습니다. 특히 고가용성 요구사항이 높은 금융, 의료, 정부 시스템과 같은 미션 크리티컬 애플리케이션에서는 WildFly의 엔터프라이즈급 기능이 가치를 발휘했습니다.
최종적으로, WAS 선택은 애플리케이션의 요구사항, 워크로드 특성, AWS 서비스 활용 패턴에 따라 달라져야 합니다. 이 글에서 제공한 성능 데이터와 모범 사례를 참고하여 프로젝트에 가장 적합한 WAS를 선택하시기 바랍니다.


부록: AWS에서 Spring Boot 3.4 + Tomcat/WildFly 구성을 위한 리소스

유용한 GitHub 리포지토리

추천 AWS CloudFormation 템플릿

추가 학습 리소스

긴 글 읽어주셔서 감사합니다.

끝.

반응형