본문 바로가기

프로그래밍/Spring & MyBatis

[Spring]@ModelAttribute @RequestBody @PathVariable

@PathVariable

@RequestMapping의 URL에 {}로 들어가는 패스 변수를 받는다.  요청 파라미터를 URL의 쿼리 스트링으로 보내는 대신 URL패스로 풀어서 쓰는 방식을 쓰는 경우 매우 유용하다.
타입이 일치하지 않는 값이 들어오면 예외가 발생하며 별다른 예외처리를 해주지 않는다면
클라이언트에 HTTP 400 - Bad Request응답 코드가 전달 됨

@ModelAttibute

이름 그대로 모델로 사용되는 오브젝트이다. 여러개의 @RequestParam을 선언하는 대신에

여러개의 파라미터를 하나의 오브젝트에 담는 것이다.
코드를 훨씬 간결하게 작성할 수 있고 좀더 객체 지향적인 코드 구현이 가능하다.
@ModelAttribute가 해주는 한가지 기능이 더 있는데, 그것은 컨트롤러가 리턴하는 모델에 파라미터로 전달한 오브젝트를 자동으로 추가해주는 것이다.

@RequestBody

이 애노테이션이 붙은 파라미터에는 HTTP요청의 본문body부분이 그대로 전달된다.
일반적인 GET/POST의 요청 파라미터라면 @RequestBody를 사용할 일이 없을 것이다.
반면에 XML이나 JSON기반의 메시지를 사용하는 요청의 경우에는 이 방법이 매우 유용하다.

----------------------

GET/POST는 프로토콜 차이로 인해서 각각의 다른 데이터 방식의 데이터를 담아 전송한다. 중요한건 GET방식은 URL에 데이터를 담아 전송하며 1차원 데이터밖에 담지 못한다(2차원 배열, 객체속 객체 등등은 불가능하다.) 따라서 검색조건 수준의 데이터를 담는게 옳바르다, POST 방식은 Request 의 Body에 데이터를 담는데 이 경우 JSON, 다차원 데이터를 담을 수 있다. 객체속 JSON 리스트라던지 여러가지 데이터가 가능하다. 


@RequestBody를 사용할 경우, 반드시 POST 방식이어야 하지요.
@RequestBody는 JSON이나 XML 데이터를 적절한 MessageConverter로 읽어들일 때 사용합니다.
Form POST 방식으로 데이터를 보낼 경우에는 String에만 사용이 가능하며, Map이나 Model에는 사용 불가합니다.

그리고 @ModelAttribute는 흔히 모델을 받을 때 사용한다고 생각하기 쉬운데 아래의 두 human에는 동일한 값이 바인딩 됩니다.
test( Human human)
test( @ModelAttribute Human human)

@ModelAttribute의 역할은 Model에 사용되는 attribute라는 뜻으로
View에 전달할 Model에 세팅하라! 라는 뜻으로 볼 수 있습니다.

사용법은 아래처럼 크게 전역과 지역 Setting으로 구분할 수 있습니다.

-전역
클래스 내부에 아래처럼 선언하면 모든 return View에서 자동으로 request.setAttribute() 된다.
@ModelAttribute("human")
public Human setHuman() {
Human human = new Human();
human.setName("김동률");
human.setAge(13);
return human;
}
// 동일 클래스 내의 모든 return view에서 request.setAttribute("human", human); 처럼 된다.

-지역
메소드의 인자로 기술하면 된다.
public ModelAndView test(@ModelAttribute("human") Human human) {
return "huamnView";
}
//이렇게 할 경우 인자로도 쓰고, 나중에 리턴할 때에 다시 huamn 객체를 setAttribute해서 전달한다.


출처: http://sticky32.tistory.com/entry/SpringMVC-ModelAttribute-RequestBody-에-대해서 [Sticky]