스프링 MVC 구조에 대해 설명해 주세요.


HandlerMapping
요청을 처리할 핸들러(컨트롤러)를 찾는 역할(인터페이스)
getHandler()메서드 를 통해 요청된 URL에 매핑되는 핸들러(컨트롤러)를 찾아서 반환한다.RequestMappingHandlerMapping이 구현체이며, 이 구현체는@RequestMapping애노테이션이 붙어있는 컨트롤러 메서드를 모두 스캔해서 해당 메서드와 URL 간의 매핑 정보를 관리한다.
HandlerAdaptor
HandlerMapping을 통해 찾은 핸들러(컨트롤러)의 실제 로직을 수행하는 역할(인터페이스)이러한 어댑터를 사용해 핸들러의 종류에 상관 없이 다양한 종류의 핸들러를 실행할 수 있다.
supports()메서드로 핸들러 어댑터가 파라미터로 들어온 핸들러를 지원하는지에 대한 여부를 반환한다.handle()메서드로 실제 핸들러 로직을 수행한다.
ViewResolver
반환된
View이름을 실제 View 객체로 변환하는 역할(인터페이스)위에
HandlerAdaptor의handle()메서드는ModelAndView라는 객체를 반환한다.ModelAndView: 컨트롤러에서 처리한 데이터(모델)와 해당 데이터를 표시할View의 정보를 가진 객체
이제
ViewResolver는resolveViewName()메서드를 통해View이름을 가지고 실제View객체를 찾아서 반환한다.
DispatcherServlet
사용자의 요청을 가장 처음 받는 곳(프론트 컨트롤러)으로 내부에
HandlerMapping,HandlerAdpator,ViewResolver를 모두 가지고 있다.DispatcherServlet의 핵심 메서드인doDispatch()는 다음과 같은 과정으로 동작한다.
핸들러 조회
핸들러 어댑터 조회
핸들러 어댑터 실행
핸들러 어댑터는 실제 핸들러를 실행
핸들러 어댑터는 핸들러가 반환하는 정보를
ModelAndView로 변환해서 반환뷰 리졸버를 통해 반환된 뷰 이름에 해당하는 뷰를 조회
뷰 렌더링
Spring MVC 전체 동작 흐름
요청
클라이언트로부터 요청이 오면 이 요청은 프론트 컨트롤러인
DispatcherSerlvet에게 전달된다.
HandlerMapping
DispatcherServlet은HandlerMapping에게 요청을 어떤 컨트롤러에 보낼지에 대한 매핑 정보를 요청한다.
HandlerAdaptor
HandlerMapping이 찾은 컨트롤러를 받아 컨트롤러의 실제 로직을 수행한다.
Controller
컨트롤러는 비즈니스 로직을 수행하고, 필요한 데이터를 모델에 담는다.
HandlerAdaptor
컨트롤러에서 받은 정보를
ModelAndView객체로 변환해서DispatcherServlet에게 전달한다.
ViewResolver
DispatcherServlet에게 받은ModelAndView의 뷰 이름을 가지고 실제View객체를 찾아서 다시DispatcherServlet에게 전달한다.
View
ViewResolver를 통해 찾은 뷰는 모델의 담긴 데이터를 이용해서 클라이언트에게 보여줄 최종 결과물을 생성한다.
응답
DispatcherServlet은 생성된 뷰를 클라이언트에게 응답하고 요청을 마친다.
참고
Last updated