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

📌 @ResponseBody의 동작 방식
- @ResponseBody 어노테이션을 사용하면, 요청핸들러 메소드가 반환하는 값이 HTTP 요청메시지의 바디부에 포함되어 전달된다.
- Spring MVC는 ViewResolver와 View를 사용하지 않고, HttpMessageConverter를 사용한다.
1. 요청핸들러 메소드의 반환값이 String일 때
- StringHttpMessageConverter가 사용된다.
@GetMapping("/hello")
@ResponseBody
// StringHttpMessageConverter가 사용됨
public String hello() {
return "안녕하세요";
}
1) HandlerAdapter가 요청핸들러 메소드의 @ResponseBody를 확인한다.
응답을 제공할 때 HttpMessageConverter를 사용할 예정이다.
2) 요청핸들러 메소드를 실행한다.
3) 요청핸들러 메소드의 반환값이 String이기 때문에 StringHttpMessageConverter
를 사용한다.StringHttpMessageConverter
의 void write(String str, HttpOutputMessage message) 메소드를 실행해서 응답메시지의 바디부에 문자열을 포함시켜서 응답으로 보낸다.
2. 요청핸들러 메소드의 반환값이 객체일 때
- MappingJackson2HttpMessageConverter가 사용된다.
@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
< 해당 글은 velog에서 이전하며 옮겨온 글로, 가독성이 좋지 않을 수 있는 점 양해 부탁드립니다. >
🔗 velog 버전 보기 : https://velog.io/@ryuneng2/Spring-ResponseBody-RestController