어플리케이션의 확장을 위해 Model, View, Controller 세가지 영역으로 분리
컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치지 않는다.(유지보수성)
컴포턴트 간의 결합성이 낮아 프로그램 수정이 용이(확장성)
Model
어플리케이션 상태의 캡슐화
상태 쿼리에 대한 응답
어플리케이션의 기능 표현
변경을 View에 통지
View
모델을 화면에 시각적으로 표현
모델에게 업데이트 요청
사용자의 입력을 Controller에 전달
Controller가 View를 선택하도록 허용
Controller
어플리케이션의 행위를 정의
사용자 액션을 모델 업데이트와 매핑
응답에 대한 View 선택
Spring MVC 구성요소
DispatcherServlet(Front Controller)
모든 클라이언트의 요청을 전달받음
Controller에게 클라이언트의 요청을 전달하고, Controller가 리턴한 결과값을 View에게 전달하여 알맞는 응답 생성
HandlerMapping
클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정
URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며, DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있음
Controller
클라이언트의 요청을 처리한 뒤, Model을 호출하고 그 결과를 DispatcherServlet에 알려준다.
ModelAndView
Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
ViewResolver
Controller가 리턴한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정
View
Controller의 처리결과를 보여줄 응답화면을 생성
Spring MVC 요청 흐름도
Spring MVC 구현
web.xml에 DispatcherServlet 등록 및 Spring 설정파일 등록하기
설정파일에 HandlerMapping 설정
Controller 구현 및 Context 설정 파일을 servlet-context.xml에 등록
Controller와 JSP의 연결을 위해 View Resolver 설정
JSP 코드 작성
Spring Web Application의 동작 원리
웹 어플리케이션이 실행되면 WAS에 의해 web.xml이 로딩
web.xml에 등록되어 있는 ContextLoaderListener(Java Class)가 생성. ContextLoaderListener Class는 ServletContextListener interface를 구현하고 있으며, ApplicationContext를 생성하는 역할 수행
생성된 ContextLoaderListener는 root-context.xml을 로딩
root-context.xml에 등록되어있는 Spring Container가 구동. 이 때 비즈니스로직(Service)에 대한 부분과 DAO, VO 객체들이 생성된다.
Client로 부터 Request가 들어옴
DispatcherServlet이 생성. DispatcherServlet은 FrontController의 역할 수행.
Client로부터 요청 온 메시지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할지 결정. 실질적인 작업은 PageController에서 이루어짐
DispatcherServlet은 servlet-context.xml을 로딩
두번째 Spring container가 구동되며 응답에 맞는 PageController들이 동작. 이 때 첫번째 Spring Container가 구동되면서 생성된 DAO, VO, Service 클래스들과 협업하여 알맞은 작업을 처리