MVC(Model-View-Controller) Pattern
- 어플리케이션의 확장을 위해 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 클래스들과 협업하여 알맞은 작업을 처리