목차
서론
간략하게 서블릿과 WAS의 역할과 멀티 스레드에 대해 작성하는 글입니다.
서블릿과 WAS의 역할
HTML Form 으로 데이터를 전송
HTML Form을 사용하여 데이터를 서버로 전송하면 어떻게 동작할까요?
POST로 사용자의 정보를 저장하는 요청을 보내면, 브라우저는 그에 맞는 HTTP 요청 메시지를 생성해 서버에게 전송합니다.
서버에서 처리 : 웹 애플리케이션 서버를 직접 구현한다면?
- TCP/IP 연결을 대기하는 코드를 작성하고, 소켓을 연결한다.
- 받은 HTTP 요청 메시지는 모두 텍스트다. 파싱해서 해석한다.
- POST 방식인지, 어떤 URL로 요청이 왔는지(/save) 확인한다.
- Content-Type에 따라 Body를 파싱한다. (usernamge, age 데이터를 사용할 수 있도록 파싱)
- 비지니스 로직을 실행한다. (데이터 베이스에 저장(save) 요청) ⭐
- HTTP 응답 메시지를 생성한다. (HTTP Status Line, Header, Body 입력)
- TCP/IP에 응답을 전달하고, 소켓을 종료한다..
Servlet+WAS의 역할: 비지니스 로직을 제외한 모든 작업을 처리한다.
위의 많은 작업들 중, 의미있는 비지니스 로직은 5번 뿐입니다. (데이터 베이스에 저장(save) 요청을 한다.)
개발자는 해당 로직만 작성하고,
나머지 모든 작업은 서블릿을 지원하는 WAS를 사용하면 모두 처리해줍니다.
서블릿
- urlPatten(/hello)의 URL이 호출되면, 해당 서블릿 코드가 실행됩니다.
- HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest를 제공합니다.
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse를 제공합니다.
- 덕분에, 개발자는 HTTP 스펙을 매우 편리하게 사용할 수 있습니다.
요청 및 응답 흐름
- HTTP 요청이 오면, WAS는 Request, Response 객체를 새로 만들어 서블릿 객체를 호출합니다.
- 개발자는 Request에서 HTTP 요청 정보를 편리하게 꺼내어 사용합니다.
- 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력합니다.
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성합니다.
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 합니다.
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명 주기를 관리합니다.
- 서블릿 객체는 싱글톤으로 관리합니다.
- JSP도 서블릿으로 변환되어 사용됩니다.
- 동시 요청을 위한 멀티 스레드 처리를 지원합니다.
참고 싱글톤
고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율적입니다. 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용합니다. 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근합니다. 따라서, 공유 변수 사용에 주의해야 합니다. 서블릿 컨테이너 종료 시 함께 종료됩니다.
동시 요청 - 멀티 스레드
실행의 기본 단위: 스레드
- 애플리케이션 코드를 읽어 순차적으로 실행하는 것은 스레드입니다.
- 자바 메인 메서드를 실행하면 main이라는 이름의 스레드가 실행됩니다.
- 스레드가 없다면, 자바 애플리케이션 실행은 불가능합니다.
- 스레드는 한 번에 하나의 코드 라인만 수행합니다.
- 따라서, 동시 처리가 필요하다면 스레드를 추가로 생성해야 합니다.
다중 요청 + 스레드 하나 사용
해결책: 요청마다 스레드 생성 - 멀티 스레드
장점
- 동시 요청을 처리할수 있습니다.
- 리소스(CPU, 메모리)가 허용할 때까지 처리가 가능합니다.
- 하나의 스레드가 지연되어도, 나머지 스레드는 정상 동작합니다.
단점
- 스레드는 생성 비용이 매우 비쌉니다. 고객의 요청이 올 때마다 스레드를 생성하면 응답 속도가 늦어집니다.
- 컨텍스트 스위칭 비용이 발생합니다.
- 스레드 생성에 제한이 없습니다. 고객 요청이 너무 많이 온다면 CPU, 메모리 임계점을 넘어 서버가 죽을 수 있습니다.
참고 컨텍스트 스위칭
싱글 코어의 경우, CPU는 사실 여러 스레드를 동시에 실행하는 것이 아니라 빠른 속도로 번갈아 가며 수행합니다. 매우 빠른 속도로 번갈아 가며 수행하기 때문에, 사람의 눈으로는 동시에 수행되는 것처럼 보입니다. 따라서 전환될 때마다 컨텍스트 스위칭 비용이 발생합니다.
단점 해결: 스레드 풀
스레드 풀을 통해 응답 속도를 개선하고, 고객 요청이 CPU와 메모리 임계점을 넘을 때까지 오지 않도록 막을 수 있습니다.
특징
- 필요한 스레드를 스레드 풀에 보관하고 관리합니다.
- 스레드 풀에 생성 가능한 스레드의 최대치를 관리합니다.
톰캣은 최대 200개가 기본 설정입니다. (변경 가능합니다.)
장점
- 스레드가 미리 생성되어 있으므로 스레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠릅니다.
- 생성 가능한 스레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있습니다.
실무 팁: 스레드의 갯수는 몇개로 설정하는 것이 좋을까요?
WAS의 주요 튜닝 포인트는 최대 스레드(max thread)의 수입니다.
- 이 값을 너무 낮게 설정하면?
- 동시 요청이 많은 경우, 서버 리소스는 너무 여유로운데, 클라이언트는 금방 응답이 지연됩니다.
- 이 값을 너무 높게 설정한다면?
- 동시 요청이 많으면 CPU 메모리 리소스 임계점 초과로 서버가 다운됩니다.
- 장애가 발생할 경우, 클라우드라면 서버를 늘리고 이후에 튜닝을 시도합니다. 클라우드가 아니라면 열심히 튜닝을 해야 합니다.
그래서, 스레드 풀의 적정 갯수는?
- 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다릅니다.
- 따라서, 성능 테스트(트래픽 테스트)를 하면서 적절한 갯수를 찾아야 합니다.
- 최대한 실제 서비스와 유사하게 성능 테스트를 시도해야 합니다.
- 툴: 아파치 ab, 제이미터, nGrinder(네이버의 오픈소스 - 권장)
WAS의 멀티 스레드 지원
WAS의 핵심 기능은 이러한 멀티 스레드를 개발자가 신경쓰지 않도록 알아서 지원해준다는 것입니다.
- 멀티 스레드에 관한 부분은 WAS가 처리합니다.
(만약 개발자가 직접 짠다면 java concurrency 부터 많은 것들을 공부해야 하므로 머리 터집니다..ㅜ) - 개발자는 멀티 스레드 관련 코드를 신경쓰지 않아도 됩니다.
- 개발자는 마치 싱글 스레드 프로그래밍을 하듯 편리하게 비지니스 로직 소스 코드를 개발하면 됩니다. 단, 멀티 스레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)의 공유 변수는 주의해서 사용해야 합니다.
출처
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Backend > Spring | SpringBoot' 카테고리의 다른 글
[Servlet] HttpServletRequest, HttpServletResponse (0) | 2023.08.17 |
---|---|
[Servlet] Hello 서블릿 (0) | 2023.08.17 |
[Spring] 웹 서버, 웹 애플리케이션 서버, 웹 시스템 구성 (0) | 2023.08.03 |
[Spring] 스프링 예제 - 주문과 할인2 (SRP, OCP, DIP 적용) (0) | 2023.07.28 |
[Spring] 스프링 예제 - 주문과 할인1 (OCP와 DIP 미적용) (0) | 2023.07.28 |