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;
}