신비한 개발사전
Spring MVC 동작에 대한 전체적인 복습 본문
Spring MVC는 프론트 컨트롤러 패턴을 중심으로 설계되었다. 프론트 컨트롤러는 클라이언트 요청을 처리하는 컨트롤러가 요청 처리에 필요한 작업들을 직접 수행하는 대신, 추상화된 command들을 호출해서 작업을 처리하는 패턴이다.
Spring의 아키텍쳐에서 이 프론트 컨트롤러의 역할을 하는 것을 DispatcherServlet이라고 한다.
DispatcherServlet
Spring 프레임워크의 일부인 서블릿 컨테이너(WAS)가 관리하는 서블릿 중 하나다. 서블릿 컨테이너가 클라이언트의 HTTP 요청을 받아 생성하는 HttpServletRequest와 HttpServletResponse를 전달 받아 처리하는 역할을 맡는다.
DispatcherServlet은 혼자 모든 일을 하지 않는다. 프론트 컨트롤러 패턴에서 여러 command를 호출해 작업하는 것처럼, DispatcherServlet도 special bean이라고 하는 도우미들에게 본인의 일감을 나눠준다.
DispatcherServlet의 클라이언트 요청 처리 과정
- 서블릿 컨테이너가 HttpServletRequest, HttpServletResponse를 DispatcherServlet한테 전달한다.
- DispatcherServlet이 요청 URL에 대한 매핑 작업을 HandlerMapping에게 위임한다.
- HandlerMapping은 해당 URL을 path로 설정한 handler(컨트롤러)를 찾아낸다.
- 찾은 handler를 실행시킬 HandlerAdapter를 찾아낸다.
- HandlerAdapter가 실제로 handler의 메서드를 호출해 handler의 비즈니스 로직을 수행하도록 한다.
- Handler의 작업에 대한 결과로 ModelAndView가 반환되면 view의 이름을 ViewResolver에게 넘겨 실제 뷰를 찾도록 한다. @ResponseBody를 사용한 경우 ViewResolver 대신 HttpMessageConverter가 동작한다.
- ViewResolver/View 또는 HttpMessageConverter를 통해 응답을 처리한다.
Interceptor
Interceptor는 DispatcherServlet이 요청을 처리하는 도중 난입해 중간 작업을 수행할 수 있는 bean이다.
HandlerAdapter가 handler를 실행하기 전에, interceptor가 있다면 interceptor의 preHandle 메서드를 사전에 실행시킨다. Interceptor가 true를 반환하면 다음 작업으로 넘어가고, false를 반환하면 그 시점에서 모든 후속 작업을 중지시킨다.
Interceptor는 이후에도 두 번 더 동작할 수 있다. HandlerAdapter의 작업이 끝난 다음 postHandle 메서드가 호출될 수 있고, 마지막으로 응답이 처리된 후에 afterCompletion 메서드가 호출될 수 있다.
참고:
'Backend' 카테고리의 다른 글
RestTemplate vs RestClient (0) | 2025.05.21 |
---|---|
@DataJpaTest 롤백은 id까지 초기화해주지 않는다 (0) | 2025.05.17 |
@Sql로 테스트 데이터 사용 시 유의할 점 (0) | 2025.05.10 |
일관된 Spring 에러 핸들링에 대한 고민 (0) | 2025.05.07 |
Spring에서 검증을 처리하는 방법 (0) | 2025.05.05 |