티스토리 뷰

@MVC는 애노테이션 기반의 컨트롤러 기술이다.

@MVC 이전의 컨트롤러는 타입을 비교해서 컨트롤러를 선택하고, 그 타입의 구현된 메서드를 호출하는 방법을 사용했다면, @MVC는 @RequestMapping을 이용해서 컨트롤러 클래스나 메서드를 선택하여 호출하는 방법을 사용한다.


이것을 사용하기 위해서는 DefaultAnnotationHandlerMapping을 사용해야 했지만 스프링 3.2부터 deprecated되었고, RequestMappingHandlerMapping가 대신한다.


RequestMappingHandlerMapping는 기본적으로 등록되는 빈이라 등록해줄 필요가 없지만 만약 다른 핸들러 매핑 빈을 사용하고 있다면 수동으로 서블릿 컨테이너에 이 빈을 등록해줘야 사용할 수 있다.


@RequestMapping은 컨트롤러 타입 계층과 메서드 계층에서 사용될 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Controller
@RequestMapping("/web")
public class AnnotaionHandlerController {
 
    @RequestMapping(value="page1")
    public ModelAndView page1(HttpServletRequest req, HttpServletResponse res, HttpSession session){
        
        ModelAndView view = new ModelAndView();
        
        view.setViewName("page");
        
        return view;
    }
 
}
cs

기본적으로 이 매핑을 사용하려면 컨트롤러로 만드려는 클래스 계층에 @Controller가 선언되어 있어야 한다.

@RequestMaping의 값은 접근하려는 URL이 된다.

위 코드의 컨트롤러 메서드인 page1진입하려면 (서버:포트/컨텍스트패스/web/page1)으로 접속해야 접근이 가능하다.


만약 클래스 계층의 @RequestMapping을 제거(2번째 라인)한다면 (서버:포트/컨텍스트패스/page1)으로 접근할 수 있다.



1
@RequestMapping(value={"page10*""/pages/**/100""page.*"})
cs

이런식으로 와일드카드도 허용한다.

/page10

/page101

/pages/a/b/100

/page.

/page.htm

와 같은 경로로 접근이 가능하다.

value는 원래 String[] 타입을 참조하므로 위와 같이 여러가지 설정이 가능하다.



1
2
@RequestMapping(value="page", method={RequestMethod.POST, RequestMethod.PUT})
@RequestMapping(value="page", method=RequestMethod.GET)
cs

두 가지가 같은 URL로 접근해도 HTTP요청 방식에 따라 분기를 나눌 수 있다.

요청방식이 POST나 PUT이라면 첫번째 매핑 메서드에 진입할 것이고, GET이라면 두번째 매핑 메서드에 진입할 것이다.

method속성도 RequestMethod[] 타입을 참조하므로 단독 또는 다수의 값으로 설정 가능하다.



1
2
@RequestMapping(value="page", params={"type=user""level=goldUser"})
@RequestMapping(value="page", params="type=admin")
cs

params속성을 사용하면 요청파라미터에 대하여 분기를 나눌 수 있다.

/page?level=goldUser&type=user

첫번째 매핑 메서드에 진입한다.

/page?type=admin

두번째 매핑 메서드에 진입한다.





@RequestMapping은 다음과 같이 상속에도 통용이 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RequestMapping("/web")
public class AnnotaionHandlerController {
 
    @RequestMapping("add")
    public ModelAndView add(HttpServletRequest req){
        ModelAndView view = new ModelAndView();
        System.out.println(1);
        view.setViewName("page");
        
        return view;
    }
}
 
 
@Controller
public class SubController extends AnnotaionHandlerController{
 
    @RequestMapping("delete")
    public ModelAndView delete(){
        return new ModelAndView("/home");
    }
 
}
 
cs


조상클래스인 AnnotationHandlerController를 SubController이 상속받아 확장하였다.


조상의 @RequestMapping을 자손이 받기 때문에 SubController의 메서드 delete()는 /web/delete 입력으로 접근이 가능하다.


조상클래스에 @Controller가 없어도 자손에 있기 때문에 그리고 조상의 정보를 자손이 물려받기 때문에 /web/add도 접근이 가능하다.

Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday