Back End/Spring Boot

[Spring/Network] 서블릿과 WAS에 대하여

DevPing9_ 2022. 2. 25. 13:32

어떤분께서 "서블릿이 뭔지아세요?" 라고 물어보신적이 있다.

 

나는 "request랑 response에 접근하게 해주는 객체아니에요?" 라고 답을 했다..

(Spring에서 HttpServlet 객체로 request랑 response랑 접근해서 로직을 짠적이 있으니까...) 

 

그런데 면접 때 이런 질문이 나온다면 이런 대답만으로는 부족할 것 같아 더 알아보기로 했다.

(어떤 회사에서는 서블릿을 구현하는 입사과제가 있었다고 한다 ㄷㄷㄷ..)

 

아마 이 포스팅을 읽다보면 WAS(톰캣)가 계속 등장하게 될텐데, 선수지식은 아래 포스팅을 읽으시면 된다.

 

 

[Network] Apachi, Nginx, Tomcat 이 하는일이 뭘까? (Feat. Proxy)

# 대충 개념 잡기 Apachi, NginX 은 프록시서버(웹서버)이며 Tomcat, Jetty, Undertow 는 WAS다. (WAS : Web Application Server , 자바진영 용어) 용어차이기 때문에 복잡하게 생각하지말고 Spring+Tomcat / Node..

developer-ping9.tistory.com

 

 

# 서블릿 정의 1 (from 나무위키)

자바 서블릿(Java Servlet)은 
자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다.

서블릿은 JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 Java 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다는 차이점이 있다.

 

# 서블릿 정의 2 (from 김영한 님)

아래의 이미지에서 초록색 박스를 제외한 업무를 서블릿이 담당한다. (WAS가 서블릿을 지원한다)

 

 

좌측 이미지의 초록박스를 제외한 영역이

 

Application Layer 프로토콜로 HTTP을 사용할 때, 서블릿의 업무이다.

 

출처 : 김영한 님 인프런강의  

 

 

 

 

 

 

 

 

# WAS 의 역할 개요

1. WAS 가 소켓 여닫음을 담당한다.

2. WAS 내부에는 서블릿 컨테이너가 있다.

3. HttpServlet 을 상속하여 만든 서블릿은 WAS 내부 서블릿 컨테이너에서 생성,호출,종료 등 생명주기를 담당한다.

4. 서블릿 객체는 싱글톤으로 관리 (Request, Response는 아님)

5. Http 요청에 대한 멀티쓰레딩도 구현되어있다. (쓰레드풀로 관리)

 

* 멀티 쓰레드 환경에서 싱글톤 객체는 주의해서 사용해야 한다. (공유변수 사용에 유의)


 

# WAS 의 일반적인 쓰레드 관리 구현

 

아래와 같은 방법으로 구현하여, 빠른 응답시간서버의 안정성을 보장한다.

 

 

1. WAS 는 쓰레드 풀에 미리 쓰레드를 만들어 둔다.

미리만들어 두는 이유는, 쓰레드 생성비용이 매우 크기 때문에
Request 마다 생성할 시, 응답 속도가 늦어질 수 있다.

 

2. WAS 는 쓰레드 풀의 존재할 수 있는 쓰레드의 갯수를 고정한다

미리만들어 두기 때문에 당연한 말이긴 하지만, 쓰레드의 갯수에 제한이 없다면
CPU, 메모리 임계점을 넘겨 서버가 다운 될 수 있다.

특히 미리 만들어두지 않고, Request 마다 쓰레드를 생성하고 할당하는 방법으로 WAS를 구현한다면
쓰레드 갯수 제한을 두어야 서버의 안정성을 보장할 수 있다.

 

3. WAS 는 쓰레드 풀의 MAX 값을 넘어서는 요청에 대해 대기/거절 한다.

기다리는 요청은 거절하거나 특정 숫자만큼 대기하도록 구현 할 수 있다.
톰캣에도 해당 환경설정이 있다.

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

 


# Addtional Information

 

1. 쓰레드는 컨텍스트 스위칭 오버헤드가 있다.

 

사실 멀티쓰레드는 병렬적으로 실행되는게 아니라, 직렬적으로 스위칭이 일어나면서 실행된다.

 

운영체제(OS)가 수 많은 프로세스를 실행하는 방식과 같다.

 

 

 

2. WAS를 튜닝할 수 있다.

 

쓰레드 대기/거절, 쓰레드풀의 Max 값등을 튜닝할 수 있다.

Spring Boot 에서는 톰캣(WAS)이 내장되어있고,
server.tomcat.max-threads 라는 프로퍼티로 쓰레드풀의 max 값을 제어한다. (.yml, .properties)

 

서버의 사양에 따라 쓰레드풀의 max 값을 적절하게 조절한다면 극적인 효과를 볼 수 있다.

 

이게 정말 중요한 게, 해당 수치로 서버의 리소스를 효율적으로 쓴다면 AWS와 같은 서비스에서 Scale-Out 횟수를 줄일 수 있다.

 

극단적인 예시로, CPU 5% 만 사용하는 서버를 계속 Scale-Out을 하는 경우가 있을 수 있다.  

 

영한님은 최소 50% 정도는 사용해주어야 한다고 말씀하셨다.

 

최대한 실제 서비스와 유사하게 성능 테스트를 실시 함으로써 쓰레드 풀의 적정 Max 값을 찾는다고 하신다.

 

성능 테스트 툴 : 아파치 ab, 제이미터, nGrinder

 

 

 

 

728x90