MVC Pattern
•
어플리케이션의 확장을 위해 Model, View, Controller 세가지 영역으로 분리
•
컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치지 않음(유지보수 용이)
•
컴포넌트 간의 결합성이 낮아 프로그램 수정이 용이(확장성이 뛰어남)
장점
•
화면과 비즈니스 로직을 분리해서 작업 가능
•
영역별 개발로 인하여 확장성이 뛰어남
•
표준화된 코드를 사용하므로 공동작업이 용이하고 유지보수성이 좋음
단점
•
개발과정이 복잡해 초기 개발속도가 늦음
•
초보자가 이해하고 개발하기에 다소 어려움
Model, View, Controller
Model
•
어플리케이션 상태의 캡슐화
•
상태 쿼리에 대한 응답
•
어플리케이션의 기능 표현
•
변경을 view에 통지
View
•
모델을 화면에 시각적으로 표현
•
모델에게 업데이트 요청
•
사용자의 입력을 컨트롤러에 전달
•
컨트롤러가 view를 선택하도록 허용
Controller
•
어플리케이션의 행위 정의
•
사용자 액션을 모델 업데이트와 mapping
•
응답에 대한 view 선택
Spring MVC
Spring MVC 특징
•
Spring은 DI나 AOP같은 기능 뿐만 아니라, Servlet 기반의 WEB 개발을 위한 MVC Framework 제공
•
Spring MVC는 Model2 Arichitecture와 Front Controller Pattern을 프레임워크 차원에서 제공
•
Spring MVC Framework는 Spring을 기반으로 하고 있기 때문에 Spring이 제공하는 Transaction 처리나 DI 및 AOP 등을 손쉽게 사용할 수 있음
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 요청흐름
1.
DispatcherServlet이 클라이언트 요청을 수신함
> 클라이언트가 /gb/list 라는 url을 요청하면 그것을 수신
2.
DispatcherServlet은 Handler Mapping에 어느 Controller를 사용할 것인지 물어봄
>/gb/list 를 처리하려면 어떤 컨트롤러를 써야해?
3.
HandlerMapping은 url에 맞는 컨트롤러를 찾아서 리턴해줌
>요청한 컨트롤러는 GuestBook.Controller.list() 이야
4.
DispatcherServlet은 요청을 해당 Controller로 전송함
5.
Controller는 요청을 처리한 후 ModelAndView에 담아서 결과를 리턴해줌
>기존의 request.setAttribute() 과정이 Model에 담기고,
>기존의 Page Path 지정이 View에 담김
6.
DispatcherServlet은 ModelAndView에 담긴 path를 가지고 ViewResolver에 요청함
>path가 list인데 정확히 어떤 View로 가야해?
7.
ViewResolver는 논리적 이름을 실제 JSP 이름으로 변환해줌
>/XXX/list.jsp 로 가라
8.
실제 JSP 경로를 찾아서 View(jsp)를 통해 결과정보를 사용하여 화면을 표현함
Spring MVC 구현
Spring MVC를 이용한 Application 구현 Step
•
web.xml에 DispatcherServlet 등록 및 Spring 설정파일 등록
•
설정 파일에 HandlerMapping 설정
•
Controller 구현 및 Context 설정 파일(servlet-context.xml)에 등록
•
Controller와 JSP의 연결을 위해 View Resolver 설정
•
JSP 코드 작성
web.xml - DispatcherServlet 설정
•
경로 : src > main > webapp > WEB-INF > web.xml
•
Spring Container는 설정파일의 내용을 읽고 ApplicationContext 객체를 생성
•
<load-on-startup>1</load-on-startup>설정 시 WAS startup시 초기화 작업진행
<listener>
•
최상위 Root ContextLoader 설정
•
Context 설정 파일들을 로드하기 위해 web.xml 파일에 리스너 설정(ContextLoaderListener)
•
리스너 설정이 되면 /WEB-INF/spring/roo-context.xml 파일을 읽어서 공통적으로 사용되는 최상위 Context를 생성
•
그 외 다른 컨텍스트 파일을들 최상위 컨텍스트에 로드하기 위해서는 classpath 지정
<init-param>
•
applicationContext(DispatcherServlet)의 정보를 설정해둔 파일
•
Spring 적용 이전의 ApplicationContext.xml과 같은역할
•
<init-param>을 설정하지 않으면 "<servlet-name>-servlet.xml" file에서 applicationContext의 정보를 load함
<url-pattern>
•
DispatcherServlet이 처리하는 URL Mapping pattern을 정의
◦
초기값은 /로 되어있음 → /로 시작하는 모든 URL을 D.S이 처리함
◦
Servlet이므로 1개 이상의 DispatcherServlet 설정 가능