[Spring] Spring Web MVC 모듈 (2)-어노테이션 기반으로 컨트롤러 개발하기


Spring Web MVC에서 Annotation 기반 컨트롤러 개발하기


Annotation 기반으로 컨트롤러를 개발하기 위해선 스프링 mvc 스키마의 <mvc:annotation-driven /> 요소를 활성화해야 한다. 웹 어플케이션 컨텍스트 파일에 이 요소를 작성하면 작업은 끝이다. 이는 현재의 Dispatcher ServletSpring 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은 들어오는 요청을 적절한 컨트롤러와 메서드에 연결한다. @Controllervalue 속성은 스프링 컨테이너에 등록할 beanid를 주는 방법이다. 따로 지정하지 않으면 클래스 이름에 앞글자만 소문자로 해서 id를 준다. @RequestMappingvalue 속성의 값은 해당 컨트롤러가 처리할 요청 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

댓글