티스토리 뷰

Spring

@RequestBody,@ResponseBody

Xion 2020. 7. 25. 18:38

Spring에서 API구현 시 주로 사용되는 @RequestBody, @ResponseBody ,@ModelAttribute어노테이션의 개념에 대해 확실하게 알고 넘어가보자.

ex) Web Page에서 json으로 request한 파라미터들을 java에서 받으려면 java Object type으로 변환이 필요하다.
마찬가지로 response시에도 java object에서 json으로 변환이 필요로하다.
web에서 받은 data는 java에서 사용 시 : web -> (javaObject로 변환 ) - > java에서 활용
java에서 web으로 data 보낼 시  : java -> ( json Object로 변환) ->  web

 

이러한 작업들을 해주는 어노테이션이 바로 @RequestBody와 @ResponseBody이다.

 

컨트롤러에 두 어노테이션을 추가해주면, JSON이나 key/value 방식 xml등으로 송수신 할 수 있다.

 

| @RequestBody란?

 

클라이언트가 전송하는 Http 요청의 Body 내용을 Java Object로 변환시켜주는 역할.
그렇기 때문에 Get방식의 메소드에 @RequestBody를 활용하는 것은 적합하지 않다.
@RequestBody는 Json이나 XML같은 형태의 data를 jackson등의 MessageConverter를 활용하여 Java Object로 변환한다.( @ModelAttribute(1:1로 매칭) 와 차이가 있다 )

 

HTTP 요청의 body 내용을 java 객체로 매핑하는 역할.

쉽게 말해 POST 방식의 HTTP body안에 JSON 으로 넘어온 값을 VO(데이타 객체)에 바인딩한다.

 

ex) 또한 결정적인 차이는 이 어노테이션이 붙은 파라미터는 HTTP요청의 본문 body 부분이 그대로 전달된다.

RequestMappingHandlerAdapter에는 HttpMessageConverter 타입의 메시지 변환기 (message converter)가 여러 개 등록되어 있다.

@RequestBody가 붙은 파라미터가 있으면 HTTP요청의 미디어 타입과 파라미터의 타입을 먼저 확인한다.

(이는 디스패쳐 서블릿에서 확인한다) 메시지 변환기 중에서 해당 미디어 타입과 파라미터 타입을 처리할 수 있다면,

HTTP 요청의 본문 부분을 통째로 변환해서 지정된 메소드 파라미터로 전달해준다.

 

@ReuqestBody 어노테이션은 요청에서 Body 부분을 살펴 요청된 데이터를 추출하여 파라미터로 변환해주는데

"GET"메소드 요청의 경우에는 HTTP Body에 요청이 전달되는 것이 아니라 URL의 파라미터로 전달

ex) http://localhost:8080/test?id=admin&name=abc..)형식으로 전달되기 때문에 @RequestBody로 받으력고 해도 서로 다른 곳을 보며 데이터가 없다는 결과를 던질 수 밖에 없다.

 

| @ResponseBody란?

 

java 객체를 HTTP 요청의 body 내용으로 매핑하는 역할.

VO 객체를 JSON으로 바꿔서 HTTP body에 담는 스프링 어노테이션
메서드의 return 값을 HTTP Response의 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를 사용하였기 때문이며

@RestController는 @Controller와 다르게 return값에 자동으로 @ResponseBody를 붙여 HTTP 응답데이터 (Body)에 자바 객체가 매핑되어 전달됩니다.

 

일반적인 @Controller

@ResponseBody // 응답
@RequestMapping(value= "/hello", method=RequestMethod.POST)
public String hello(@RequestBody String param){ // 요청
    return "result";
}

위와 같은 어노테이션을 명시하면 스프링은 앞서 배운 "메세지 컨버터" 라는 것을 이용하여 HTTP 요청이나 응답을 메세지로 변환하게 됩니다.

 

@RequestBody를 입력할 경우, Parameter Type에 맞는 메세지 컨버터를 선택한 뒤 HTTP 요청 본문을 통째로 메세지로 변환하여 파라미터에 바인딩합니다.

 

메서드 상단에 @ResponseBody를 입력할 경우 또한 마찬가지로 return type에 맞는 메세지 컨버터를 선택한 뒤 리턴 값을 통째로 메세지로 변환한 뒤 return해줍니다.

 

참고로 GET방식의 요청일 경우 HTTP 요청 본문이 없으므로 @RequestBody를 사용할 수 없습니다.
@RequestParam이나 @ModelAttribute를 사용해야 합니다.

 

'Spring' 카테고리의 다른 글

[springSecurity]스프링 시큐리티  (0) 2020.08.08
@ModelAttribute와@RequestParam  (0) 2020.07.26
메시지 컨버터란?  (0) 2020.07.25
@RequestMapping의 produces,Content-Type,Consumes란?  (1) 2020.07.25
커맨드 객체란?  (0) 2020.07.25