예를들어 웹페이지에서 json으로 request한 파라미터들을 java에서 받으려면 java object로의 변환이 필요하며
마찬가지로 response 시에도 java object에서 json으로 변환이 필요하다.
이러한 작업들을 해주는 어노테이션이 바로 @RequestBody 와 @ResponseBody 이다.
컨트롤러에 두 어노테이션을 추가해주면, JSON이나 key/value 방식 xml 등으로 송수신 할 수 있다.
HTTP 요청의 body 내용을 자바 객체로 매핑하는 역할을 합니다.
@RequestBody 어노테이션은 요청에서 Body부분을 살펴 요청된 데이터를 추출하여 파라미터로 변환해주는데, ‘GET’ 메소드 요청의 경우에는 HTTP Body에 요청이 전달되는 것이 아니라, URL의 파라미터로 전달 (ex: http://localhost:8080/test?id=admin&name=hanq…) 형식으로 전달되기 때문에 @RequestBody로 받으려고 해도 서로 다른 곳을 보며 데이터가 없다는 결과를 던질 수 밖에 없다.
자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할을 합니다.
예제소스
@RestController
public class LoginWebController
{
// HTTP 요청의 내용을 Member 객체에 매핑하기위해 @RequestBody 애너테이션을 설정한다.
@RequestMapping(value="/member/login", method = RequestMethod.POST)
public MemberResultDto login(@RequestBody Member member)
{
MemberResultDto memberResultDto = memberService.login(member);
return memberResultDto;
}
}
위의 예제 소스에서는 HTTP 요청의 body안에 Member 데이터를 파라미터로 받기위해,
@RequestBody를 사용하였습니다.
@ResponseBody를 사용하지 않은 이유는 @RestController를 사용하였기 때문입니다.
@Controller와는 다르게 @RestController는 리턴값에 자동으로
@ResponseBody를 붙게되어 HTTP 응답데이터(body)에 자바 객체가 매핑되어 전달됩니다.
( ※ @Controller인 경우에는 @ResponseBody를 적어줘야 합니다. )
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>