minOS

MVC 프레임워크 만들기 - 프론트 컨트롤러 Ver 1 본문

TIL/김영한의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

MVC 프레임워크 만들기 - 프론트 컨트롤러 Ver 1

minOE 2024. 6. 29. 14:57
728x90

프론트 컨트롤러 Ver 1

VER 1 구조 

 

서블릿과 비슷한 모양의 컨트롤러 인터페이스를 도입한다. 각 컨트롤러들은 이 인터페이스를 구현하면 된다. 프론트 컨 트롤러는 이 인터페이스를 호출해서 구현과 관계없이 로직의 일관성을 가져갈 수 있다.

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

이 인터페이스를 구현하여 컨트롤러를 만든다.


MemberFormControllerV1 -
회원 등록 컨트롤러

public class MemberFormControllerV1 implements ControllerV1 {
@Override
     public void process(HttpServletRequest request, HttpServletResponse
 response) throws ServletException, IOException {
         String viewPath = "/WEB-INF/views/new-form.jsp";
         RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
         dispatcher.forward(request, response);
} }

 참고) 기존 코드

@WebServlet(name="mvcMemberFormServlet",urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String viewPath = "/WEB-INF/views/new-form.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);//컨트롤러에서 뷰로 이동할때 사용
        dispatcher.forward(request,response); //서블릿에서 JSP 호출
    }
}


보다시피 내부 로직은 기존 서블릿과 같다.


FrontControllerServletV1 - 프론트 컨트롤러

@WebServlet(name="frontControllerServletV1",urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {
//key  == url , value = controller
    private Map<String,ControllerV1> controllerMap = new HashMap<>();

    public FrontControllerServletV1() {
        controllerMap.put("/front-controller/v1/members/new-form", new MemberFormControllerV1());
        controllerMap.put("/front-controller/v1/members/save", new MemberSaveControllerV1());
        controllerMap.put("/front-controller/v1/members", new MemberListControllerV1());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("FrontControllerServletV1.service");

        String requestURI = request.getRequestURI();
        ControllerV1 controller = controllerMap.get(requestURI);
        if (controller == null){
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        controller.process(request,response);


    }
}

key는 요청 url 이고 value는 각 url 에 해당하는 컨트롤러인 해쉬맵을 만든다.
request.getRequestURI()을 통해 url을 추출하여 해쉬맵에 키를 집어 넣으면 요청 url에 알맞는 컨트롤러가 나오는 것을 볼 수 있다.  각  컨트롤러에서 기존 로직을 수행한다.
해쉬맵에 요청 url인 key 가 없다면 404 상태 코드 반환한다.
urlPatterns = "/front-controller/v1/*" * 은 v1 하위 모든 요청을 해당 컨트롤러가 받는다는 뜻이다.
ex)/front-controller/v1/a/b , /front-controller/v1/save 등 ..

728x90