[Spring MVC] MVC Framework V1
FrontController 패턴 소개
FrontController 도입 후
- 도입전에는 클라이언트가 필요한 Controller를 일일이 호출해서 공통 처리가 되지 않았다.
- 도입 후 모든 요청은 Front Controller 한 곳으로 모이고, Front Controller가 공통 처리를 한 뒤에 필요한 클라이언트를 각각 호출해준다.
FrontController 패턴 특징
- Front Controller 서블릿 하나로 클라이언트의 요청을 받음
- Front Controller가 요청에 맞는 컨트롤러를 찾아서 호출
- 공통 처리 가능
- Front Controller를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다.
스프링 웹 MVC와 FrontController
- 스프링 웹 MVC의 핵심도 FrontController이다.
- 스프링 웹 MVC의 DispatcherServlet이 FrontController 패턴으로 구현되어 있다.
FrontController 도입 - V1
V1 구조
ControllerV1
public interface ControllerV1 {
void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
각 컨트롤러들이 인터페이스를 구현함으로써 로직이 일관성을 가진다.
MemberFormControllerV1
@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);
}
MemberSaveController
@Override
public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
request.setAttribute("member", member);
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
request.getParameter()
메서드를 통해 파라미터로 넘어온 값을 저장.
FrontControllerServletV1
@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {
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());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String requestURI = request.getRequestURI();
ControllerV1 controller = controllerMap.get(requestURI);
if (controller == null) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
controller.process(request, response);
}
}
urlPatterns
urlPatterns = "/front-controller/v1/*"
:/front-controller/v1
을 포함한 하위 모든 요청은 이 서블릿이 받아들인다.
controllerMap
- key: 매핑 URL
- value: 호출될 컨트롤러
댓글남기기