요청핸들러 메소드에 부착 시,
뷰페이지(jsp)로 이동하지 않고 데이터만 반환되도록 해주는 어노테이션
- 주로 Ajax에 대한 응답을 보낼 때 사용된다.
* 화면에 값을 표현할 때
요청핸들러 메소드나 요청핸들러 메소드의 반환타입 앞에 @ResponseBody가 지정되어 있으면, 요청핸들러 메소드가 반환하는 값은 데이터로 취급된다.
Spring MVC는 요청핸들러 메소드가 반환하는 값을 응답메시지의 바디부에 포함시켜서 클라이언트에게 응답으로 전달한다.
@ResponseBody가 명시된 메소드가 호출된다면, 직렬화 또는 역직렬화에 맞는 MappingJackson2HttpMessageConverter 하위 메소드들이 실행되고,
내부에 존재하는 ObjectMapper를 이용하여 JSON 또는 객체 형태로 컨버팅된다.
* 직렬화/역직렬화 참고 링크
@ResponseBody 어노테이션 부착/미부착 시의 결과가 어떻게 다른지 비교해보자.
@GetMapping("/app1")
public String app1() {
return "app1";
}

@GetMapping("/app2")
@ResponseBody
public String app2() {
return "app2";
}


- @ResponseBody 어노테이션을 사용하면, 요청핸들러 메소드가 반환하는 값이 HTTP 요청메시지의 바디부에 포함되어 전달된다.
- Spring MVC는 ViewResolver와 View를 사용하지 않고, HttpMessageConverter를 사용한다.
@GetMapping("/hello")
@ResponseBody
// StringHttpMessageConverter가 사용됨
public String hello() {
return "안녕하세요";
}
1) HandlerAdapter가 요청핸들러 메소드의 @ResponseBody를 확인한다.
응답을 제공할 때 HttpMessageConverter를 사용할 예정이다.
2) 요청핸들러 메소드를 실행한다.
3) 요청핸들러 메소드의 반환값이 String이기 때문에 StringHttpMessageConverter를 사용한다.
StringHttpMessageConverter의 void write(String str, HttpOutputMessage message) 메소드를 실행해서 응답메시지의 바디부에 문자열을 포함시켜서 응답으로 보낸다.
@GetMapping("/product")
@ResponseBody
// MappingJackson2HttpMessageConverter가 사용됨
public Product getProduct(@RequestParam("no") int productNo) {
Product product = productService.getProduct(productNo);
return product;
}
1) HandlerAdapter가 요청핸들러 메소드의 @ResponseBody를 확인한다.
응답을 제공할 때 HttpMessageConverter를 사용할 예정이다.
2) 요청핸들러 메소드를 실행한다.
3) 요청핸들러 메소드이 반환값이 Product 객체이기 때문에 MappingJackson2HttpMessageConverter를 사용한다.
MappingJackson2HttpMessageConverter은 자바객체를 JSON 형식의 텍스트로 직렬화한다. 직렬화된 JSON 텍스트를 응답메시지의 바디부에 포함시켜서 응답으로 보낸다.
References