HTTP API를 제공할 때는 HTML이 아니라 데이터를 전달해야 하므로, HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. 이 경우 정적 리소스나 뷰 템플릿을 거치지 않고, 서버가 직접 HTTP 응답 메시지를 생성하여 클라이언트에 전달한다.
1) 문자열 응답을 직접 HttpServletResponse 객체를 사용해 전송하는 방법
@GetMapping("/response-body-string-v1")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("ok");
}
서블릿을 직접 다룰 때 처럼 response.getWriter().write("ok"); HttpServletResponse 객체를 통해서 HTTP 메시지 바디에 직접 `ok` 응답 메시지를 전달한다. 2) ResponseEntity를 사용해 문자열 응답을 전송하는 방법
@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
return new ResponseEntity<>("ok", HttpStatus.OK); // 상태 코드 200과 함께 "ok" 문자열을 반환
}
`ResponseEntity` 엔티티는 `HttpEntity` 를 상속 받았는데, HttpEntity는 HTTP 메시지의 헤더, 바디 정보를 가
지고 있다. `ResponseEntity` 는 여기에 더해서 HTTP 응답 코드를 설정할 수 있다. `HttpStatus.OK` 로 변경하면 200 응답이 나가는 것을 확인할 수 있다.
4) ResponseEntity를 사용해 JSON 형식의 객체를 전송하는 방법
@GetMapping("/response-body-json-v1")
public ResponseEntity<HelloData> responseBodyJsonV1() {
HelloData helloData = new HelloData();
helloData.setUsername("미노이"); // HelloData 객체에 사용자 이름 설정
helloData.setAge(20); // HelloData 객체에 나이 설정
return new ResponseEntity<>(helloData, HttpStatus.OK); // 상태 코드 200과 함께 HelloData 객체를 JSON 형식으로 반환
}
`ResponseEntity` 를 반환한다. HTTP 메시지 컨버터를 통해서 JSON 형식으로 변환되어서 반환된다.
5) JSON 형식의 객체를 간단히 전송하는 방법
@ResponseStatus(HttpStatus.OK) // 응답 상태 코드를 200으로 설정
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2() {
HelloData helloData = new HelloData();
helloData.setUsername("미노이"); // HelloData 객체에 사용자 이름 설정
helloData.setAge(20); // HelloData 객체에 나이 설정
return helloData; // HelloData 객체를 JSON 형식으로 반환
}
ResponseEntity는 HTTP 응답 코드를 설정할 수 있는데, `@ResponseBody` 를 사용하면 이런 것을 설정하기 까
다롭다 @ResponseStatus(HttpStatus.OK)` 애노테이션을 사용하면 응답 코드도 설정할 수 있다.
물론 애노테이션이기 때문에 응답 코드를 동적으로 변경할 수는 없다. 프로그램 조건에 따라서 동적으로 변경하려면 ResponseEntity를 사용하면 된다.
@RestController
Spring에서 RESTful 웹 서비스를 만들 때 사용하는 애너테이션이다. 이 애너테이션을 클래스에 붙이면, 클래스의 모든 메서드는 자동으로 JSON 또는 XML 형식의 데이터를 HTTP 응답 본문으로 반환한다. 이는 @Controller와@ResponseBody를 합친 기능을 제공한다.