이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
@ResponseBody
-
@ResponseBody의 기능은
-
@RequestBody와 마찬가지로
-
HttpMessageConveter를 이용하여
-
응답값을 응답 본문(=ResponseBody)에 담아준다.
-
또한 리턴 타입을 정할때는
-
기본적으로 요청에 Accept 헤더를 참고한다.
-
만약 브라우저가 요청을 한다면
-
브라우저 자체적으로
-
JSON or HTML을 요청한다.
@RequestMapping("/api/events")
public class EventApi {
@Autowired
private ObjectMapper objectMapper;
@PostMapping
@ResponseBody // @ResponseBody 선언
public Event createEvent(HttpEntity<Event> requset){
Event body = requset.getBody();
try {
System.out.println(objectMapper.writeValueAsString(body));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
MediaType contentType = requset.getHeaders().getContentType();
System.out.println(contentType);
return body;
}
}
맺음말
-
만약 @RestController 애노테이션을 사용한다면
-
@ResponseBody 애노테이션을 생략해도 된다.
-
Why?
-
@RestController의 정의를 보자.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
-
@RestController 애노테이션에는
-
이미 @ResponseBody가 선언되어있기 때문이다.
-
그렇기 때문에
-
만약 @RestController를 사용했다면
-
위 예시 코드는 다음과 같이 변경해도 된다.
@RestController
@RequestMapping("/api/events")
public class EventApi {
@Autowired
private ObjectMapper objectMapper;
@PostMapping
// @ResponseBody // 생략 가능
public Event createEvent(HttpEntity<Event> requset){
Event body = requset.getBody();
try {
System.out.println(objectMapper.writeValueAsString(body));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
MediaType contentType = requset.getHeaders().getContentType();
System.out.println(contentType);
return body;
}
}