본문 바로가기

Spring

Spring(8) - HandlerMapping, HandlerAdapter

들어는 봤지만 정확한 개념에 대해서는 모르는 HandlerMpping, HandlerAdapter에대해서 공부해보았다.
HandlerMapping이 찾은 컨트롤러를 HandlerAdapter에 요청을 해서 그 결과값을 가져오는 것이 스프링 MVC의 흐름인데, 왜 ControllerMapping이나 ControllerAdapter라고 하지는 않을까? 그리고 DispatcherServlet에 ModelAndView로 처리결과를 리턴해야하는데, 모든 결과가 ModelAndView 형태로 리턴되지는 않는데 어떻게 가능할까? 이런 궁금증들을 해결해보고자 여러 교재와 문서를 참고했다.

HandlerMapping

- HandlerMapping은 클라이언트가 요청이오면 그 요청에맞는 컨트롤러(핸들러)를 찾아준다. 여기서 컨트롤러와 핸들러는 같은 의미로 사용되는데, 컨트롤러에만 국한하지않고 좀 더 범용적인 의미를 나타내는 것이 핸들러이다. HandlerMapping은 우선순위를 가지고 있으며 우선순위가 높은 HandlerMapping이 null을 리턴하면 그 다음 우선순위를 가진 HandlerMapping이 실행되고 이렇게 모든 HandlerMapping이 null을 리턴하면 404에러 코드를 응답한다. 요청에 맞는 객체(컨트롤러)를 찾으면 HandlerAdapter에 컨트롤러 실행을 위임한다.

HandlerAdapter

- HandlerAdapter는 컨트롤러(핸들러)가 처리한 결과값을 받아서 ModelAndView 형태로 바꿔 DispatcherServlet에 보내준다. 이런 기능 덕분에 어떤 형태의 객체로 결과값을 받던지간에 상관없이 웹요청을 처리할 수 있게 된다. 예를 들어 컨트롤러에서 String값을 리턴해주어도 그값을 ModelAndView로 변환해서 DispatcherServlet으로 보내준다.


@Controller
public Class Controller{
	public String exAdapter(Model model){
    	model.addAttribute("greeting", "안녕하세요");
        return "hello";
    }
}

이런식으로 hello라는 String값을 반환해도 HandlerAdapter에서 ModelAndView형태로 변환시켜서 값을 전달해준다.