프론트 컨트롤러 도입 전
프론트 컨트롤러 도입 후
FrontController 패턴 특징
- 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
- 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
- 입구를 하나로
- 공통 처리 가능
- 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨
프론트 컨트롤러 도입 - v1
프론트 컨트롤러를 단계적으로 도입해보자.
이번 목표는 기존 코드를 최대한 유지하면서, 프론트 컨트롤러를 도입하는 것이다.
먼저 구조를 맞추어두고 점진적으로 리펙터링 해보자.
ControllerV1 (interface)
서블릿과 비슷한 모양의 컨트롤러 인터페이스를 도입한다. 각 컨트롤러들은 이 인터페이스를 구현하면 된다. 프론트 컨트롤러는 이 인터페이스를 호출해서 구현과 관계없이 로직의 일관성을 가져갈 수 있다.
이제 이 인터페이스를 구현한 컨트롤러를 만들어보자.
지금 단계에서는 기존 로직을 최대한 유지하는게 핵심이다.
MemberFormControllerV1 - 회원 등록 컨트롤러
MemberSaveControllerV1 - 회원 저장 컨트롤러
MemberListControllerV1 - 회원 목록 컨트롤러
내부 로직은 기존 서블릿과 거의 같다.
FrontControllerServletV1 - 프론트 컨트롤러
프론트 컨트롤러 분석
urlPatterns
- urlPatterns = "/front-controller/v1/*" : /front-controller/v1 를 포함한 하위 모든 요청은 이 서블릿에서 받아들인다.
- 예) /front-controller/v1 , /front-controller/v1/a , /front-controller/v1/a/b
service()
먼저 requestURI 를 조회해서 실제 호출할 컨트롤러를 controllerMap 에서 찾는다. 만약 없다면 404(SC_NOT_FOUND) 상태 코드를 반환한다.
컨트롤러를 찾고 controller.process(request, response); 을 호출해서 해당 컨트롤러를 실행한다.
JSP
JSP는 이전 MVC에서 사용했던 것을 그대로 사용한다.
View 분리 - v2
모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다.
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만들자.
MyView
뷰 객체는 이후 다른 버전에서도 함께 사용하므로 패키지 위치를 frontcontroller 에 두었다.
다음 버전의 컨트롤러 인터페이스를 만든다. 컨트롤러가 뷰를 반환하는 특징이 있다.
ControllerV2 (interface) - MyView를 반환
MemberFormControllerV2 - 회원 등록 폼
이제 각 컨트롤러는 복잡한 dispatcher.forward() 를 직접 생성해서 호출하지 않아도 된다. 단순히 MyView 객체를 생성하고 거기에 뷰 이름만 넣고 반환하면 된다.
MemberSaveControllerV2 - 회원 저장
MemberListControllerV2 - 회원 목록
FrontControllerServletV2 - 프론트 컨트롤러
ControllerV2의 반환 타입이 MyView 이므로 프론트 컨트롤러는 컨트롤러의 호출 결과로 MyView 를 반환 받는다.
그리고 view.render() 를 호출하면 forward 로직을 수행해서 JSP가 실행된다.
MyView.render()
프론트 컨트롤러의 도입으로 MyView 객체의 render() 를 호출하는 부분을 모두 일관되게 처리할 수 있다.
각각의 컨트롤러는 MyView 객체를 생성만 해서 반환하면 된다.
인프런 김영한님의 스프링 MVC 1편을 듣고 작성한 글입니다.
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -
www.inflearn.com
'Spring' 카테고리의 다른 글
유연한 컨트롤러1 v5, 유연한 컨트롤러2 v5 (0) | 2022.04.05 |
---|---|
Model 추가 - v3, 단순하고 실용적인 v4 (0) | 2022.04.04 |
MVC 패턴의 장점과 단점, 한계 (0) | 2022.04.02 |
서블릿, JSP 으로 회원관리 웹 만들기 (0) | 2022.04.01 |
HTTP 요청 데이터와 응답 데이터 (0) | 2022.03.31 |
댓글