스프링 MVC 1편 (백엔드 웹 개발 핵심 기술)

Ch04. MVC 프레임워크 만들기 - 단순하고 실용적인 컨트롤러(v4)

webmaster 2022. 3. 4. 13:52
728x90
  • 앞서 만든 v3 컨트롤러는 서블릿 종속성을 제거하고 뷰 경로의 중복을 제거하는 등, 잘 설계된 컨트롤러이다.
  • 그런데 실제 컨트 톨러 인터페이스를 구현하는 개발자 입장에서 보면, 항상 ModelView 객체를 생성하고 반환해야 하는 부분이 조금은 번거롭다.
  • 좋은 프레임워크는 아키텍처도 중요하지만, 그와 더불어 실제 개발하는 개발자가 단순하고 편리하게 사용할 수 있어야 한다. 소위 실용성이 있어야 한다.

v4 구조

interface 작성

각 Controller들이 구현해야 하는 인터페이스 작성

  • Model을 파라미터로 입력받아 model을 채워준다.
  • ViewName(논리적 이름)만 반환하도록 인터페이스를 작성
  • 복잡하게 ModelView 클레스를 만들지 않고 사용이 가능하다

Controller 작성

MemberFormController
MemberFormController
MemberListController

  • 클라이 언트 입장(Controller) 에서는 쉽게 사용이 가능하다
    • JSP에 반환할 객체는 model에 값을 넣고, view이름만 반환하면 된다.

 

 

FrontControllerV4 작성

@WebServlet(name = "frontControllerServletV4", urlPatterns = "/front-controller/v4/*")
public class FrontControllerServletV4 extends HttpServlet {
    private Map<String, ControllerV4> controllerMap = new HashMap<>();

    public FrontControllerServletV4() {
        controllerMap.put("/front-controller/v4/members/new-form", new MemberFormControllerV4());
        controllerMap.put("/front-controller/v4/members/save", new MemberSaveControllerV4());
        controllerMap.put("/front-controller/v4/members", new MemberListControllerV4());
    }

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

        String requestURI = request.getRequestURI();
        ControllerV4 controller = controllerMap.get(requestURI);

        if(controller == null){
            response.setStatus(SC_NOT_FOUND);
            return;
        }

        //메소드로 뽑는게 좋다
        Map<String, String> paramMap = createParamMap(request);
        Map<String, Object> model = new HashMap<>();

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

        MyView view = viewResolver(viewName);
        view.render(model, request, response);
    }

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

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

FrontControllerV4

  • 모델 객체 전달
    • Map model = new HashMap<>(); //추가
    • 모델 객체를 프론트 컨트롤러에서 생성해서 넘겨준다. 컨트롤러에서 모델 객체에 값을 담으면 여기에 그대로 담겨있게 된다
  • 뷰의 논리 이름을 직접 반환
String viewName = controller.process(paramMap, model);
MyView view = viewResolver(viewName);
view.render(model, request, response);
728x90