[6] 스프링 MVC (4) - 프론트 컨트롤러(FrontController) 패턴 -V1 / V2 / V3
![post-thumbnail](https://velog.velcdn.com/images/neity16/post/6ea75294-c34e-4b65-8b04-cd085ab1f5e3/springMVC.jpg)
개요
MVC패턴
에서 발생되는 많은 중복
을 개선
하기 위해 프론트 컨트롤러(FrontController) 패턴 도입
공통된 부분을 처리
해주는 FrontController
로 중복을 줄일 수 있음
점진적으로 개선
V1
: 프론트 컨트롤러(FrontController) 패턴 도입
V2
: view render를 처리
해주는 MyView 도입
V3
: 서블릿(Servlet) 종속성 제거
/ 뷰 리졸버(View Resolver) 도입으로 논리 뷰 이름 사용
V4
: V3 코드
에서 반환타입
을 논리 주소명으로 변경
V5
: 어댑터(Adapter) 패턴 도입
으로 다양한 종류의 컨트롤러 처리
V5까지 점진적으로 개선시킨 구조
는 실제 스프링 MVC의 핵심 구조와 동일
V1
[ 구조 ]
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F8a76c5ee-d9d5-4b0d-a8a4-134c5a4361e6%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.20.14.png)
[ 코드 ]
( FrontControllerServletV1 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F81c42c05-a2af-4d68-aed6-2e7d8c217536%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.32.37.png)
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 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F4f05aee5-802a-4000-8895-1a7a0992d869%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.32.42.png)
여러 Controller
가 비즈니스 로직을 수행
하는 process 추상 메소드
를 가진 인터페이스
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F8604fc93-6b43-4fa0-a820-33f43c27fd1e%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.32.49.png)
회원가입 viewPath 생성
후, 해당 form으로 dispath
( MemberSaveControllerV1 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F28de5e19-1012-4239-bd26-391b3126ebb2%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.32.56.png)
HttpServletRequest 객체에 담긴 내용
으로 member 생성 뒤 저장
viewPath 생성 후 dispath
( MemberListControllerV1 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F575ae12a-31ca-493c-9bf4-e6d1e1f135c1%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.33.03.png)
모든 member를 조회
한 뒤 Model 역할
을 하는 HttpServletRequest에 저장
viewPath 생성 후 dispatch
V2
[ 구조 ]
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F0154f4c8-1f21-43c2-9e01-b8809e993bcd%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.44.30.png)
V1의 코드
에서 화면 전환을 위한 dispatch과정
을 MyView 객체로 처리
해서 중복을 제거
하는 모델
[ 코드 ]
( FrontControllerServletV2 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F2bebe95b-c04f-4dea-94fc-6684c9da284d%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.49.11.png)
( MyView )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F7cb0eed9-7e22-45dc-a049-fe9c7fef1deb%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.54.53.png)
HttpServletRequest
/ HttpServletResponse
객체를 받아서 dispatch
를 해주는 객체
( ControllerV2 - Interface )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2Fac8cab03-4a62-4457-aa88-22aef7e9287f%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.48.29.png)
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F92ddfc11-a1e5-4901-b6c3-c0ce528f135c%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.48.37.png)
( MemberSaveControllerV2 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F6738d7a7-e437-4971-93b6-e28097855b54%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.48.45.png)
( MemberListControllerV2 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F3f71d683-1f05-4f16-a4de-e99568771d8d%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.48.53.png)
V3
[ 구조 ]
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F3e1c6be8-fe5e-40a7-86a9-13cf04ef7b9e%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%202.58.53.png)
- 지금까지
컨트롤러
에서는 HttpServletRequest / HttpServletResponse를 사용하지 않아도 매개변수로 받음
--> 불필요
& Servlet에 종속적
HttpServletRequest
를 Model로 사용
했음
--> Model을 별도로 생성
해서 Servlet의 종속성을 제거
(추가로 View 이름을 받는 역할
도 할 예정)
V3의 개선 사항
(정리)
Servlet 종속성 제거
--> Model 추가
view path 중복 제거
--> View Resolver 추가
[ 코드 ]
( FrontControllerServletV3 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F52a3f82e-b2be-4f12-a094-acd0af315cfd%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.05.24.png)
Map<String, String> paramMap
: HttpServletRequest
에 있는 데이터를 편하게 사용
하기 위한 HashMap
createParamMap
: HttpServletRequest에 있는 모든 데이터
를 순회
하면서 HashMap을 생성
하는 메서드
viewResolver
: viewName라는 논리 주소
를 받은 뒤 실제 주소가 있는 물리 주소를 가지는 MyView를 반환
하는 메서드
논리 뷰 이름
: members
물리 뷰 경로
: /WEB-INF/views/member.jsp
--> url path의 중복을 제거
함 & 논리 주소로만 소통 가능
MyView
에 (model, HttpServletRequest, HttpServletResponse)
를 가지는 생성자 추가
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F77977f62-5eeb-4fcb-b5f3-36545ddc1ddb%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.20.21.png)
( ModelView )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2Fd7568b07-29e4-4069-9e3a-db06c6e7486f%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.05.49.png)
Servlet의 종속성을 제거하기 위해 별도로 추가한 Model
view에 가져가야 할 데이터
가 담겨있는 model
이라는 HashMap
/ 실제 물리 주소인 viewName
을 가짐
( ControllerV3 - Interface )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F6ce95b10-583f-4658-858a-00fac415830f%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.05.36.png)
모든 Controller(컨트롤러)
는 ModelView를 반환
해야 한다
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2Fe7599efb-d4cd-4e67-8456-744ee4f02659%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.05.57.png)
( MemberSaveControllerV3 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F60bfdd77-4864-4865-b8e6-60c4027f0b6f%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.06.05.png)
가야할 논리 주소
를 매개변수
로 ModelView 객체
를 생성
ModelView 객체
에 view에 넘길 데이터를 ModelView.model에 추가
한뒤 return!
( MemberListControllerV3 )
![](https://velog.velcdn.com/images%2Fneity16%2Fpost%2F596339d7-7c7d-4cdf-95d5-bf40bb037248%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-04%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%203.06.11.png)