
직접 만든 MVC 프레임워크와 스프링 MVC를 비교해보자 직접 만든 MVC 프레임워크 구조 SpringMVC 구조 직접 만든 프레임워크 => 스프링 MVC 비교 DispatcherServlet 구조 살펴보기 DispacherServlet 서블릿 등록 그림 요청 흐름 DispacherServlet.doDispatch() protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; ModelAndView mv = null; /..

FrontControllerServletV5 에 ControllerV4 추가 [전체 코드] @WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") public class FrontControllerServletV5 extends HttpServlet { private final Map handlerMappingMap = new HashMap(); private final List handlerAdapters = new ArrayList(); public FrontControllerServletV5() { initHandlerMappingMap(); initHandlerAdapters(); } private..

상황 만약 어떤 개발자는 Controller3 방식으로 개발하고 싶고, 어떤 개발자는 Controller4 방식으로 개발하고 싶다면 어떻게 해야 할까? 어댑터 패턴 지금까지 우리가 개발한 프론트 컨트롤러는 한가지 방식의 컨트롤러 인터페이스만 사용할 수 있다. ControllerV3 , ControllerV4 는 완전히 다른 인터페이스이다. 따라서 호환이 불가능하다. 마치 v3는110v이고, v4는 220v 전기 콘센트 같은 것이다. 이럴 때 사용하는 것이 바로 어댑터이다. 어댑터 패턴을 사용해서 프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할 수 있도록 변경해보자. V5 구조 MyHandlerAdapder public interface MyHandlerAdapter { boolean supports(O..

단순하고 실용적인 컨트롤러 V4 구조 ControllerV4 - 인터페이 public interface ControllerV4 { /** 치고 엔터치면 이 주석 나온다. * @param paramMap * @param model * @return viewName */ String process(Map paramMap, Map model); } # Map model - model에 개발자가 값 집어넣으면 됨. - 이전에는 modelView를 생성해서 그 모델을 가져다 썼는데, 이제는 컨트롤러가 모델까지 생성해서 넘겨준다. ModelFormControllerV4 public class MemberFormControllerV4 implements ControllerV4 { @Override //ModelVie..

Model 추가 서블릿 종속성 제거 뷰 이름 중복 제거 V3 구조 ModelView sevlet의 종속성을 제거 -> request가 쓸모가 없으니까. @Getter @Setter public class ModelView { private String viewName; //뷰의 논리적 이름 private Map model = new HashMap(); // 모델 직접 생성 //이렇게 모델에다가 내가 원하는 데이터를 넣어두면 나중에 꺼내서 jsp에서 쓸 수 있도록 후처리 해줄 예정 public ModelView(String viewName) { this.viewName = viewName; } } ControllerV3 - 인터페이스 public interface ControllerV3 { ModelVie..

View 분리 - v2 모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다. String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); 이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만든다. V2 구조 MyView 뷰 객체는 이후 다른 버전에서도 함께 사용하므로 패키지 위치를 frontcontroller 에 두었다. public class MyView { // 기존에 컨트롤러에서 했던 로직을 MyView 만들어서 분리해서 넣음. private Stri..

v1 구조 먼저 컨트롤러를 인터페이스로 만들어놓고, 각 컨트롤러들은 이 인터페이스를 구현한다. ControllerV1 public interface ControllerV1 { void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; } 서블릿과 모양이 똑같은 인터페이스 이것 가지고 구현을 여러 개 할 것이다. 매핑 정보에서 찾아서 호출할 때 다형성을 이용해서 프론트 컨트롤러는 인터페이스에 의존하면서 편리하게 할 수 있음. 로직은 기존 서블릿과 똑같다. 대신에 얘들은 서블릿 상속 대신에 인터페이스를 구현하고, webservlet 같은 게 전혀 없다. MemberFormC..