
Servlet, Servlet Container, DispatcherServletFramework/Spring2024. 9. 30. 20:55
Table of Contents
728x90
1. Servlet
: Server Applet(Application Let)의 줄임말로, 서버단에서 실행되는 작은 어플리케이션
2. Servlet Container
: Servlet을 실행하며, LifeCycle을 관리하는 Software
- 대표적으로 Apache Tomcat
3. DispatcherServlet
: Dispatcher(보내다)를 포함하는 해당 단어는
HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아, 적합한 Controller에 위임해주는 Front Controller!
- 장점
- 과거에 모든 Servlet-URL 매핑을 위해 모두 web.xml에 등록해야 했던 불편함 해소
- 단점
- 정적 자원(Static Resources) 처리
why? DispacherServlet이 모든 요청을 가로챔
-> 이미지, HTML 등의 정적 파일 요청 또한 모두 가로챔
=> 해결방안
: DispatcherServlet이 요청을 처리할 Controller을 먼저 찾게됨.
=> 요청과 Mapping되는 Controller 존재 X일 때, 정적 자원 경로를 탐색
- 정적 자원(Static Resources) 처리
동작방식
1. 클라이언트의 요청을 DispatcherServlet이 수신
- Filter를 지나서 DispatcherServlet이 받음
- 실제론 Interceptor -> Controller로 요청을 위임하는 것이 아님(사진 혼동 X)
2. 요청 정보를 이용하여 HandlerMapping을 통해 요청을 위임할 Controller 찾음
- @Controller 방식은 RequestMappingHandlerMapping이 처리함
- @Controller로 작성된 모든 Controller를 찾고 파싱하여,
HashMap<요청 정보, 처리할 대상>으로 관리 - 처리할 대상 : HandlerMethod 객체 ( Controller, Method 등 가짐 )
=> 스프링이 Reflection을 이용하여 요청을 위임하기 때문임
=> 정리하자면, 요청이 오면 HttpMethod, URI 등을 통해 요청 정보 생성 후,
HashMap에서 HandlerMethod(처리할 대상)을 찾은 후,
HandlerExecutionChain으로 감싸서 반환
- 왜 감싸는가?
: Controller로 요청을 넘기기 전, 처리해야 하는 Interceptor 등을 포함하기 위함
- 왜 감싸는가?
- @Controller로 작성된 모든 Controller를 찾고 파싱하여,
3. 요청을 해당 Controller로 위임하기 위해 해당되는 HandlerAdapter를 찾아 전달
- Controller의 구현 방식이 다양하기에 HandlerAdapter를 통해 위임함
4. HandlerAdapter -> Controller로 요청위임
- HandlerAdapter가 Controller로 요청 위임 전/후로 공통적인 전/후처리 과정 필요
- Intercepter들을 포함하여,
요청 시 @RequestParam, @RequestBody 등 처리를 위한 ArgumentResolver들과
응답 시 ResponseEntity의 Body를 Json으로 직렬화 등의 처리를 하는 ReturnValueHandler 등이
HandlerAdapter에서 처리됨 - ArgumentResolver 등을 통해 파라미터 준비 완료 시,
Reflection을 이용하여 Controller로 요청 위임
5. 비즈니스 로직 처리
6. Controller가 ResponseEntity 반환
7. HandlerAdapter가 ResponseEntity 처리
- ReturnValueHandler가 후처리 후, DispatcherServlet으로 돌려줌.
- Controller가
- ResponseEntity 반환 시,
HttpEntityMethodProcessor가 MessageConverter를 사용하여
응답 객체 직렬화 및 HttpStatus 설정 - View 이름 반환 시,
ViewResolver를 통해 View 반환
- ResponseEntity 반환 시,
8. 서버의 응답을 클라이언트로 반환
728x90
'Framework > Spring' 카테고리의 다른 글
DI(Dependency Injection) (2) | 2024.10.09 |
---|---|
IoC(Inversion of Control)/ IoC Container (2) | 2024.10.08 |
@or-else :: orElse의 팔만대장경
안녕하세요. 성장하고 싶은 개발자 orElse입니다. 지켜봐주세요.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!