안녕하세요! Devloo 입니다. 이번 시간에는 Java/Spring 백엔드 개발자 면접 시 단골 질문인 “동시에 몇 개의 요청을 처리할 수 있는가?” 에 대한 주제로 이야기해보는 시간을 갖고자 합니다.
Spring Boot는 Java 개발에서 아주 중요한 프레임워크로, 개발자들에게 효율적이고 사용자 친화적인 기능들을 제공합니다. 그럼 이 Spring Boot가 동시에 처리할 수 있는 요청 수는 몇개나 될까요 ?
해당 질문을 조금 더 정확히 말하면, Spring Boot가 동시에 처리할 수 있는 요청 수는 Spring Boot 프레임워크 자체가 아닌 내장된 웹 컨테이너에 달려 있습니다. (웹 컨테이너의 동작이 Spring Boot의 동작을 결정하므로, 이 두 질문에 대한 답은 동일하다고 할 수 있습니다.)
1. 주요 웹 컨테이너 세 가지
현재 시장에는 세 가지 주요 웹 컨테이너가 있습니다: Tomcat, Undertow, Jetty.
이 중에서 Tomcat이 Spring Boot 프레임워크의 기본 웹 컨테이너입니다.
이들의 차이점은 아래와 같습니다:
1.1 Tomcat
Tomcat은 Apache Software Foundation의 오픈 소스 프로젝트로, 가장 널리 사용되는 서블릿 컨테이너 중 하나입니다. Java 서블릿 및 JavaServer Pages(JSP) 사양을 완벽하게 구현합니다.
Tomcat은 서블릿 컨테이너일 뿐만 아니라 경량 애플리케이션 서버이기도 합니다. 다른 경량 서버에 비해 약간 무겁다고 여겨지지만, SSL, Connection Pooling 등 다양한 엔터프라이즈급 기능을 지원하여 대규모 복잡한 엔터프라이즈 애플리케이션을 실행하는 데 적합합니다.
오랜 기간 동안 엔터프라이즈 애플리케이션에서 안정성과 성숙도를 입증받아 많은 기업들이 선호하는 웹 컨테이너입니다.
1.2 Undertow
Undertow는 Red Hat에서 개발한 유연하고 고성능의 웹 서버이자 리버스 프록시 서버입니다.
Undertow는 WildFly 애플리케이션 서버의 기본 웹 컨테이너입니다. Undertow는 낮은 메모리 사용량과 높은 동시성을 위해 설계되었으며, RESTful API 서비스와 같은 많은 수의 짧은 연결을 처리하는 데 뛰어납니다.
Undertow는 서블릿 3.1, WebSocket, 비동기 IO(NIO)를 지원하며, HTTP/2 프로토콜을 지원하는 현대적인 서버 중 하나입니다.
모듈화되고 임베드하기 쉬운 솔루션을 제공하는 설계 철학을 가지고 있어 기존 시스템에 통합하기 용이하고 마이크로서비스 아키텍처에 적합합니다.
1.3 Jetty
Jetty는 Eclipse Foundation이 관리하는 오픈 소스 경량 웹 서버이자 서블릿 컨테이너입니다.
임베드성과 높은 구성 가능성으로 유명하며, 빠른 시작과 경량 배포가 필요한 개발 단계, 테스트 환경 또는 경량 애플리케이션에서 자주 사용됩니다.
Jetty 역시 서블릿 사양과 WebSocket을 지원하며, NIO 기반으로 설계되어 많은 동시 연결을 처리하는 데 뛰어납니다.
유연성과 확장성을 강조하는 디자인으로 특정 요구에 맞게 API를 통해 쉽게 커스터마이징할 수 있어 클라우드 환경, 지속적인 통합, DevOps에서 인기가 많습니다.
요약하자면, Tomcat은 성숙도와 엔터프라이즈급 기능 덕분에 대규모 애플리케이션에 적합합니다.
Undertow는 높은 성능과 낮은 메모리 사용량 덕분에 특히 높은 동시성의 짧은 연결 시나리오에서 뛰어납니다.
Jetty는 경량, 유연성, 임베드의 용이성이 특징으로 빠른 개발과 경량 배포에 적합합니다.
2. 최대 연결 수와 최대 대기 수
Spring Boot 프레임워크의 기본 웹 컨테이너인 Tomcat을 예로 들면, 동시에 처리할 수 있는 요청 수는 Spring Boot 프레임워크의 spring-configuration-metadata.json
파일에서 설정됩니다. 다음과 같습니다:
이 파일을 열고 server.tomcat.max-connections
(Tomcat의 최대 연결 수)를 검색하면 다음과 같은 결과를 찾을 수 있습니다:
이는 기본적으로 Tomcat이 최대 8,192개의 연결을 허용한다는 의미입니다(8,192 = 8 * 1024).
이 시점에서 “Spring Boot는 기본적으로 8,192개의 요청을 동시에 처리할 수 있다”고 생각할 수 있습니다. 하지만, 그렇게 생각했다면 오해일 수 있습니다. 왜냐하면,
Tomcat이 최대 8,192개의 연결을 허용하더라도, Tomcat에는 최대 대기 수라는 것이 있기 때문입니다. 이는 최대 연결 수 8,192에 도달하면, 대기 큐가 요청의 연결을 저장할 수 있다는 것을 의미합니다.
따라서, Spring Boot가 동시에 처리할 수 있는 요청 수는 Tomcat의 최대 연결 수와 최대 대기 수를 합한 값입니다.
그렇다면 최대 대기 수는 얼마일까요?
다시 spring-configuration-metadata.json
파일에서 server.tomcat.accept-count
(Tomcat의 최대 대기 수)를 검색하면 다음과 같은 결과를 찾을 수 있습니다:
즉, 기본적으로 Tomcat의 최대 대기 수는 100입니다.
3. 동시 요청 처리
따라서, 기본적으로 Spring Boot가 동시에 처리할 수 있는 요청 수는 최대 연결 수(8,192) + 최대 대기 수(100)로, 총 8,292개입니다.
물론, 이 두 값은 Spring Boot 구성 파일에서 아래와 같이 수정할 수 있습니다:
server:
tomcat:
max-connections: 2000 # 최대 연결 수
accept-count: 200 # 최대 대기 수
4. 추가 지식: 웹 컨테이너 설정
Spring Boot 프레임워크에서 웹 컨테이너를 Jetty나 Undertow로 설정하는 방법을 알아보겠습니다.
4.1 컨테이너를 Jetty로 설정
Spring Boot 프레임워크의 웹 컨테이너를 Jetty로 설정하려면, pom.xml 파일을 다음과 같이 수정하면 됩니다:
<dependencies>
<!-- Spring Boot Starter Web에서 Tomcat 제외 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- Tomcat 제외 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Jetty 스타터 의존성 추가 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
즉, 기본 Tomcat을 제외하고 Jetty 의존성을 추가하면 됩니다.
4.2 컨테이너를 Undertow로 설정
Spring Boot 프레임워크의 웹 컨테이너를 Undertow로 설정하는 방법도 Jetty 설정과 유사합니다. pom.xml 파일을 다음과 같이 수정하면 됩니다:
<dependencies>
<!-- Spring Boot Starter Web에서 Tomcat 제외 -->
<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>
<!-- Undertow 스타터 의존성 추가 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
</dependencies>
이처럼 기본 Tomcat을 제외하고 Undertow 의존성을 추가하면 됩니다.
마무리
이번 포스팅에서는 Spring Boot가 동시에 처리할 수 있는 요청 수에 대해 알아보고, 웹 컨테이너들(Tomcat, Undertow, Jetty) 각각의 특성과 용도에 대해 살펴보았습니다.
이와 같은 지식을 바탕으로, 여러분이 Spring Boot 기반의 애플리케이션을 더욱 효율적으로 구성하고 최적화하는데 도움이 되시기를 바랍니다.
끝까지 읽어주셔서 정말 감사합니다. 궁금하신 점은 댓글로 편하게 남겨주세요 🙂