스프링/3. 스프링 MVC

32. 핸들러매핑, 핸들러어댑터

sdafdq 2023. 8. 9. 21:54
@Component("/springmvc/old-controller")
public class OldController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("OldController.handleRequest");
        return null;
    }
}

과거 버전이다.

Controller와 이노테이션인 @Controller와는 다르다.

 

스프링이 등록해놓은 핸들러매핑과 핸들러어댑터 종류를 몇가지만 소개하겠다.

핸들러 맵핑

RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러이다. 

BeanNameUrlHandlerMapping : 스프링 빈 이름으로 컨트롤러를(핸들러를) 찾는다.

 

핸들러어댑터

RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러를 어댑팅 해준다.

HttpRequestHandlerAdapter : HttpRequestHandler 처리.

SimpleControllerHandlerAdapter :  Controller 인터페이스를 상속받은 핸들러를 어댑팅해준다.

 

위를 보면 옛날거인 Controller를 상속받아 봤다.

 

순서는 먼저 dispatcherServlet이 들어온 요청에 대해 Handler를 찾는다.

먼저 @RequestMapping먼저 찾아보는데, 없으므로 그 다음 BeanNameUrlHandlerMapping을 이용해 찾는다(실제로는 더 많다.)

 

그럼 있다. 이름으로 등록했다.

http://localhost:8080/springmvc/http-controller

 

핸들러맵핑에서 찾았으니, 이제는 어댑터를 이용해 뷰가 처리할 수 있게끔 내가 필요한 정보와 핸들러 맵핑(비즈니스 로직)과 request를 잘엮어서 ModelAndView를 반환하고, 이걸 ViewResolve해서 물리이름을 이끌어내고, view에다 request, response, model을 담아 보낸다.

 

어댑터를 찾는 것은

RequestMappingHandlerAdapter가 아니다. 

이거 돌 때 실제로

	protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
		if (this.handlerAdapters != null) {
			for (HandlerAdapter adapter : this.handlerAdapters) {
				if (adapter.supports(handler)) {
					return adapter;
				}
			}
		}
		throw new ServletException("No adapter for handler [" + handler +
				"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
	}

이렇게 돈다. 이건 그냥 아예 있는 코드 실제로 가져온거다.

 

surpports에 가보면,

	@Override
	public boolean supports(Object handler) {
		return (handler instanceof HttpRequestHandler);
	}

실제로 이렇게 있다. 

 

 

 

@Component("/springmvc/http-controller")
public class MyHttpRequestHandler implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("httpRequestHandler");
    }
}

얘도 똑같다.

'스프링 > 3. 스프링 MVC' 카테고리의 다른 글

34. 스프링 MVC  (0) 2023.08.09
33. 뷰 리졸버  (0) 2023.08.09
31. 스프링 MVC 구조  (0) 2023.08.09
30. 어댑터 패턴 정리  (0) 2023.08.07
29. 어댑터 패턴  (0) 2023.08.07