요청핸들러 메소드에 부착 시,
뷰페이지(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