MVC 프레임워크 만들기2

강한친구·2022년 4월 22일
0

Spring

목록 보기
11/27

Version 4

지금까지 만든 버전은 설계적으로는 훌륭한 프레임워크지만, 사용이 불편하다는 단점이 있다. 만들때마다 모델뷰를 만들고 넘기고 하는 불편함이 있다.

이를 개선하는 버전이 필요하다

Controllerv4

기존버전에서 Model을 만들어서 넘겼던것과 다르게, 이번 버전에서는 Model을 그냥 인자로 만들어서 바로 넘기게된다.

    String process(Map<String, String> paramMap, Map<String, Object> model);

FrontController

 Map <String, Object> model = new HashMap<>();
 String viewName = controller.process(paramMap, model);

크게 변한것 없이 이렇게 모델을 만들고 넘겨주면 된다.

Version 5

지금까지 만든 MVC들은 전부 틀이 정해져있는 방식이다. 따라서 유연하게 다양한 종류의 컨트롤러를 지원하는 유연한 컨트롤러를 만들어보려고 한다.

여기서 사용되는게 바로 어댑터 패턴이다. 프론트 컨트롤러가 서로 다른 형식의 컨트롤러를 다룰 수 있게 해주는것이다.

이를 컨트롤해줄 어댑터인 핸들러 어댑터가 필요하다.

Adaptor

public interface MyHandlerAdapter {

    boolean support(Object handler);

    ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException;
}

이 어댑터가 지원하는 양식인지 확인하는 support 기능과, ModelView로 넘겨주는 handle 기능이 있다.

V3Adaptor

    @Override
    public boolean support(Object handler) {
        return (handler instanceof ControllerV3);
    }

    @Override
    public ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        ControllerV3 controller = (ControllerV3) handler;

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

        return mv;
    }

어댑터에는 ModelView를 만들어주는 코드와, support 를 체크해주는 코드가 들어있다. 이제 Frontcontroller를 볼 차례이다.

FrontController

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

    public FrontControllerServletV5() {
        intiHandlerMappingMap();
        initHandlerAdaptors();
    }

우선 생성자를 통해 각 Controller를 저장하는 Map에 집어넣어주고, 동시에 Adpator들도 Adaptor관리 List에 넣는다.

이렇게 넣고 나면, adaptor 관리 리스트를 iter 하면서 지금 request에 맞는 adaptor를 찾아온다. 이얼헤 찾아온 어댑터의 handle을 작동시켜서 model를 만들고, 각 controller에 맞게 process한다. 그 후는 기존의 방식과 동일하게 처리된다.

AdaptorV4

    public ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        ControllerV4 controller = (ControllerV4) handler;

        Map<String, String> paramMap = createParamMap(request);
        HashMap<String, Object> model = new HashMap<>();

        String viewName = controller.process(paramMap, model);

        ModelView mv = new ModelView(viewName);
        mv.setModel(model);

        return mv;
    }    

v4의 경우 모델을 사용하지 않았었다. 따라서 Adpator에서 Model을 만들고 setModel까지 해준 후 ModelView를 반환하고 frontController가 이를 받아서 처리한다.

이러한 과정을 통해서 SpringMVC와 거의 유사한 구조와 발전과정을 가진 프레임워크가 된다.

0개의 댓글