2.1. Spring MVC Hello World SimpleUrlHandlerMapping을 이용한
Download
Report
Transcript 2.1. Spring MVC Hello World SimpleUrlHandlerMapping을 이용한
Chapter 04
Spring MVC
작성자: 박동진
소속팀 / 상위부서: 서비스백엔드개발팀
작성년월일: 2009.07.26
목차
1.
Spring MVC의 주요 구성요소 및 처리 흐름
2.
웹 요청과 컨트롤러 매핑
3.
컨트롤러 구현
4.
폼 값 검증 및 에러 메시지
5.
파일 업로드
6.
어노테이션을 이용한 구현
7.
HandlerInterceptor
1. Spring MVC의 주요 구성요소
및 처리 흐름
1. Spring MVC의 주요 구성요소 및 처리 흐름
1.
Spring MVC의 주요 구성 요소 및 메시지 흐름
:HandlerMapping
2 : 요청 URL과 매핑되는 Controller 검색
3 : 처리 요청
:Controller
1 : 처리요청(URL)
클라이언트
4 : ModelAndView 리턴
:DispatcherServlet
6 : 응답 출력
5 : Controller의 실행 결과를
보여줄 view 검색
:ViewResolver
:View
2. Spring MVC Hello World
2.1. Spring MVC Hello World
1. Spring의 MVC를 이용하여 웹 어플리케이션을 개발하는 과정
클라이언트의 요청을 받을 DispatcherServlet을 web.xml 파일에 설정한다.
HandlerMapping을 이용하여 요청 URL과 컨트롤러의 매핑 방식을 설정한다.
클라이언트의 요청을 처리할 컨트롤러를 작성한다.
어떤 뷰를 이용하여 컨트롤러의 처리 결과 응답 화면을 생성할지를 결정하는 ViewResolver 설정.
JSP나 Velocity 등을 이용하여 뷰 영역의 코드를 작성한다.
2.1. Spring MVC Hello World
1. DispatcherServlet 설정 및 스프링 컨텍스트 설정
클라이언트의 요청을 전달받을 DispatcherServlet 설정
공통으로 사용 할 어플리케이션 컨텍스트 설정
DispatcherServlet은 클라이언트의 요청을 전달받는 서블릿으로서, 컨트롤러나 뷰와 같은
스프링 MVC의 구성 요소를 이용하여 클라이언트에게 서비스를 제공하게 된다.
“org.springframework.web.servlet.DispatcherServlet”
2.1. Spring MVC Hello World
2. 설정 파일에 HandlerMapping 설정 추가
HandlerMapping은 클라이언트의 요청을 어떤 컨트롤러가 처리할지에 대한 정보를 제공한다.
DispatcherServlet이 사용하는 스프링 설정파일에(dispatcher-servlet.xml)에 bean으로 등록한다.
아래는 BeanNameUrlHandlerMapping인데, 클라이언트의 요청 URL과 동일한 이름을 갖는 빈을
컨트롤러로 사용하도록 매핑해준다.
“org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping”
2.1. Spring MVC Hello World
3. 컨트롤러 구현 및 설정
Spring은 Controller 인터페이스를 제공하고 있으며, 컨트롤러 클래스는 Controller 인터페이스 구현
DispatcherServlet이 사용하는 스프링 설정파일에(dispatcher-servlet.xml)에 bean으로 등록한다.
컨트롤러는 처리 결과를 ModelAndView에 담아 DispatcherServlet에 전달함.
ModelAndView는 컨트롤러의 처리 결과에 대한 응답 화면을 생성할 뷰 정보와 응답 화면을 생성할
때 필요한 정보를 저장함.
“org.springframework.web.servlet.mvc.AbstractController”
Usage>
public class HelloController extends AbstractController {
2.1. Spring MVC Hello World
4. 설정 파일에 ViewResolver 설정 추가
ModelAndView mav = new ModelAndView();
mav.setViewName(“Hello”);
ViewResolver는 이 뷰 이름을 이용하여 알맞은 View 객체를 선택하게 된다.
USAGE>
<bean id=“viewResolver”
class=“org.springframework.web.servlet.view.InternalResourceViewResolver”>
<property name=“prefix” value=“/WEB-INF/view/” />
<property name=“suffix” value=“.jsp” />
</bean>
2.1. Spring MVC Hello World
웹 어플리케이션을 위한 ApplicationContext 설정
DispatcherServlet은 그 자체가 서블릿이기 때문에 1개 이상의 DispatcherServlet을 설정하는 것이
가능하다. (P.160 참조)
ContextLoaderListener는 ContextConfigLocation 컨텍스트 파라미터를 명시하지 않으면 /WEBINF/applicationContext.xml을 설정 파일로 사용한다.
Front 컨트롤러
rest 컨트롤러
서비스 레이어
영속성 레이어
웹 어플리케이션의 전형적인 레이어 구성
2.1. Spring MVC Hello World
웹 요청과 컨트롤러 매핑 : Handler Mapping
스프링이 제공하는 HandlerMapping 구현 클래스들은 AbstractUrlHandlerMapping 추상 클래스를
직간접적으로 상속받고 있다.
AbstractUrlHandlerMapping 클래스는 전체 요청 URL을 이용하기 보다는 웹 어플리케이션 경로(서
블릿 컨텍스트 경로)를 기준으로 컨트롤러를 매핑하게 된다.
http://host/bbs1/board/list
AbstractUrlHandlerMapping
HandlerMapping이
사용하는 경로
서블릿 컨텍스트 경로
2.1. Spring MVC Hello World
Ant 경로 패턴
Ant는 자바 기반의 빌드 도구로서 ?, *, **를 이용하여 경로 패턴을 명시하고 있으며,
BeanNameUrlHandlerMapping과 SimpleUrlHandlerMapping은 Ant의 경로 패턴을 이용하여 요청
URL과 컨트롤러의 매핑을 처리하고 있다.
? : 1개의 문자와 매칭
* : 0개 이상의 문자와 매칭
** : 0개 이상의 데력터리와 매칭
이 규칙을 이용하면 손쉽게 다양한 요청 URL을 표현할 수 있을 것이다.
2.1. Spring MVC Hello World
SimpleUrlHandlerMapping을 이용한 컨트롤러 매핑(p.169)
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping은 가장 많이 사용되는
Handler Mapping으로서, 패턴 매칭을 이용하여 다양한 URL 경로를 컨트롤러에 매핑시켜 준다.
SimpleUrlHandlerMapping의 mapping 프로퍼티는 java.util.Properties 타입이다. Mappings 프로퍼
티의 값에 전달되는 <prop>의 key는 요청 URL과 매칭될 Ant 경로 패턴을 입력하며, <prop>의 값에
는 매핑될 컨트롤러의 이름을 입력한다.
가장 많이 사용되는 이유 : 설정이 손쉬움.
2.1. Spring MVC Hello World
컨트롤러 구현(p.171)
클라이언트의 요청에 따라 알맞은 작업을 수행하는 것은 컨트롤러를 통해서 이루어진다.
org.springframework.web.servlet.mvc.Controller 인터페이스를 구현해야 함.
DispatcherServlet은 HandlerMapping으로부터 클라이언트의 요청을 처리할 컨트롤러 빈을 가져온
뒤 handleRequest() 메소드를 호출하여 컨트롤러가 클라이언트의 요청을 처리하도록 한다.
handleRequest() 메소드는 클라이언트의 요청을 처리한 뒤, 뷰를 생성하는 데 필요한 정보를
ModelAndView 객체에 담아서 리턴한다.
Signiture : ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse
response) throws Exception;
USAGE>
public class TimeController implements Controller {
2.1. Spring MVC Hello World
AbstractController를 이용한 컨트롤러 구현(p.173)
org.springframework.web.servlet.mvc.AbstractController(추상 클래스)
단순히 클라이언트 요청을 처리한 뒤에 ModelAndView를 리턴하고 싶을 때 상속하여 구현함.
AbstractController 클래스는 다음과 같이 handleRequestInternal() 추상 메소드를 선언하고 있으며,
AbstractController 클래스를 상속받는 컨트롤러 클래스는 이 메소드를 알맞게 구현해 주면 됨.
Signiture : protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception;
USAGE>
public class TimeController extends AbstractController {
2.1. Spring MVC Hello World
ModelAndView 클래스(p.202)
ModelAndView 클래스는 컨트롤러의 처리 결과를 보여줄 뷰와 뷰에 전달할 값을 저장하는 용도로
사용됨.
ModelAndView 객체를 생성하는 방법
- 뷰 이름 설정 : setViewName(String viewName)
- 뷰에 전달할 값 추가 : addObject(String attributeName, Object attributeValue)
USAGE>
ModelAndView mav = new ModelAndView();
mav.setViewName(“bbs/list”)
mav.addObject(“articles”, articleList);
mav.addObject(“pagingInfo”, pagingInfo);
return mav;
2.1. Spring MVC Hello World
예외처리(p.238)
Controller 인터페이스의 handleRequest 메소드는 다음과 같이 Exception을 발생할 수 있도록 정의
되어 있다.
예외에 따라 알맞은 에러 화면을 출력하고 싶다면 HandlerExceptionResolver를 사용.
DispatcherServlet은 HandlerExceptionResolver가 등록되어 있을 경우 예외 처리를
HandlerExceptionResolver에 맡긴다.
USAGE>
public inferface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse
response) throws Exception;
}