Backend

FrontController, View, Model, Adapter, Handler

연_우리 2021. 12. 1. 00:36
반응형

목차

     

    기존의 MVC Servlet

    이전의 코드에서는 공통부분의 중복이 발생했다.

    ( 분홍색은 주소를 맵핑하는 공통부분, 노란색은 model에 값을 담는 공통부분, 초록색은 view를 호출하는 공통부분이다. )

     

    공통부분을 Front Controller로 빼내고, 각 주소에 따라서 각각의 Controller에 요청을 전달해주자.

    잘 보면 공통부분만 HttpServlet이 필요하고, 나머지부분은 자바 코드로만 작성해도 문제없다.

     

    -> 공통부분 Front Controller는 Servlet으로 작성하고

    -> 각각의 Controller는 자바로 작성한다.

     

     

    FrontController 프론트컨트롤러 도입

    주소맵핑 공통부분으로 빼면서 바뀐 점

     - 기존 각각 서블릿코드의 @WebServlet, extends HttpServlet 내용이 FrontControllerServletV1으로 취합되었다.

     - MvcMemberFormServlet 에서 MemberFormControllerV1으로 변경되면서 해당 코드는 더이상 서블릿이 아니게되었다. 

     - FrontController에서 주소에 맞는 각 컨트롤러(From, Save, ListControllerV1)에게 Request, Response전달을 보장하기위해서 ControllerV1이란 인터페이스를 만들었다.

     

     - 아직 view 호출부분과 model에 값을 저장하는 부분은 개선되지 않았다

     

     

    MyView 도입

    View호출 공통부분으로 빼면서 바뀐 점

     - 각 컨트롤러의 view호출 공통로직이 MyView 클래스 반환하는 것으로 처리되었다.

     - FrontContoroller에 MyView render메서드 수행 역할이 추가되었다

     

    처리과정

    1. 클라이언트 브라우저 주소창을 통해 요청이 FrontController로 들어온다.
    2. FrontController에서 주소에 맞는 Controller를 찾고, Controller의 process 메서드를 실행한다.
    3. Controller에서 로직을 수행한 후 view경로를 담은 MyView객체를 FrontController에게 반환한다.
    4. FrontController에서는 반환받은 MyView객체의 render메서드를 실행하여 view페이지(JSP페이지)로 요청을 전달한다.

     

     - 아직 model에 값을 저장하는 부분은 개선되지 않았다.

     - MemberFormControllerV2 경우엔 굳이 HttpServletRequest를 매개변수로 받지 않아도 된다

     - return new MyView("/WEB-INF/views/~~~"); 논리적인 경로가 중복된다.

     - MemberSaveControllerV2 경우 request객체가 있어야만 member객체를 저장할 수 있다. (서블릿에 종속적이다)

     

     

    ModelView 도입

    request 대신 model에 값을 저장하면서 바뀐 점

     - Map<String, String> paramMap을 통해 request의 모든 값을 paramMap에 저장해서 사용한다.

     - ModelView객체를 생성하고, request.setAttribute처럼 값이 저장될 수 있게 Map<string, object=""> model로 저장공간을 생성했다.

     - viewResolver메서드를 통해 고정된경로("/WEB-INF/views/")와 핵심경로("new-form", "save-result", "members")를 조합하고 MyView 객체를 생성한다.

     

    처리과정

    1. 클라이언트 브라우저 주소창을 통해 요청이 FrontController로 들어온다.
    2. FrontController에서 주소에 맞는 Controller를 찾고 paramMap에 request의 모든 내용을 저장한다.
    3. FrontController에서 Controller에 paramMap을 전달하며 process메서드를 실행한다.
    4. 각 Controller에서 로직을 수행한 후 핵심경로를 담은 ModelView객체를 생성한다.
    5. 각 Controller에서 request.setAttribute("member", member) 수행이 필요하다면 mv.getModel().put("member", member)을 통해서 ModelView객체에 저장한다.
    6. FrontController는 반환받은 ModelView객체를 viewResolver메서드를 통해 경로를 조합하고
    7. MyView객체를 생성한 후 render메서드를 실행하여 조합한 경로로 request와 response객체를 전달하며 페이지를 이동한다.

     

     - 좋긴한데.. 사용하기 조금 복잡하다

     - 굳이 ModelView 객체를 생성해서 model에 담을 필요가있나??? 

     

     

    ModelView를 파라미터로 처리하기

    ModelView삭제하고 매개변수에 Map<String, Object> model을 추가하면서 바뀐 점

     - ControllerV4의 타입이 String으로 되었다. String으로 받을 값은 viewName이다.("new-form", "save-result", "members")

     - FrontController에서 Map<String, Object> model을 생성하여 각 Controller에게 파라미터로 전달해준다(request객체의 매개변수를 paramMap으로 전달하는 것처럼!!)

     

    처리과정

    1. 클라이언트 브라우저 주소창을 통해 요청이 FrontController로 들어온다.
    2. FrontController에서 주소에 맞는 Controller를 찾고 paramMap에 request의 모든 내용을 저장한다.
    3. FrontController에서 request의 setAttribute처럼 Map<String, Object> model을 생성한다.
    4. FrontController에서 Controller에 paramMap과 model을 전달하며 process메서드를 실행한다.
    5. 각 Controller에서 로직을 수행한 후 핵심경로를 String으로 반환한다
    6. FrontController는 반환받은 viewName을 viewResolver메서드를 통해 경로를 조합하고
    7. MyView객체를 생성한 후 render메서드를 실행하여 조합한 경로로 model, request, response객체를 전달하며 페이지를 이동한다.

     

     - 만약 ModelView와 Map<String, Obejct> model을 혼용해서 사용하고싶을 땐 어떡하지??

     - 지금까지는 한가지 방식의 컨트롤러 인터페이스만 사용할 수 있었다. (ControllerV3, ControllerV4.. 중 한가지만 사용했음)

     

    Adapter와 Handler 도입

    어댑터는 다른 전기나 기계 장치를 서로 연결해서 작동할 수 있도록 만들어 주는 결합 도구다.

    ControllerV3를 5핀단자라고하면 ControllerV4는 C타입단자인 것이다.

    이때 중간에 Adapter를 사용하면 5핀을 C타입처럼 사용할 수 있게된다.

     

    이제 각각의 컨트롤러의 의미를 넓혀서 핸들러라고 부를 것이다.

    중간에 어댑터가 껴있기때문에 컨트롤러가 아니더라도 처리할 수 있기때문이다. 

     

    Adapter와 Handler 추가하면서 바뀐 점

     - 기존엔 FrontController에서 request대신 사용할 paramMap과 model을 생성, 

        각각의 Controller의 process메서드 실행, ModelView 객체 생성하는 부분을 이제 Adapter에서 수행한다

     - FrontController에서는 handler(각각의 Controller)를 찾고, adapter에게 handler를 전달하여 Model을 반환받고,

        MyView를 생성하여 페이지를 이동시킨다.

     

    처리과정

    (사진의 빨간글씨 참고)

    1. 만약 클라이언트 브라우저 주소창에 /v5/v4/save가 입력되면 FrontController에서 주소에 맞는 handler(MemberSaveControllerV4)를 찾고
    2. FrontController에서 handler(MemberSaveControllerV4)에 해당되는 adapter(ControllerV4HandlerAdapter)를 찾는다
    3. FrontController에서 adapter(ControllerV4HandlerAdapter)의 handle메서드를 실행하고
    4. ControllerV4HandlerAdapter에서 handler(MemberSaveControllerV4)가 ControllerV4의 인스턴스인지 확인한다
    5. ControllerV4HandlerAdapter에서 request대신 사용할 paramMap과 model생성 후
    6. ControllerV4HandlerAdapter에서 MemberSaveControllerV4의 process메서드 실행 후 view경로 받아온다
    7. ControllerV4HandlerAdapter에서 viewName으로 ModelView객체 생성하고, ModelView객체에 model저장
    8. ControllerV4HandlerAdapter에서 FrontController로 ModelView객체 반환
    9. FrontController에서 반환받은 ModelView객체의 viewName으로 viewResolver메서드 실행
    10. FrontController에서 viewResolver로 고정경로와 viewName조합하여 MyView객체 반환
    11. FrontController에서 MyView객체의 render실행하여 페이지 이동

     

     

     

    반응형
    • 네이버 블러그 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 구글 플러스 공유하기
    • 카카오톡 공유하기