스프링으로 JSON을 반환하는 API를 만드는 방법은 기존의 쿼리 파라미터를 받아 뷰를 반환하는 방식과는 다르다. HTTP 메시지 바디에 JSON을 입력하는 방법을 사용해야 하는데 HttpEntity
를 이용하는 방식과 @ResponseBody
를 이용하는 방식이 있다.
HttpEntity는 Http의 헤더와 바디를 편리하게 조회하는 기능을 제공한다. 주로 이를 상속한 RequestEntity
와 ResponseEntity
를 사용한다.
RequestEntity
: HttpMethod, url , header, body, type을 생성자 파라미터로 넘길 수 있다ResponseEntity
: HTTP 상태 코드 설정 가능, 응답에서 사용 @PostMapping("/request-body")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
@ResponseBody
@PostMapping("/request-body")
public String requestBodyStringV4(@RequestBody String messageBody) {
log.info("messageBody={}", messageBody);
return "ok";
}
@ResponseBody
는 응답 결과를 HTTP 메시지 바디에 직접 담아 전달에 준다. @RestController
이 Controller
역할에 ResponseBody
를 더한 기능을 가진다.
@RequestBody
의 경우 HTTP메시지 바디를 조회하는 기능을 제공한다. 만약 헤더의 정보가 필요한 경우 HttpEntity
를 이용하거나 @RequestHeader
를 이용해야 한다.
API 통신은 대부분 JSON을 주고 받는 것이다. 클라이언트가 보낸 JSON 객체를 서버에서 JAVA 객체로 역직렬화 해서 받고, 서버에서 클라이언트로 보낼때는 JAVA객체를 직렬화하여 JSON으로 보내야 한다.
JSON과 JAVA 객체를 직렬솨 & 역직렬화 하기 위해서는 ObjectMapper
를 사용해야 한다.
writeValue(파일,객체)
를 사용하여 직렬화한다. (Json 파일) writeValueAsString(객체)
를 통해 readValue(파일,클래스.class)
&readValue(문자열,클래스.class)
메서드를 사용한다.@JsonCreator
를 이용하는 방법도 있다고 한다. @RequestBody
와 @ResponseBody
를 사용하는 경우 스프링의 메세지 컨버터가 해당 변환을 알아서 해준다.
@ResponseBody의 경우 상태코드를 애너테이션 (ex. @ResponseStatus(HttpStatus.OK)
)을 사용하여 지정하기 때문에 한정적이다. 다양한 상황에서 상태코드를 사용해야 하는 경우 ResponseEntity
를 사용하자