오봉이와 함께하는 개발 블로그

스프링 MVC 1 - 유연한 컨트롤러(핸들러) 2 v5.2 본문

BE/Servlet

스프링 MVC 1 - 유연한 컨트롤러(핸들러) 2 v5.2

오봉봉이 2022. 8. 12. 00:35
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
Comments