728x90
모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다.
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만들자.
http://localhost:8080/front-controller/v2/members/new-form
위의 주소가 들어오면 아래의 서블릿이 호출이 된다.
@WebServlet(name = "FrontControllerServletV2", urlPatterns = "/front-controller/v2/*")
controllerMap.put("/front-controller/v2/members/new-form", new MemberFormControllerV2());
MyView view = controller.process(request, response);
process를 호출하고,
FormControllerV2가 호출된다.
@Override
public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return new MyView("/WEB-INF/views/new-form.jsp");
}
MyView를 생성하여
"/WEB-INF/views/new-form.jsp"
이 render를 호출한다.
public class MyView {
private String viewPath;
public MyView(String viewPath){
this.viewPath = viewPath;
}
public void render(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
viewPath의 값은
"/WEB-INF/views/members.jsp"
이 값이 되고
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher에 viewPath의 값이 들어간다.
이제 각 컨트롤러는 복잡한 dispatcher.forward() 를 직접 생성해서 호출하지 않아도 된다. 단순히 MyView 객체를 생성하고 거기에 뷰 이름만 넣고 반환하면 된다.
ControllerV1 을 구현한 클래스와 ControllerV2 를 구현한 클래스를 비교해보면, 이 부분의 중복이 확실하게 제거된 것을 확인할 수 있다.
728x90
'Spring' 카테고리의 다른 글
HandlerAdapter (0) | 2023.05.30 |
---|---|
Model 추가 (0) | 2023.05.29 |
FrontController 패턴 (0) | 2023.05.29 |
MVC 패턴 (1) | 2023.05.29 |
관심사의 분리 (0) | 2023.05.09 |