StudyRepository
article thumbnail
Published 2023. 5. 29. 19:05
View 분리 Spring
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
profile

StudyRepository

@Minseo26262

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!