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

interface 작성

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



- 클라이 언트 입장(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
'스프링 MVC 1편 (백엔드 웹 개발 핵심 기술)' 카테고리의 다른 글
| Ch05. 스프링 MVC(구조 이해) - 스프링 MVC 전체 구조 (0) | 2022.03.05 |
|---|---|
| Ch04. MVC 프레임워크 만들기 - 유연한 컨트롤러 (v5) (0) | 2022.03.04 |
| Ch04. MVC 프레임워크 만들기 - Model 추가(v3) (0) | 2022.03.04 |
| Ch04. MVC 프레임워크 만들기 - View 분리(v2) (0) | 2022.03.04 |
| Ch04. MVC 프레임워크 만들기 - 프론트 컨트롤러 도입(v1) (0) | 2022.03.04 |