Spring MVC 구조에서는 DispatcherServlet이 클라이언트의 요청을 받아 해당 요청을 처리하는 핸들러를 호출한다. 그런 후 요청을 처리한 핸들러로부터 받은 결과로 뷰를 렌더링한다. 뷰를 렌더링하기 전에 뷰 리졸버를 통해서 원하는 뷰를 찾아야 하는데, 그렇게 하기 위해서 핸들러는 ModelAndView 타입을 반환해야 한다. 즉, DispatcherServlet은 ModelAndView타입을 핸들러로부터 받아야 한다.
여기서 핸들러는 클라이언트의 요청을 처리하는 컨트롤러다. spring에서는 @controller를 적용한 객체 또는 controller인터페이스를 구현한 객체를 말한다.
하지만 핸들러는 객체 타입에 따라 ModelAndView타입을 리턴할 수도 있고 아닐 수도 있다. 그렇기 때문에 핸들러의 반환값을 ModelAndView로 변환하는 역할을 하는 HandlerAdapter가 필요하다.

클라이언트 요청이 들어오면 DispatcherServlet은 해당 요청을 처리할 핸들러를 HandlerMapping을 통해 찾는다. 어떤 핸들러가 요청을 처리할지 찾았으면 그 핸들러에 상응하는 핸들러 어댑터를 실행한다. 해당 핸들러 어댑터에서는 요청을 처리할 핸들러를 호출하고, 반환값을 ModelAndView타입으로 변환하여 DispatcherServlet으로 전달한다.
핸들러의 실제 타입에 따라 HandlerMapping과 HandlerAdapter는 달라지기 때문에 위의 구조를 더 자세히 나타내면 아래 그림과 같다.

핸들러 조회
핸들러 매핑을 통해서 클라이언트 요청에 상응하는 핸들러를 찾아야 한다. 하지만 핸들러에 따라서 찾는 방법이 달라질 수 있다. 예를 들어 @RequestMapping을 통해 컨트롤러(헨들러)를 등록했다면 RequestMappingHandlerMapping 방식으로 찾을 수 있고, 스프링 빈 이름을 요청 URL로 등록했다면 BeanNameUrlHandlerMapping방식으로 찾아햐 한다. 그 밖에도 다른 방법들이 있기 때문에 spring에 등록된 우선순위에 따라 HandlerMapping을 핸들러를 찾을 때까지 순서대로 실행한다.
핸들러 어댑터 조회 및 실행 / 핸들러 실행
핸들러 어댑터도 마찬가지로 특정 핸들러의 타입에 따라 종류가 여러가지이다. 따라서 HandlerAdapter의 supports()를 순서대로 호출하여 핸들러에 맞는 어댑터를 조회하고 실행한다. 그러면 핸들러 어댑터에서 실제 핸들러를 실행하고 핸들러가 반환하는 정보를 ModelAndView타입으로 변환하여 DispatcherServlet으로 반환한다.
* 여러 HandlerMapping과 HandlerAdapter가 존재하지만 보통 RequestMappingHandlerMapping과 ResquestMappingHandlerAdapter가 가장 많이 쓰이고 우선순위도 가장 높다.
'📒 BackEnd > 📝 spring' 카테고리의 다른 글
[spring] build.gradle 의존성 관리 compile, runtime (0) | 2022.06.17 |
---|---|
[spring + vue.js] SPA 새로고침 404에러 (1) | 2022.06.09 |
Spring MVC 구조에서는 DispatcherServlet이 클라이언트의 요청을 받아 해당 요청을 처리하는 핸들러를 호출한다. 그런 후 요청을 처리한 핸들러로부터 받은 결과로 뷰를 렌더링한다. 뷰를 렌더링하기 전에 뷰 리졸버를 통해서 원하는 뷰를 찾아야 하는데, 그렇게 하기 위해서 핸들러는 ModelAndView 타입을 반환해야 한다. 즉, DispatcherServlet은 ModelAndView타입을 핸들러로부터 받아야 한다.
여기서 핸들러는 클라이언트의 요청을 처리하는 컨트롤러다. spring에서는 @controller를 적용한 객체 또는 controller인터페이스를 구현한 객체를 말한다.
하지만 핸들러는 객체 타입에 따라 ModelAndView타입을 리턴할 수도 있고 아닐 수도 있다. 그렇기 때문에 핸들러의 반환값을 ModelAndView로 변환하는 역할을 하는 HandlerAdapter가 필요하다.

클라이언트 요청이 들어오면 DispatcherServlet은 해당 요청을 처리할 핸들러를 HandlerMapping을 통해 찾는다. 어떤 핸들러가 요청을 처리할지 찾았으면 그 핸들러에 상응하는 핸들러 어댑터를 실행한다. 해당 핸들러 어댑터에서는 요청을 처리할 핸들러를 호출하고, 반환값을 ModelAndView타입으로 변환하여 DispatcherServlet으로 전달한다.
핸들러의 실제 타입에 따라 HandlerMapping과 HandlerAdapter는 달라지기 때문에 위의 구조를 더 자세히 나타내면 아래 그림과 같다.

핸들러 조회
핸들러 매핑을 통해서 클라이언트 요청에 상응하는 핸들러를 찾아야 한다. 하지만 핸들러에 따라서 찾는 방법이 달라질 수 있다. 예를 들어 @RequestMapping을 통해 컨트롤러(헨들러)를 등록했다면 RequestMappingHandlerMapping 방식으로 찾을 수 있고, 스프링 빈 이름을 요청 URL로 등록했다면 BeanNameUrlHandlerMapping방식으로 찾아햐 한다. 그 밖에도 다른 방법들이 있기 때문에 spring에 등록된 우선순위에 따라 HandlerMapping을 핸들러를 찾을 때까지 순서대로 실행한다.
핸들러 어댑터 조회 및 실행 / 핸들러 실행
핸들러 어댑터도 마찬가지로 특정 핸들러의 타입에 따라 종류가 여러가지이다. 따라서 HandlerAdapter의 supports()를 순서대로 호출하여 핸들러에 맞는 어댑터를 조회하고 실행한다. 그러면 핸들러 어댑터에서 실제 핸들러를 실행하고 핸들러가 반환하는 정보를 ModelAndView타입으로 변환하여 DispatcherServlet으로 반환한다.
* 여러 HandlerMapping과 HandlerAdapter가 존재하지만 보통 RequestMappingHandlerMapping과 ResquestMappingHandlerAdapter가 가장 많이 쓰이고 우선순위도 가장 높다.
'📒 BackEnd > 📝 spring' 카테고리의 다른 글
[spring] build.gradle 의존성 관리 compile, runtime (0) | 2022.06.17 |
---|---|
[spring + vue.js] SPA 새로고침 404에러 (1) | 2022.06.09 |