-
Spring Tomcat 분석스터디 2024. 5. 1. 17:54
Tomcat이란 ?
Servlet Container 를 통해 Servlet을 제공하는 WAS (Web Application Server)이다.
- 서블릿 처리, 서블릿의 수명 주기 관리, 요청 URL을 서블릿 코드로 매핑, HTTP 요청 수신 및 응답, 필터 체인 관리 등을 처리를 한다
Servlet Container란 ?
Servlet Container란 Servlet의 creation / execution / destruction을 관리하는 container이다.
그럼 Servlet은 ??
Servlet이란 WAS위에서 동작하는 JAVA 객체(클래스)이다.
Servlet 동작과정
- 사용자 요청이 들어옴
- HTTP요청을 처리하기 위핸 Request, Response 생성
- web.xml을 바탕으로 어떤 Servlet에 대한 요청인지 찾기
- 해당 서블릿이 있다면 → 기존 인스턴스에 쓰레드 생성
- 해당 서블릿이 없다면 ? → init()을 통해 서블릿 생성 후 쓰레드 생성
- 각 쓰레드는 service()를 호출하고, 호출방식에 따라 doGet(), doPost() 등의 메소드를 호출한다
- 해당 메소드의 결과물들이 Response에 담겨서 전달된다
- 전달 후 Response, Request 객체의 메모리 소멸 및 쓰레드 종료
이와 같은 방식은 개발자가 일일히, 요청에 대한 모든 Servlet들을 web.xml에 등록해야 된다는 번거로움이 존재한다. 이는 서버의 확장성에 큰 제약을 가져올 수 있다. 따라서, Spring MVC 패턴에서는 Dispatcher Servelt 을 사용한다
Dispatcher Servelt 동작원리
- URL에 대한 요청이 들어옴
- HandlerMapping이라는 빈 객체에게 요청에 대한 컨트롤러를 찾으라고 시킴
- HandlerMapping이 해당 컨트롤러를 찾아주면 HandlerAdapter에게 해당 요청을 처리하라고 시킴
- HandlerAdapter은 서비스를 호출하고 요청을 반환함
https://egovframe.go.kr/wiki/doku.php?id=egovframework:rte:ptl:dispatcherservlet
전체적인 요청 흐름 정리
https://gowoonsori.com/blog/spring/architecture/
https://jie0025.tistory.com/525
그림을 보면 알겠지만, 기본적으로 요청이 들어오면 요청마다 하나의 쓰레드를 할당한다.
하지만 모든 요청마다 쓰레드를 생성하는 것은 메모리관점에서 매우 무겁다.
따라서 Tomcat은 미리 일정 크기의 ThreadPool을 만들고 요청시 쓰레드 풀의 쓰레드를 쓰고 반환한다.
Tomcat 쓰레드 설정
Request마다 Thread를 할당하고, 모든 Thread가 사용중이라면 Task에서 대기하게 된다.
server: tomcat: threads: max: 200 # 생성할 수 있는 thread의 총 개수 min-spare: 10 # 항상 활성화 되어있는(idle) thread의 개수 max-connections: 8192 # 수립가능한 connection의 총 개수 accept-count: 100 # 요청의 개수가 Max-Connections를 초과했을 경우에, accept만 해둘 수 있는 요청의 개수 connection-timeout: 20000 # timeout 판단 기준 시간, 20초 port: 8080 # 서버를 띄울 포트번호
https://velog.io/@byeongju/max-connections-accept-count-threads.max
Example)
server: tomcat: accept-count: 5 max-connections: 150 threads: max: 50 min-spare: 20
min-spare:20 → 현재 thread가 20개 생성되어있다
case1) 50개의 요청이 들어옴
- 30개의 쓰레드가 추가로 생성되고 , 50개의 쓰레드가 50개의 요청을 처리한다
case2) 100개의 요청이 들어옴
- 30개의 쓰레드가 추가로 생성되고, 50개의 쓰레드가 요청을 처리한다
- 나머지 50개의 connection들은 대기중이다(connection을 연결한 채로)
case3) 200개의 요청이 들어옴
- 30개의 쓰레드가 추가로 생성되고, 50개의 쓰레드가 요청을 처리한다
- 100개의 connection들이 대기중이다(connection을 연결한 상태로)
- 5개의 connection들이 요청 대기열 큐에서 기다리고 있다(연결안된 상태임)
- 45개의 요청들은 무시된다
'스터디' 카테고리의 다른 글
JAVA 병렬 프로그래밍 (0) 2024.06.09 Spring Transactional 뜯어보기 (0) 2024.05.15 SQL Query 최적화 (Spring JPA, Go gorm) (1) 2024.03.15 Spring JPA (0) 2024.01.24 Spring - Annotation 정리 (2) 2023.12.01