[Spring MVC] MVC Framework V4
단순하고 실용적인 컨트롤러 - V4
V3에서 항상 ModelView객체를 생성하고 반환해야 하는 부분을 수정한 Version.
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의 논리 이름을 반환하는 방식으로 변경함으로써 기존 구조보다 사용하기 편해졌다.
댓글남기기