@RequestMapping
핸들러 매핑과 핸들러 어댑터의 대상이 오브젝트가 아니라 메소드이다.
Controller와 같이 하나의 메소드를 가진 인터페이스로 정의되는 컨트롤러는 기본적으로 URL 당 하나의 컨트롤러 오브젝트가 매핑되고 컨트로러당 하나의 메소드만 DIspatcherServlet의 호출을 받을수 있다.
>>어노테이션은 부여되는 대상의 타입이나 코드에는 영향을 주지 않는 메타정보이다.
@MVC의 핸들러 매핑을 위해서는 DefaultAnnotationHandlerMapping이 필요하다. 매핑정보로 @RequestMapping 어노테이션을 사용한다. 메소드, 타입 레벨에 다 붙으며 이 정보를 결합하여 최종 매핑 정보를 생성한다. 한 클래스에 같이 사용하면 타입레벨속에 메소드 레벨이 포함된다.
1.@RequestMappping
-String[ ] value() : URL 패턴
-RequestMethod[ ] method() : http 요청메서드 , ex) @RequestMapping( "/hello/add", method=RequestMethod.GET ) @RequestMapping( "/hello/add", method=RequestMethod.POST)
폼 처리할'대 동일한 URL에 대해 GET과 POST 처리시 용이
-Stringp[] : 같은 URL을 사용하더라도 HTTP 요청 파라미터에 따라 별도의 작업을 해주고 싶을떄, ex) @RequestMapping( value= "/hello/edit", params="type=admin" )
-String[ ] headers(): HTTP해더, 저장방식이 params와 비슷하게 해더이름=값의 형식을 사용한 경우
ex) @RequestMapping( value="/hello", headers="content-type=text/*" )
메소드 레벨의 매핑조건이 공통점이 없는 경우라면 타입레벨에서 주지 않고 메소드 레벨에 독립적으로 매핑정보를 지정할수있다. 이때 타입레벨에서는 @ReqeustMapping을 꼭 부여해주어야 한다. 이떄 @Controller 어노테이션을 붙여 빈 자동스캔방식으로 등록되게 했다면 생략 가능하다.
>>핸들러 매핑은 원래 핸들러 오브젝트를 결정하는 전략이다. 어노테이션이 영향으로 매핑 방법이 메소드 레벨까지 세분화 되기는 했지만 타입 컨트롤러와의 일관성을 위해 어노테이션 방식의 핸들러 매핑에서도 일단 오브젝트까지만 매핑을 하고 최종 실행할 메소드는 핸들러 어댑터가 결정한다.
@RequestMapping( "/user/*")
public class UserController{
@RequestMapping publid void add() {
}
}
클래스 레벨에서는 /*로 끝나게 하고 메소드 레벨에서는 @RequestMapping만 부여해주면 매소드이름이 URL이 된다.
상속도 가능하다.
super클래스에서 클래스 레벨로 @RequestMapping( "/user") 해놓았다면 sub클래스의 메소드 레벨의
@RequesMapping("/list") public String list() {...} 로 호출가능하다.
@Controller
DefaultAnnotationHandlerMapping은 사용자 요청을 @RequestMapping정보를 활용해서 컨트롤러 빈의 메소드에 매핑해준다. 그리고 AnnotationMethodHandlerAdpter는 매핑된 메소드를 실제로 호출하는 역활을 담당한다.
메소드 파라미터의 종류
-httpServletRequest , httpServletResponse
-패스변수
url: /user/view/10
@RequestMapping( "/user/view/{id}" )
public String view( @PathVariable("id") int id ) {
}
@RequestParam
http 요청 파라미터를 메소드 파라미터에 넣어준다.
Map<String, String>타입으로 선언하면 모든 요청파라미터를 담을 맵으로 받을 수 있다.
@RequestHeader
@ModelAttribute
파라미터타입으로 오브젝트를 만들고 프로퍼티를 토해 요청파라미터를 넣어준다.
생략가능하며 @RequestParam,@ModelAttribute 생략되었을 경우 string, int는 전자로 보고 그 외 복잡한 오브젝트는 후자로 알아서 본다.
@RequestBody
http 요청의 본문이 그대로 전달된다.
xml이나 json기반의 메세지를 사용하는 요청의 경우 매우 유용하다.
AnnotationMethodHandlerAdapter에는 HttpMessageConverter 타입의 메세지 변환기가 여러개 등록되어있다. 이 어노테이션이 있으면 http요청의 미디어 타입과 파라미터 타입을 먼저 확이한다. 메시지 변환기 중에서 해당 미디어 타입과 파라미터 타입을 처리할수있는것이 있으면 http 요청이 본문부분을 통째로 변환해서 지정된 메소드 파라미터로 전달해준다.
>>AnnotationMethodHandlerAdapter가 호출하는 컨트롤러 메소드의 사용 가능한 파라미터타입과 어노테이션이다.
리턴타입의 종류
컨트롤러가 DIspatchServlet에 돌려줘야하는 정보는 모델과 뷰다. 핸들러 어댑터를 거쳐서 최종적으로 DIspatcherServlet에 돌아갈때는 ModelAndView 타입으로 리턴값이 전달된다. httpServletRsponse에 직접 결과를 넣어 리턴한는 경우도 있다.
-@ModelAttribute 모델 오브젝트 또는 커맨드 오브젝트 : 모델 오브젝트의 이름은 파라미터 타입 이름을 따른다.
-Map. Model ModelMap 파라미터 : 뷰에 전달되는 모델에 자동으로 추가
-@ModelAttribute 메소드
모델의 바인딩과 검증
컨트로러 메소드에 @modelAttribute가 지정된 파라미터를 @controller 메소드에 추가하면 크게 세 가지 작업이 자동으로 진행된다. '
-파라미터 타입의 오브젝트를 만든다.
-준비된 모델 오브젝트의 프로퍼티에 웹 파라미터를 바인딩해준다. http를 통해 전달되는 파라미터는 기본적으로 문자열인데 프로퍼티가 스트링이 아니라면 적절한 타입으로 변환해준다.
-모델의 값을 검증한다.
ing 1200p
출저 : 토비의 스프링