본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : Controller에서 View 이동 시 중복되는 부분 리펙터링하기

by 오주현 2022. 1. 22.
반응형

컨트롤러에서 뷰로 이동하는 부분에 중복이 있어 깔끔하지 않다.

String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);

계속 dispatcher 부분을 중복해서 적어주고 있는데 이런 부분을 깔끔하게 리펙터링하기 위해서는 별도로 뷰를 처리하는 객체를 만들어 줘야한다.

이렇게 되면 클라이언트가 HTTP 요청을 했을 때 Front Controller가 매핑 정보를 확인해서 알맞는 Controller를 호출해 주고 Controller는 뷰를 처리하는 객체를 반환해 준다. 다시 Front Controller가 뷰를 처리하는 객체 안에 있는 render()를 호출해서 JSP forward로 넘겨 HTML 응답을 하게 된다.

뷰를 처리하는 MyView 클래스를 만들어 봤다.

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);
    }

안에 MyView에 String 값을 갖는 파라미터가 있는 생성자를 만들어주고 아래 중복되는 dispatcher를 넣어주었다.

이번에는 컨트롤러 인터페이스를 만들어 본다.

public interface ControllerV2 {
    MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

기존에는 void 형식을 사용했는데 이번에는 MyView를 사용해서 MyView를 반환하게 한다.

public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return new MyView("/WEB-INF/views/new-form.jsp");

다른 컨트롤러에 있는 중복되고 복잡했던 dispatcher.forward()를 직접 생성해서 호출하지 않아도 단순하게 MyView 객체를 생성한 뒤 뷰 이름만 넣고 반환하면 되기 떄문에 코드가 훨씬 간결해 졌다.

다른 컨트롤러 부분도 중복을 이렇게 처리하여 코드를 간결하게 만들어준다.

프론트 컨트롤러를 봐보면

@Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String requestURI = request.getRequestURI();

        ControllerV2 controller = controllerMap.get(requestURI);

        if (controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        MyView view = controller.process(request, response);
        view.render(request, response);
    }

전과 코드가 거의 비슷하다. 다만 컨트롤러v2의 반환 타입이 MyView이기떄문에 프론트 컨트롤러는 컨트롤러의 호출 결과를 MyView를 반환 받는다. 그리고 view.render()를 호출해 forward 로직을 수행해서 JSP가 실행되게 된다.


스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다.

반응형

댓글