티스토리 뷰

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 (요청 수신)

출처 : How does a single servlet handle multiple requests from client side

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

출처 : dradradradracra.log -vlog

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이 모든 요청을 중앙에서 관리


출처 : dradradradracra.log -vlog
출처 : https://www.slideshare.net/ssuserced713/mvc-251365459

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://mossgreen.github.io/Servlet-Containers-and-Spring-Framework/

- Tomcat :: Servlet이라는 "Interface"를 통해 웹 처리

- Spring :: Servlet Interface에 대한 Spring만의 "구현체"


2) HandlerMapping

    :: 요청 URL을 기반으로 Controller 탐색

    :: DispatcherServlet에 HandlerExecutionChain 반환 (선택된 Controller와 요청에 적용되는 Interceptor목록)


3) HandlerExecutionChain 작업 수행

  1. Interceptor preHandle()  실행   
    :: HandlerExecutionChain 안의 Interceptor의 preHandle() 메서드 실행
    - preHandle() :: 요청 처리 전에 실행, 인증, 로깅 등의 작업 수행


  2. Controller 실행
    더보기
    :: @Controller 내 @RequestMapping 정의 시, HandlerMapping 통해 요청이 Controller로 연결
    :: 처리한 모든 응답은 Front Controller 에게 반환
    :: Controller를 통해 요청 처리 및 비즈니스 로직 수행 후, 응답을 반환
    :: Model의 데이터 추가 + View의 이름을 반환

  3. 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 수업자료

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함