Spring Web MVC에서 Annotation 기반 컨트롤러 개발하기
Annotation
기반으로 컨트롤러를 개발하기 위해선 스프링 mvc 스키마의 <mvc:annotation-driven /> 요소를 활성화해야 한다. 웹 어플케이션 컨텍스트 파일에 이 요소를
작성하면 작업은 끝이다. 이는 ‘현재의 Dispatcher Servlet에 Spring Web MVC Anntation
사용을 활성화 시키겠다.’ 라는 정도의 의미이다. 또한
<context:component-scan base-package=”package
경로”/>을 추가해 @Componet 계열 클래스들을 자동으로 빈 등록하도록 설정한다.
@Controller(value = "testCtr")
@RequestMapping(value = "/fixedDeposit")
public class FixedDepositController {
@RequestMapping(value = "/list")
public ModelAndView listFixedDeposits() {…}
@Controller은
특정 클래스를 컨트롤러로 지정하고, @RequestMapping은 들어오는 요청을 적절한 컨트롤러와
메서드에 연결한다. @Controller의 value 속성은
스프링 컨테이너에 등록할 bean의 id를 주는 방법이다. 따로 지정하지 않으면 클래스 이름에 앞글자만 소문자로 해서 id를
준다. @RequestMapping의 value 속성의 값은
‘해당 컨트롤러가 처리할 요청 URI 경로’이며, 경로로 들어온 요청을 컨트롤러 클래스 혹은 메서드가 처리하게
맵핑시킨다.
@RequestMapping
@RequestMapping은
앞서도 말했듯이 요청을 컨트롤러와 메서드에 연결해주는 역할을 한다. @RequestMapping 어노테이션의
속성에는 대표적으로 value, method, param 등이 있다.
앞서 말했듯이 value
속성은 ‘요청 경로’를 지정한다. 또한 이 value 속성의 값으로 패턴을 쓸 수도 있다. 가령, @RequestMapping(“/aaa/*.htm”)이 붙은
컨트롤러가 있다면 /aaa/xxx.htm, /aaa/yyy.htm 같은 요청들을 해당 컨트롤러가 다
처리하게 된다.
@RequestMapping(params = "aaa=xyz", method = RequestMethod.POST)
public ModelAndView testMethod(HttpServletRequest rq) {…}
method 속성은
해당 컨트롤러가 처리할 ‘HTTP 메서드’를 지정한다. method 속성의 값은 RequestMethod 라는 enum을 사용해 지정한다. 이 때,
여러 HTTP 메서드들을 배열로 해서 값을 지정할 수 있다.
params 속성은
요청에 반드시 있어야 할 ‘요청 파라미터 이름과 값’을 지정한다. 위 예시의 컨트롤러 메서드는 aaa 파라미터의 값이 xyz인 경우에 요청을 처리한다. 또한, 요청 파라미터가 있는지 여부에 따라 요청을 메서드에 연결할 수도 있다. 예를
들어 @RequestMapping(params = “aaa”)는 요청 파라미터 aaa가 있는 경우 값과 상관없이 메서드에 연결, @RequestMapping(params
= “!aaa”)는 요청 파라미터 aaa가 없는 경우 메서드에 연결, @RequestMapping(params = “aaa != xyz”)는 요청 파라미터 aaa가 있고 그 값이 xyz가 아닐 때 메서드에 연결한다.
@RequestMapping이
붙은 메서드는 인자로 여러 타입을 받을 수 있다. HttpServletRequest, HttpSession,
BindingResult 등이 있다. 마찬가지로 @RequestMapping이
붙은 메서드는 여러 리턴 타입을 가질 수 있다. ModelAndView, String, void 등이
있다. 어떤 인자와 리턴 타입들을 가질 수 있는지 보려면 @RequestMapping
자바독을 참조하면 된다.
@RequestParam
@RequestMapping(value = "/test", method = RequestMethod.POST)
public ModelAndView testMethod(@RequestParam(value = "tId") int id) {...}
@RequestParam
어노테이션을 사용하면 ‘요청 파라미터의 값을 메서드 인자로 할당’할 수 있다. 위 예시 같은 경우,
‘/test?tId=1’로 끝나는 요청이 들어오면 id라는 메서드 인자에 1을 맵핑해준다. 또한 메서드 인자 타입을 Map으로 주면 모든 요청 파라미터를 받을 수 있고, defaultValue 속성을
이용하면 value 속성의 값이 요청 파라미터에 없는 경우 디폴트로 값을 넣어준다.
@ExceptionHandler
@ExceptionHandler(value=TimeoutException.class)
public ModelAndView customExceptionHandler(Exception ex) {…}
@ExceptionHandler는
컨트롤러에서 발생한 예외를 처리할 메서드를 정의한다. value 속성에는 처리할 익셉션 클래스를 지정한다. value 속성을 따로 지정하지 않으면 메서드 인자들 중 익셉션 타입에 따라 처리한다.
@ExceptionHandler가
붙은 메서드는 인자로 여러 타입을 받을 수 있다. HttpServletRequest, HttpSession 등이
있다. 마찬가지로 @ExceptionHandler이 붙은
메서드는 여러 리턴 타입을 가질 수 있다. ModelAndView, String, void 등이 있다. 어떤 인자와 리턴 타입들을 가질 수 있는지 보려면 @ExceptionHandler
자바독을 참조하면 된다.
@ExceptionHandler가
붙은 메서드의 리턴값은 View에 대한 정보이고 DispatcherServlet에서
해당하는 오류 페이지를 생성하는데 사용한다.
참고 1: https://gs.saro.me/dev?tn=556
참고 1: https://gs.saro.me/dev?tn=556
댓글
댓글 쓰기