DispatcherServlet 없이 순수 서블릿일 때의 실행 흐름을 간소화해보면
- web.xml 또는 @webServlet의 URL 패턴을 기준으로 HttpServlet 인스턴스를 선택
- 컨테이너가 선택된 서블릿의 service()를 호출하고, 내부 HTTP 메서드의 따라 분기(doGet, doPost...)
- JSON or getWrite(), getOutputStream() 그리고 JSP라면 그에 맞게 응답을 직접 작성
- 2번 전, 3번 후 필터 체인
으로 정리해 볼 수 있다
핵심은 모든 걸 직접 해야 한다는 것인데 단순한 기능이 늘수록 반복 코드가 증가하는 단점이 있는데 이를 보안해주는 기술이 DispatcherServlet이다.
DispatcherServlet의 동작 흐름
- 핸들러 선택
- 핸들러 검색(HandlerMapping)
- URL, HTTP 메서드 등 조건에 맞는 컨트롤러(핸들러)를 찾는다
- 매칭된 핸들러에 연결된 인터셉터( preHandle() )가 호출된다
- 핸들러 검색(HandlerMapping)
- 핸들러 실행(HandlerAdapter -> 인자 바인딩 -> 컨트롤러 메서드)
- 핸들러 타입(@controller, 레거시 컨트롤러, @webServlet 등)에 맞는 핸들러 어댑터를 선택한다
- @RequestParam, @PathVariable, @RequestHeader, @RequestBody, @ModelAttribute 등 파라미터가 각 애노테이션에 맞게 자동 주입
- @RequestBody의 경우 HttpMessageConverter가 HTTP 바디(JSON/XML 등)를 객체로 역직렬화
- 컨트롤러 메서드 실행
- 반환값 처리(body 직렬화, 뷰 렌더링)
- @ResponseBody, @RestController의 경우 HttpMessageConverter를 통해 객체를 바디에 직렬화
- @Controller의 경우 문자열/ ModelAndView/ 모델 객체를 반환하면 논리 뷰 이름을 만들고 ModelAndView 객체를 반환
- 문자열의 경우 ViewResolver가 미리 정해 둔 prefix / suffix를 붙여 물리 뷰로 바꿔 준다
- ex) jsp의 경우 prefix = "WEB-INF/views/"
suffix = ".jsp"
- ex) jsp의 경우 prefix = "WEB-INF/views/"
- 문자열의 경우 ViewResolver가 미리 정해 둔 prefix / suffix를 붙여 물리 뷰로 바꿔 준다
- produces, Accept 헤더 조건을 고려해 적절한 메세지 컨버터(JSON, XML 등)를 고른다
- 뷰 렌더링(ViewResolver) ModelAndView가 있다면 DispatcherServlet이 ViewResolver 체인으로 논리뷰 이름으로 실제 뷰를 찾아 렌더링한다(Thymeleaf/ JSP 등)
'CS > Spring' 카테고리의 다른 글
JPA (1) | 2025.08.27 |
---|---|
Servlet? ServletContainer? (5) | 2025.08.18 |
AOP 정리 (5) | 2025.08.13 |