[6] 스프링 MVC (4) - 프론트 컨트롤러(FrontController) 패턴 -V1 / V2 / V3
개요
MVC패턴
에서 발생되는 많은 중복
을 개선
하기 위해 프론트 컨트롤러(FrontController) 패턴 도입
공통된 부분을 처리
해주는 FrontController
로 중복을 줄일 수 있음
점진적으로 개선
V1
: 프론트 컨트롤러(FrontController) 패턴 도입
V2
: view render를 처리
해주는 MyView 도입
V3
: 서블릿(Servlet) 종속성 제거
/ 뷰 리졸버(View Resolver) 도입으로 논리 뷰 이름 사용
V4
: V3 코드
에서 반환타입
을 논리 주소명으로 변경
V5
: 어댑터(Adapter) 패턴 도입
으로 다양한 종류의 컨트롤러 처리
V5까지 점진적으로 개선시킨 구조
는 실제 스프링 MVC의 핵심 구조와 동일
V1
[ 구조 ]
[ 코드 ]
( FrontControllerServletV1 )
urlPatterns = "/front-controller/v1/*"
: /front-controller/v1
으로 시작
하는 모든 url path를 처리
Map<String, ControllerV1> ControllerMap = new HashMap<>()
: url path
에 해당되는 컨트롤러를 매핑
해주는 HashMap
생성
HttpServletResponse.SC_NOT_FOUND
: 404 statusCode
를 의미
- 로직
url 파싱
해당되는 controller 찾기
(없으면 종료)
컨트롤러
의 비즈니스 로직 수행
( ControllerV1 - Interface )
여러 Controller
가 비즈니스 로직을 수행
하는 process 추상 메소드
를 가진 인터페이스
회원가입 viewPath 생성
후, 해당 form으로 dispath
( MemberSaveControllerV1 )
HttpServletRequest 객체에 담긴 내용
으로 member 생성 뒤 저장
viewPath 생성 후 dispath
( MemberListControllerV1 )
모든 member를 조회
한 뒤 Model 역할
을 하는 HttpServletRequest에 저장
viewPath 생성 후 dispatch
V2
[ 구조 ]
V1의 코드
에서 화면 전환을 위한 dispatch과정
을 MyView 객체로 처리
해서 중복을 제거
하는 모델
[ 코드 ]
( FrontControllerServletV2 )
( MyView )
HttpServletRequest
/ HttpServletResponse
객체를 받아서 dispatch
를 해주는 객체
( ControllerV2 - Interface )
( MemberSaveControllerV2 )
( MemberListControllerV2 )
V3
[ 구조 ]
- 지금까지
컨트롤러
에서는 HttpServletRequest / HttpServletResponse를 사용하지 않아도 매개변수로 받음
--> 불필요
& Servlet에 종속적
HttpServletRequest
를 Model로 사용
했음
--> Model을 별도로 생성
해서 Servlet의 종속성을 제거
(추가로 View 이름을 받는 역할
도 할 예정)
V3의 개선 사항
(정리)
Servlet 종속성 제거
--> Model 추가
view path 중복 제거
--> View Resolver 추가
[ 코드 ]
( FrontControllerServletV3 )
Map<String, String> paramMap
: HttpServletRequest
에 있는 데이터를 편하게 사용
하기 위한 HashMap
createParamMap
: HttpServletRequest에 있는 모든 데이터
를 순회
하면서 HashMap을 생성
하는 메서드
viewResolver
: viewName라는 논리 주소
를 받은 뒤 실제 주소가 있는 물리 주소를 가지는 MyView를 반환
하는 메서드
논리 뷰 이름
: members
물리 뷰 경로
: /WEB-INF/views/member.jsp
--> url path의 중복을 제거
함 & 논리 주소로만 소통 가능
MyView
에 (model, HttpServletRequest, HttpServletResponse)
를 가지는 생성자 추가
( ModelView )
Servlet의 종속성을 제거하기 위해 별도로 추가한 Model
view에 가져가야 할 데이터
가 담겨있는 model
이라는 HashMap
/ 실제 물리 주소인 viewName
을 가짐
( ControllerV3 - Interface )
모든 Controller(컨트롤러)
는 ModelView를 반환
해야 한다
( MemberSaveControllerV3 )
가야할 논리 주소
를 매개변수
로 ModelView 객체
를 생성
ModelView 객체
에 view에 넘길 데이터를 ModelView.model에 추가
한뒤 return!
( MemberListControllerV3 )