1. Dispatcher Servlet이란?
디스패처 서블릿은 Spring Framework에서 HTTP 프로토콜로 들어오는 요청을 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러입니다.
프론트 컨트롤러란 무엇일까?
프론트 컨트롤러(Front Controller)는 서블릿 컨테이너 제일 앞에서 서버로 들어오는 클라이언트 요청을 받아서 처리해주는 컨트롤러로 공통된 처리 과정을 거친 후 적절한 컨트롤러나 서비스로 요청을 전달하는 역할을 합니다.
프론트 컨트롤러가 어플리케이션의 요청을 핸들링 해주고, 공통 작업을 처리해주어 중복 코드를 제거할 수 있다는 장점이 있습니다.
2.Dispatcher Servlet 동작 과정
1. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 맞는 Handler(Controller)를 찾는다.
HandlerMapping은 들어오는 요청을 적절한 Handler에 매핑하는 역할을 합니다. 클라이언트의 요청 URL, HTTP 메서드, 요청 파라미터 등을 바탕으로 어떤 Handler가 요청을 처리해야 할지를 결정하게 됩니다.
- ex) 클라이언트가 /home으로 요청을 보냈다면, HandlerMapping은 /home 요청을 처리할 수 있는 Handler를 찾음
2. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회
HandlerAdapter는 HandlerMapping이 반환한 Handler를 실제로 실행하는 역할을 합니다. HandlerAdapter는 다양한 종류의 Handler를 실행할 수 있도록 어댑터 패턴으로 구성되어 있습니다.
- ex) HandlerAdapter는 @Controller 메서드뿐만 아니라, 다른 형태의 Handler (예: HttpRequestHandler, SimpleControllerHandler)도 실행할 수 있다.
- RequestMappingHandlerAdapter: @RequestMapping 어노테이션을 사용하는 핸들러 메서드를 실행
- HttpRequestHandlerAdapter: HttpRequestHandler 인터페이스를 구현하는 핸들러를 실행
- SimpleControllerHandlerAdapter: Controller 인터페이스를 구현하는 핸들러를 실행
3. 핸들러 어댑터가 실제 핸들러를 실행한다.
파라미터를 읽고 변환해 메서드 인자로 전달합니다. 그 후 비즈니스 로직을 실행하고 결과를 반환합니다.
- HandlerAdapter가 Handler를 실행하여 요청을 처리하고 ModelAndView 객체를 반환
- 이 과정에서 요청 데이터를(@RequestParam,@ResponseBody) 읽고 변환하며, Handler 메서드를 호출하고, 반환값을 반환함
처리된 비즈니스 로직의 결과가 ResponseEntity를 반환한다면 ModelAndView는 사용되지 않고, HttpMessageConverter가 응답 객체를 직렬화하고 HTTP응답으로 반환한다.
4. ViewResolver를 통해 뷰를 찾고 해당 view를 반환한다.
5. 뷰를 렌더링한다.
3. 총정리
1. 핸들러 조회: HandlerMapping을 통해 요청 URL에 맞는 Handler(Controller)를 찾는다.
2. 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 HandlerAdapter를 조회한다.
3.핸들러 어댑터 실행:
- 비즈니스 로직을 실행하고 결과를 반환한다.
- 응답 데이터 반환 시: ResponseEntity 또는 @ResponseBody를 반환하는 경우, HttpMessageConverter가 응답 객체를 직렬화하고 HTTP 응답으로 반환한다.
- 뷰 이름 반환 시: ModelAndView를 반환한다.
4.뷰 찾기 및 반환: ViewResolver를 통해 뷰를 찾고 해당 뷰를 반환한다.
5. 뷰 렌더링: 최종 응답 결과를 클라이언트에게 반환한다.
참고
https://studyandwrite.tistory.com/463
'Backend > spring' 카테고리의 다른 글
[Spring] OpenFeign란? (1) | 2024.09.11 |
---|---|
[Spring]스프링 이벤트를 이용한 도메인 의존성 분리 및 고려할 점 (2) | 2024.09.09 |
[Spring] 서블릿 필터(Filter), 인터셉터(Interceptor) 개념과 차이점 (0) | 2024.08.05 |
[Spring] 의존성 주입의 3가지 방법 (0) | 2024.05.28 |
[Spring] Rest Docs으로 API 문서화하기 (1) | 2023.06.30 |