티스토리 뷰
0. 들어가기
:: 과정에서 사용되는 Servlet 객체는 싱글톤 생성
2025.02.07 - [정리용/SpringBoot] - [Spring] 2-2-2. Spring MVC - Servlet 객체
[Spring] 2-2-2. Spring MVC - Servlet 객체
0. Spring MVC - Servlet:: Connection = 1 요청 : 1 스레드 :: 이때, Servlet 객체는 Singleton:: 즉, Servlet Container는 각 종류의 Servlet당 한개의 객체만 사용=> Front Controller인 DispatcherServlet은 싱글톤 객체임을 의Spring
hee-ya07.tistory.com
1. Request (요청 수신)
1) 클라이언트 요청 도착
:: 서버(SpringBoot 애플리케이션)가 클라이언트의 HTTP 요청 수신
:: 요청은 OS의 네트워크 스택을 통해 Tomcat(Servlet Container)에 전달
2) Connect에서의 처리
:: Connect Queue에 요청을 적재 - Tomcat 사이드
- Connect Queue는 2가지 레벨로 관리
1. OS 레벨의 큐 :: acceptCount로 설정된 크기
2. Tomcat 레벨의 큐 :: maxConnections로 설정된 크기
3) Thread Pool에 할당
:: Tomcat이 내부의 thread pool에서 사용가능한 스레드를 할당
:: 1요청당 1스레드 분배
:: thread pool의 크기는 maxThreads 와 minSpareThreads로 제한
:: 사용 가능한 thread x시, 요청은 큐에서 대기
2. Processing
1.2.1 Tomcat 내부 처리 - Servlet Container
| Tomcat == Servlet Container의 역할
1) Catalina(Tomcat Engine)
:: Tomcat의 엔진인 Catalina를 통해 각 요청(ServletReques)을 HttpServletRequest 로 변환
:: 해당에 대한 처리를 하는 Context로 전달
2) Context(WebApplication)
:: 웹 애플리케이션 단위 구성 - 각 Context는 하나 이상의 Servlet을 포함
:: 웹 애플리케이션의 설정과 리소스 관리
:: 각 요청에 대한 처리를 할 Servlet을 결정, 요청을 해당 Servlet에 전달
=> Tomcat 의 Servlet Container 통해 유저 요청에 따라 Servlet (Front Controller) 할당을 의미
++ 이때, Spring Boot의 경우, DispatcherServlet가 모두를 관리하므로 Front Controller == DispatcherServlet
3) Servlet
:: 클라이언트의 요청 처리 및 동적인 응답 생성
:: Spring Boot의 경우 DispatcherServlet이 모든 요청을 중앙에서 관리
1.2.2 Spring Boot 내부 처리 - Spring Container
| Spring == Spring Container의 역할
- Spring Container :: Servlet WebApplicationContext + Root WebApplicationContext
- Spring Bean
:: Spring Container로 관리
:: 2개의 ApplicationContext로 구분됨
1. Servlet WebApplicationContex
:: 서블릿에서만 이용되는 Bean 에 대한 Context
:: DispatcherServlet 이 직접 사용하는 컨트롤러를 포함한 웹 관련 Bean 등록
:: @Controller, HandlerMapping 등
2. Root WebApplicationContext
:: 스프링 어디에서든 이용되는 Bean 에 대한 Context
:: 서비스 계층이나 DAO 를 포함한 웹 환경에 독립적인 Bean 등록
:: @Service, @Repository 등
1) DispatcherServlet이 요청을 받음
- DispatcherServlet == Front Controller == Front Servlet
:: 요청을 받아 Spring에게 처리를 위임 후, 결과에 대한 응답을 반환
- DispatcherServlet 구현체
1) HandlerMapping
:: 요청에 해당하는 처리 메서드(Controller)가 존재하는지 검색
:: 해당 메서드를 가진 객체 == Bean
:: HandlerExecutionChain 객체를 반환
- RequestMappingHandlerMapping: @RequestMapping 어노테이션 기반 매핑
- BeanNameUrlHandlerMapping: 빈 이름 기반 매핑
2) HandlerAdapter
:: HandlerMapping이 찾아낸 Controller를 실행하는 역할을 담당
:: 해당 메서드를 가진 객체 == Bean
:: 다양한 종류의 Controller를 일관된 방식으로 처리하기 위해 어댑터 패턴을 적용
- HttpRequestHandlerAdapter: HttpRequestHandler 인터페이스 구현 컨트롤러 처리
- SimpleControllerHandlerAdapter: Controller 인터페이스 구현 컨트롤러 처리
- RequestMappingHandlerAdapter: @RequestMapping 어노테이션 기반 컨트롤러 처리
- HandlerFunctionAdapter
:: 요청을 중앙 관리 -> 모든 다수의 스레드는 단일의 DispatcherServlet로 사상됨을 의미
:: 요청을 처리할 Controller를 찾기 위해 HandlerMappring에 요청 처리 위임
! 해당 과정은 Tomcat 내부처리일 수도 Spring Boot의 내부 처리일 수도 있음
=> DispatcherServlet 은 Servlet Container, Spring Container 중 누구껍니까?
![](https://blog.kakaocdn.net/dn/cq2kK0/btsMbwegHOc/06MSCNT42zGoJV3Lfid2EK/img.png)
- Tomcat :: Servlet이라는 "Interface"를 통해 웹 처리
- Spring :: Servlet Interface에 대한 Spring만의 "구현체"
2) HandlerMapping
:: 요청 URL을 기반으로 Controller 탐색
:: DispatcherServlet에 HandlerExecutionChain 반환 (선택된 Controller와 요청에 적용되는 Interceptor목록)
3) HandlerExecutionChain 작업 수행
- Interceptor의 preHandle() 실행
:: HandlerExecutionChain 안의 Interceptor의 preHandle() 메서드 실행
- preHandle() :: 요청 처리 전에 실행, 인증, 로깅 등의 작업 수행 - Controller 실행
더보기:: Controller를 통해 요청 처리 및 비즈니스 로직 수행 후, 응답을 반환:: @Controller 내 @RequestMapping 정의 시, HandlerMapping 통해 요청이 Controller로 연결
:: 처리한 모든 응답은 Front Controller 에게 반환
:: Model의 데이터 추가 + View의 이름을 반환 - Interceptor의 postHandle() 실행
:: Controller 실행 후, Interceptor의 postHandle() 메서드 실행
4) ViewResolver
:: DispatcherServlet는 반환 값을 이용해 ViewPesolver 호출
:: ViewPesolver는 View 이름에 해당하는 실제 View를 반환
5) View 렌더링
:: View는 Model 데이터로 화면 렌더링(HTML, JSP, Thymeleaf)
:: 렌더링된 화면은 HTTP 응답으로 클라이언트에게 전달
6) Interceptor의 afterCompletion() 실행
:: 요청 처리 후, Interceptor의 afterCompletion() 메서드 실행
- afterCompletion() :: 리소스 정리 등의 작동
3. Response
: DispatcherServlet 처리 결과를 반환
참조
How does a single servlet handle multiple requests from client side
How does a single servlet handle multiple client requests coming in the form of user requests ? Based on the singleton design pattern I know we get a single instance of servlet created , but how do...
stackoverflow.com
Mvc 패턴
Mvc 패턴 - Download as a PDF or view online for free
www.slideshare.net
https://mossgreen.github.io/Servlet-Containers-and-Spring-Framework/
Tomcat과 Spring 컨테이너의 요청 처리 흐름
최근에 백엔드 개발을 하면서 느낀 점이 있다. 여러 Background 지식들이 파편처럼 모이는 것이 꽤나 도움이 됐다는 것이다. 예를 들어, @RestControllerAdvice로 예외를 관리할 때 필터 단에서는 처리할
velog.io
ASAC 수업자료
'정리용 > SpringBoot' 카테고리의 다른 글
[Spring] 2-2-2. Spring MVC - Servlet 객체 (0) | 2025.02.07 |
---|---|
[Spring] 2-2-1. Spring MVC - Controller의 반환 값 (1) | 2025.02.07 |
[Spring] 2-1. Spring MVC - HandlerMapping (0) | 2025.02.07 |
[Spring] 2. Spring MVC (0) | 2025.02.07 |
[Spring] 1. 스프링 부트 기본 설정 (0) | 2025.02.07 |
- Total
- Today
- Yesterday
- git
- react
- useMemo
- ssh
- ASAC
- useReducer
- acac
- asac7
- asac7기
- useContext
- memo
- useRef
- useLayoutEffect
- useState
- asac#asac7기
- asac7#asac
- useCallback
- Nginx
- useEffect
- acas#acas7기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |