
사전 지식
프론트 컨트롤러 패턴
요청에 관한 공통 처리는 중앙제어
개별적인 세부 요청사항들은 각각의 컨트롤러로 배분
어댑터 패턴
서로 다른 인터페이스를 가진 클래스들을 연결하는 패턴
동일한 인터페이스를 갖도록 구성하면
한 개의 인터페이스 타입으로 내부 처리를 전부 할 수 있다
// DispatcherServlet 에서 사용하는 HandlerAdapter
// HandlerAdapter 인터페이스 (공통 인터페이스)
public interface HandlerAdapter {
boolean supports(Object handler); // 처리 가능 여부 판단(boolean)
ModelAndView handle( // 어떻게 처리할 것인지에 대한 로직
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception;
}
// Controller 구현 1 (HandlerAdapter를 implements)
public class RequestMappingHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof HandlerMethod; // @RequestMapping 메서드인지 확인
}
@Override
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// @Controller 방식으로 처리
return invokeHandlerMethod((HandlerMethod) handler, request, response);
}
}
// Controller 구현 2 (HandlerAdapter를 implements)
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof Controller;
}
@Override
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
// Controller 인터페이스 방식으로 처리
return ((Controller) handler).handleRequest(request, response);
}
}DispatcherServlet
클라이언트의 요청을 앞서 받는 프론트 컨트롤러
디스패쳐 서블릿은 클라이언트의 요청을 전부 처리하고 있는데
이게 어떻게 가능한가는 프론트 컨트롤러와 어댑터 패턴을 적절하게 사용 했기 때문우선 HTTP 요청을 프론트 컨트롤러 패턴을 통해 전부 공통적으로 받았고
그 이후엔 HandlerMapping 를 통하여 URL 요청에 따라
핸들러들을 찾는데, HandlerAdapter 인터페이스들을 통해
핸들러들 구현하였기 때문에 이들을 이용하여 전부를 처리하고 있다
Share article