1 분 소요


단순하고 실용적인 컨트롤러 - V4

V3에서 항상 ModelView객체를 생성하고 반환해야 하는 부분을 수정한 Version.

V4 구조
v4

  • 기본적인 구조는 V3와 같지만 컨트롤러가 ModelView를 반환하지 않고, ViewName만 반환한다.

ControllerV4

public interface ControllerV4 {
 /**
 * @return viewName
 */
    String process(Map<String, String> paramMap, Map<String, Object> model);
}

V3와 달리 model을 FrontController에서 만들어서 넘겨주기 때문에 결과로 ModelView가 아닌 View의 이름만 String 타입으로 반환해주면 된다.

MemberFormControllerV4

@Override
public String process(Map<String, String> paramMap, Map<String, Object> model) {
    return "new-form";
}

단순하게 new-form이라는 view의 논리 이름만 반환해준다.

MemberSaveControllerV4

@Override
public String process(Map<String, String> paramMap, Map<String, Object> model) {

    String username = paramMap.get("username");
    int age = Integer.parseInt(paramMap.get("age"));

    Member member = new Member(username, age);
    memberRepository.save(member);

    model.put("member", member);
    return "save-result";
}

model이 파라미터로 전달되기 때문에, 모델을 직접 생성하지 않아도 된다.

FrontControllerServletV4

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

        // --- void service()
        // getRequestURI() 부분 생략

        Map<String, String> paramMap = createParamMap(request);
        Map<String, Object> model = new HashMap<>(); // V4 추가 코드

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

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

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

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

FrontControllerServletV4는 V3와 거의 비슷하다.

Model 객체 전달
Map<String, Object> model = new HashMap<>();
Model 객체를 FrontController에서 생성해서 넘겨줬다. Model 객체에 값을 담으면 여기에 그대로 담기게 된다.
String viewName = controller.process(paramMap, model);


정리

기본 구조(V3)에서 Model을 파라미터로 넘기고, View의 논리 이름을 반환하는 방식으로 변경함으로써 기존 구조보다 사용하기 편해졌다.


<출처 : 인프런 - 스프링 MVC 1편 : 백엔드 웹 개발 핵심 기술(김영한)>

댓글남기기