MVC 프레임워크 만들기 2

이성준·2022년 3월 1일
0

스프링 MVC

목록 보기
5/10

V5


프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할수 있게 변경
중간에 핸들러 어댑터가 추가 됐다. 핸들러 어댑터란 다양한 컨트롤러를 호출할수 있게 해주는 어댑터 역할을 한다 어댑터가 추가됐으니 컨트롤러는 더 넓은 의미인 핸들러라고 부른다.

MyHandlerAdapter

public interface MyHandlerAdapter {
 
 boolean supports(Object handler);
 
 ModelView handle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws ServletException, IOException;
}

어댑터가 해당 컨트롤러를 지원하는지? 지원한다면 handle을 호출하고 결과로 Model과View를 반환

ControllerV3HandlerAdapter

ControllerV3 controller = (ControllerV3) handler;
Map<String, String> paramMap = createParamMap(request);
ModelView mv = controller.process(paramMap);
return mv;

handler를 v3로 변환시켜줌

FrontControllerServletV5

@WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*")
public class FrontControllerServletV5 extends HttpServlet{

    private final Map<String,Object> handlerMappingMap = new HashMap<>();
    private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>();

    public FrontControllerServletV5() {
        initHandlerMappingMAp();
        initHandlerAdapters();
    }

    private void initHandlerAdapters() {
        handlerAdapters.add(new ControllerV3HandlerAdapter());
        handlerAdapters.add(new ControllerV4HandlerAdapter());
    }

    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());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Object handler = getHandler(request);
        if(handler ==null){
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }


        MyHandlerAdapter adapter = getHandlerAdapter(handler);

ModelView mv =adapter.handle(request,response,handler);

        String viewName= mv.getViewName();
        MyView view = viewResolver(viewName);
        view.render(mv.getModel(), request,response);
    }

    private MyHandlerAdapter getHandlerAdapter(Object handler) {
        for (MyHandlerAdapter adapter : handlerAdapters) {
            if(adapter.supports(handler)){
                return adapter;
            }
        }
        throw new IllegalArgumentException("handler adpater를 찾을수 없습니다" + handler);
    }

    private Object getHandler(HttpServletRequest request) {
        String requestURI = request.getRequestURI();

        Object controller = handlerMappingMap.get(requestURI);
        return controller;
    }

    private MyView viewResolver(String viewName) {
        MyView view = new MyView("/WEB-INF/views/" + viewName + ".jsp");
        return view;
    }

생성자자가 핸들러 매핑과 어댑터를 등록 그리고 adapter.supports(handler)를 통해서 찾는다. 그리고 어댑터가 handler를 호출하고 그 결과를 어댑터에 맞추어 반환한다.

0개의 댓글