view 분리

학습 페이지

뷰를 분리하는 작업을 할 것이다. 지금까지 프로젝트에선 모든 컨트롤러에 뷰로 이동하는 부분에 여전히 중복이 있고, 깔끔하지도 않다.

Untitled

이 공통부분도 이것만을 처리하는 객체를 만들면 해결할 수 있다.

Untitled

이제 컨트롤러는 뷰로 직접 포워드 하지 않을 것임. 컨트롤러는 myview라는걸 반환만하고, 이걸 프론트 컨트롤러가 해결할 것이다.

컨트롤러에서 포워딩하는 부분만 모은 MyView객체를 만들어주자.

package hello.servlet.web.frontcontroller;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import javax.sql.rowset.serial.SerialException;
import java.io.IOException;

public class MyView { //기존의 포워딩 로직만 하나로 모았다.
    private String viewPath;
    public MyView(String viewPath) {
        this.viewPath = viewPath;
    }

    public void render(HttpServletRequest request, HttpServletResponse response) throws  IOException, ServletException {
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
        dispatcher.forward(request, response);
    }

}

버전2의 컨트롤러 인터페이스는 버전 1과 딱 하나만 달라졌다. 반환값이 MyView이다.

package hello.servlet.web.frontcontroller.v2;

import hello.servlet.web.frontcontroller.MyView;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public interface ControllerV2 {

    MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

    

}

이제 구현체 컨트롤러를 하나씩 만들어보자.

package hello.servlet.web.frontcontroller.v2.controller;

import hello.servlet.web.frontcontroller.MyView;
import hello.servlet.web.frontcontroller.v2.ControllerV2;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class MemberFormControllerV2 implements ControllerV2 {

    @Override
    public MyView process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        return new MyView("/WEB-INF/views/new-form.jsp");
    }

}

아주 간단해졌다… 경로만 들어가면 된다.. 폼띄워주는 뷰만 연결시키는 역할하니까…

나머지도 이런식으로 리팩토링 하자.