MVC 프레임워크 만들기 - v1, v2

황준하·2023년 8월 30일

SpringMVC

목록 보기
9/19
post-thumbnail

프론트 컨트롤러 패턴

"프론트 컨트롤러 패턴 특징"

  • 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
  • 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
  • 입구를 하나로
  • 공통 처리 가능
  • 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨

스프링 웹 MVC와 프론트 컨트롤러
스프링 웹 MVC의 핵심도 바로 "FrontController"
스프링 웹 MVC의 "DispatcherServlet"이 FrontController 패턴으로 구현되어 있음

프론트 컨트롤러 도입 - v1

이번 목표는 기존 코드를 최대한 유지하면서, 프론트 컨트롤러를 도입하는 것이다.
https://github.com/lay423/servlet/commit/6845740b808e5be5f70d0c6c9a0b1cb925f01a91

package hello.servlet.web.frontcontroller.v1;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.rmi.server.ServerCloneException;

public interface ControllerV1 {

    void process(HttpServletRequest request, HttpServletResponse response) throws ServerCloneException, IOException;
}

서블릿과 비슷한 모양의 컨트롤러 인터페이스를 도입한다. 각 컨트롤러들은 이 인터페이스를 구현하면 된다.

회원등록 컨트롤러
회원저장 컨트롤러
회원목록 컨트롤러

내부 로직은 기존 서블릿과 거의 같다.
이제 프론트 컨트롤러를 만들어보자.

FrontControllerV1
=> 기존 서블릿, JSP로 만든 MVC와 동일하게 실행 되는 것을 확인할 수 있다.

View 분리 - v2

모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다.
이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만들자.

https://github.com/lay423/servlet/commit/21e57364bb21da2719ec5fc6a14acf12914dbb61

프론트 컨트롤러의 도입으로 MyView 객체의 render()를 호출하는 부분을 모두 일관되게 처리할 수 있다. 각각의 컨트롤러는 MyView객체를 생성만 해서 반환하면 된다.

0개의 댓글