요청의 시작은 어디?

클라이언트의 요청

먼저 클라이언트가 요청을 보낼거다, 요청의 Header, Body로 이루어진 정보를 보낸다. (HttpInputMessage와 같은 정보들이 온다.)

그리고 요청 값은 웹 어플리케이션으로 이동한다.

Web Context(Servlet Context)

웹 어플리케이션

- 클라이언트와 서버 사이에 HTTP 프로토콜을 이요해 데이터를 주고받으면서 동작하는 소프트웨어를 의미한다.

- 흔히 우리는 WAS라고 알고 있는 개념이다. 동적인 정보를 처리해주는 역할을 한다. (DB정보 조작이나 다른 로직이 처리 가능) Tomcat

 

그림에서 DispatcherServlet에 도착하기 전에 있는 정보들을 의미한다.

서블릿 컨텍스트(웹 컨텍스트)에 도착한다. 이곳에서는 Spring 컨테이너에서 관리하지 않는 필터를 관리한다.

filter는 Spring Context외부에 존재해 예외가 발생하면 errorController에서 처리해야 한다.

JwtAuthenticationFilter 와 같이 우리가 인증,인가정보를 확인하기 위한 정보들이 이곳에 위치하게 된다. 

 

WAS 동작 과정

1. 클라이언트가 요청을 한다.
2. 요청은 웹 서버에서 톰캣과같은 WAS에 위임한다.
3. WAS는 클라이언트 요청에 따라 HttpServletRequest, HttpServletResponse 객체를 생성한다.
- request는 데이터가 담긴 객체, response는 빈 객체
4. WAS는 어떤 서블릿에 대해 요청한 것인지 식별하기 위해 web.xml 혹은 어노테이션 기반 설정을 참조한다.
- 이를 통해 어떤 URL이 서블릿에 매핑되는지를 확인하고 요청에 따라 적절한 서블릿을 실행한다.
5. WAS는 관련 servlet 인스턴스를 메모리에 로드한다.
- 만약 로드되어있지 않다면, Servlet 클래스를 로드하고 인스턴스를 생성해 init()메서드를 호출해 초기화한다.
- 그리고 바로 소멸되지 않고 자신에게 들어오는 요청에 계속 응답한다.
6. ServletContainer는 스레드 풀에서 스레드를 가져와 Servlet의 service() 메서드를 실행한다.
- servletRequest, servletResponse 객체를 파라미터로 넘긴다.
- service메서드 내부에서 doGet, doPost 메서드가 실행된다.
7. 비즈니스 로직을 처리하고 HttpservletRequest객체 데이터를 활용해 HttpServletResponse객체에 담는다.
8. ServletContainer는 응답 결과를 클라이언트에게 전송한다. 이때 서블릿은 HttpServletResponse객체를 사용해 응답을 생ㅅ엉한다.
- 혹은 동적 페이지를 response객체에 담아 was는 클라이언트에게 전달한다.
9. 생성되었던 servletRequest와 ServletResponse를 제거한다.(destroy) 생성된 스레드를 종료한다.

 

추가적으로, web.xml은 스프링 2.0 버전에 사용된 기술이다.

스프링 3.0 부터 어노테이션 기반 설정이 도입이 되었다. 컴포넌트 스캔으로 어노테이션으로 빈을 자동으로 검색하고 등록할 수 잇게 되었다. 그래서 web.xml이 없어도 서블릿 필터로 어노테이션으로 설정이 가능하게 되었다. 

 

DIspatcher Servlet

java의 servlet은 하나의 요청에 하나의 servlet을 생성한다. 많은 servlet이 생성되면 관리가 힘들다.

spring의 경우 dispatcherServlet이란  frontController패턴으로 이루어져 있다.

중앙에서 하나의 servlet요청을 받아 핸들러 매핑을 통해 그에 맞는 컨트롤러로 분배하는 방식을 사용한다.


하나의 객체로도 모든 요청을 먼저 처리하기 때문에 재사용성, 인터셉터 사용, 관리의 용이성이 있다.
dispatcherServlet에는 interceptor가 존재해 @ControllerAdvice를 적용해서 처리할 수 있다.

역할

- 모든 Request를 우선적으로 받아 처리해주는 서블릿

- HandlerMapping에게 Reqeuest에 대해 매핑할 Controller 검색을 요청한다.

- HandlerMapping으로부터 검색 결과를 받아서 그 Controller와 매핑을 시킨다.

 

 

HandlerMapping

사용자가 요청한 URL을 분석해 이것을 처리할 Handler를 찾아주는 인터페이스

Dispatcher Servlet으로부터 검색을 요청받아 그에 맞는 Controller를 찾아 정보를 리턴해준다.

 

동작

@RequestMapping

HandlerMapping을 순회하며 해당하는 RequestMapingHandlerMapping을 반환한다.

RequestMapingHandlerMapping은 요청 매핑 정보를 관리하고 요청이 오면 이를 처리하는 대상을 찾는 클래스이다.

 

DispatcherServlet클래스의 doService()의 doDispatch()가 실행되고 getHandler메서드에 의해 Handler를 찾즌다. 

HandlerMapping을 구현한 구현체의 우선순위에 따라서 찾게 된다. 

 

특징

@Controller로 작성된 모든 컨트롤러를 찾고 파싱해 HashMap<요청 정보, 처리할 대상 정보>형태로 관리한다.

요청 정보는 (Http Method, UR 등 헤더 파라미터 정보를 가진다.)

처리할 대상 정보는 HandlerMethod객체로 컨트롤러 메소드를 갖고 있다. 

 

HandlerMethod

매핑되는 컨트롤러 메소드와 컨트롤러 빈 정보 빈 팩토리 정보를 저장하고 있다.

컨트롤러 메소드 : reflection 패키지의 Method 객체. 메소드 invoke를 위해선 메소드 주인인 빈 객체를 필요로 함

빈 정보 : Object타입으로 컨트롤러 빈 이름이나 컨트롤러 빈이 된다.

빈 팩토리 : 스프링부트가 관리하는 빈ㅇ늘 가지고 있다. 컨트롤러의 메소드 호출을 위한 빈 객체 조회를 위해 사용된다.

 

HandlerExecutionChain으로 감싸서 반환한다. HandlerExecutionChain으로 감싸는 이유는 컨트롤러로 요청을 넘겨주기 전에 처리해야 하는 인터셉터를 포함해야 하기 때문이다.

 

HandlerAdapter

HandlerMapping이 찾은 Handler를 호출하고 실제로 처리하는 인터페이스

Dispatcher는 컨트롤러로 요청을 직접 위임하지 않고 HandlerAdapter를 통해 위임한다.(컨트롤러의 구현 방식이 다양해서 직접 처리x)

어댑터 패턴을 적용해 찾은 컨트롤러를 여기서 실행하게 된다.

 

동작

@RequestMapping

RequstMappingHandlerAdapter를 찾음

 

Handler Interceptor

HandlerAdapter가 컨트롤러로 요청을 전달하기 전 후에 처리 과정이 필요하다.

예를 들어, @RequestBody, @RequestParam을처리하기 위한 ArgumentResolver

응답시에 ResponseEntity Body를 Json으로 직렬화하는 ReturnValueHandler등이 있다.

 

파라미터가 준비되면 리플렉션을 이용해 컨트롤러로 요청을 위임한다.

 

HandlerMethod객체는 빈 이름, 빈 메서드, 빈 팩토리가 있어 빈 펙토리에서 컨트롤러 빈을 찾는다. 

그리고 그 컨트롤러 빈 객체로부터 리플렉션을 사용한다.

 

일반적인 인터셉터들이 동작하는 공간이 이곳을 의미한다.

 

비즈니스로직 처리

 

컨트롤러가 반환값을 반환함

비즈니스 로직을 처리한 이후에는 컨트롤러가 반환값을 반환한다. 주로 ResponseEntity나 view이름을 반환할 수도 있다.

 

HandlerAdapter가 반환값을 처리함

ReturnValueHandler가 후처리 후 DispatcherServlet을 전달한다.

컨트롤러가 ResponseEntity를 반환하면 HttpEntityMethodProcessor가 MessageConverter를 사용해 응답 객체를 직렬화하고 응답 상태를 설정한다. 

 

서버 응답을 클라이언트로 반환함

DispatcherServlet을 통해 반환된 응답은 필터를 거쳐 클라이언트에게 반환된다.

반환되는 값이 데이터면 그대로, view라면 viewResolver가 화면을 반환한다.

 

 

참고

https://mangkyu.tistory.com/18

'Spring' 카테고리의 다른 글

@Transactional 동작 과정  (0) 2024.02.28
OSIV 동작 과정  (0) 2024.02.28
상속 관계 매핑을 넘어..  (0) 2023.03.24
JPA 영속성 컨텍스트와 엔티티 생명주기  (0) 2023.03.06
일급 컬렉션이란?  (0) 2023.02.01
복사했습니다!