오봉이와 함께하는 개발 블로그
스프링 MVC 1 - 유연한 컨트롤러(핸들러) 2 v5.2 본문
728x90
유연한 컨트롤러2 - v5
FrontControllerServletV5에 ControllerV4 기능도 추가하자.
FrontControllerServletV5
private void initHandlerMappingMap() {
handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3());
handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3());
handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3());
handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4());
handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4());
handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4());
}
private void initHandlerAdapters() {
handlerAdapters.add(new ControllerV3HandlerAdapter());
handlerAdapters.add(new ControllerV4HandlerAdapter());
}
ControllerV4HandlerAdapter
public class ControllerV4HandlerAdapter implements MyHandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof ControllerV4);
}
@Override
public ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
ControllerV4 controller = (ControllerV4) handler;
Map<String, String> paramMap = createParamMap(request);
Map<String, Object> model = new HashMap<>();
String viewName = controller.process(paramMap, model);
ModelView mv = new ModelView(viewName);
mv.setModel(model);
return mv;
}
private Map<String, String> createParamMap(HttpServletRequest request) {
Map<String, String> paramMap = new HashMap<>();
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName)));
return paramMap;
}
}
분석
@Override
public boolean supports(Object handler) {
return (handler instanceof ControllerV4);
}
handler가 ControllerV4인 경우에만 처리하는 어댑터
실행 로직
ControllerV4 controller = (ControllerV4) handler;
Map<String, String> paramMap = createParamMap(request);
Map<String, Object> model = new HashMap<>();
String viewName = controller.process(paramMap, model);
handler를 ControllerV4로 캐스팅하고 paramMap, model을 만들어서 해당 컨트롤러를 호출
그리고 viewName을 반환 받음.
어댑터 변환
ModelView mv = new ModelView(viewName);
mv.setModel(model);
return mv;
어댑터가 호출하는 ControllerV4는 뷰의 이름을 반환한다.
그런데 어탭터는 뷰의 이름이 아니라 ModelView를 만들어서 반환해야 한다.
ControllerV4는 뷰의 이름을 반환헀지만, 어댑터는 ModelView로 만들어서 형식을 맞춰 반환하기 때문에 어댑터가 필요한 것.
출처 : 인프런 김영한 지식 공유자님 강의 - 스프링 MVC 1편 백엔드 웹 개발 핵심 기술
728x90
'BE > Servlet' 카테고리의 다른 글
스프링 MVC 1 - 유연한 컨트롤러(핸들러) 1 v5.1 (0) | 2022.08.12 |
---|---|
스프링 MVC 1 - 단순하고 실용적인 컨트롤러 v4 (0) | 2022.08.11 |
스프링 MVC 1 - Model 추가 v3 (0) | 2022.08.11 |
스프링 MVC 1 - View 분리 v2 (0) | 2022.08.11 |
스프링 MVC 1 - 프론트 컨트롤러 도입 v1 (0) | 2022.08.11 |
Comments