공통의 관심사. 프론트 컨트롤러를 앞에 두고 각각 알아서 찾아가세요~ 라고 호출
프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
스프링 웹 MVC와 프론트 컨트롤러
- 스프링 웹 MVC의 핵심도 바로 FrontController
- 스프링 웹 MVC의 DispatcherServlet이 FrontController패턴으로 구현되어 있음.
ControllerMap -> Controller 경로 찾아줄거야 ~ !
(v2에서 개선)
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다.
-> MyView 로 개선
뷰 이름 중복 제거
/WEB-INF/views/new-form.jsp -> new-form
/WEB-INF/views/save-result.jsp -> save-result
/WEB-INF/views/members.jsp -> members
컨트롤러는 뷰의 논리 이름을 반환하고, 실제 물리 위치의 이름은 프론트 컨트롤러에서 처리하도록 단순화 하자.
이렇게 해두면 향후 뷰의 폴더 위치가 함께 이동해도 프론트 컨트롤러만 고치면 됨.
viewResolver : 실제 view를 찾아주는 기능
기존 구조에서 모델을 파라미터로 넘기고,
뷰의 논리 이름을 반환한다.
두 개가 뭔가 안 맞을 때 중간에 무언가를 껴서 맞추는 걸 어댑터 패턴 이라고 한다.
ModelView mv = new ModelView(viewName);
mv.setModel(model);
return mv;
--> 어댑터 변환
어댑터가 호출하는 ControllerV4 는 뷰의 이름을 반환.
그런데 어댑터는 뷰의 이름이 아니라 ModelView 를 만들어서 반환해야 한다.
그래서 어댑터가 필요!
ControllerV4는 뷰의 이름을 반환했지만, 어댑터는 이것을 ModelView로 만들어서 형식을 맞추어 반환한다.
마치 110v 전기 콘센트를 220v 전기 콘센트로 변경하듯이
이 모든건 Spring 에 구현되어 있다.