https://www.inflearn.com/roadmaps/373
🐳 V4
V3는 서블릿 종속성을, 뷰의 중복을 제거하는 등 설계가 잘 된 컨트롤러.
하지만 실제 컨트롤러 인터페이스를 구현하는 개발자 입장에서 본다면,
항상ModelView
객체를 생성+반환 하는 부분이 조금 번거롭다.구조를 살펴보면, V3와 크게 다를 것은 없다.
하지만 ModelView가 아닌 단순하게 ViewName만을 반환하게 된다.
ConV4.interface
String process(Map<String, String> paramMap, Map<String, Object> model);
model 객체는 파라미터로 전달되기 때문에 그냥 사용하고, 결과로는 뷰의 이름만을 반환해준다.
FormV4
@Override
public String process(Map<String, String> paramMap, Map<String,Object> model){
return "new-form";
}
단순하게 new-form
이라는 뷰의 논리 이름만 반환하면 된다.
ListV4
@Override
public String process(Map<String, String> paramMap, Map<String, Object> model){
List<Member> members = memberRepository.findAll();
model.put("members", members);
return "members";
V3와 달리 model이 파라미터로 전달되기 때문에, V3처럼 ModelView를 생성해서 처리하지 않아도 되고,
나 같은 경우는 복잡성?이 조금 제거된 것 같아서 코드도 조금 깔끔해졌다고 생각한다.
FrontConV4 [FrontConV3와 달라진 부분을 보자.]
private Map<String, ConV4> controllerMap = new HashMap<>();
public FrontConV4(){
controllerMap.put("/front/v4/member/new-form", new FormV4());
}
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException{
String requestURI=req.getRequestURI();
ConV4 controller = controllerMap.get(requestURI);
if(controller==null){
...
}
Map<String, String> paramMap = createParamMap(req);
추가 --> Map<String, Object> model = new HashMap<>();
ModelView mv = controller.process(paramMap);
변경--> String viewName = controller.process(paramMap, model);
String viewName = mv.getViewName();
--> 제거
MyView view = viewResolver(viewName);
view.render(mv.getModel(), req, res);
변경 --> view.render(model, req, res);
➽ V4 정리
V3와 크게 달라진 점은 없다고 생각한다. 하지만 코드를 보면 조금 더 직관적이라는 생각이 든다.
어떻게 보면 바꾼 부분은 model을 파라미터로 넘기고, 뷰의 논리이름을 반환하는 작업만을 적용했다.
➽ V5 같은 경우는 Spring Mvc와 구조와 비슷하기 때문에 v5는 따로 정리하지 않고, 바로 Spring Mvc구조를 포스팅할 예정이다.