REST API를 개발할 때, Server는 Client로 HTML을 전달하지 않고, HTTP Message Body에 직접 데이터를 JSON 형식으로 담아 전송한다.
정적 HTML이나 View Template도 HTTP Message Body를 통해 전달되지만, 이번 설명에서는 이 과정 없이 HTTP Response Message를 직접 만들어 반환하는 경우를 다룬다.
HttpServletResponse 사용
@Controller
public class ResponseBodyController {
@GetMapping("/v1/response-body")
public void responseBodyV1(HttpServletResponse response) throws IOException {
response.getWriter().write("data");
}
}
response.getWriter().write("data");를 통해 HTTP 응답 본문에 문자열 "data"를 전송한다.ResponseEntity<> 사용
@GetMapping("/v2/response-body")
public ResponseEntity<String> responseBodyV2() {
return new ResponseEntity<>("data", HttpStatus.OK);
}
"data" 문자열과 상태 코드 HttpStatus.OK를 포함하여 반환한다.ResponseEntity는 HttpEntity를 상속하여, HTTP Message의 Header와 Body를 함께 처리할 수 있다.@ResponseBody(TEXT, JSON) 사용
TEXT 데이터 전송 예시
@ResponseBody
@GetMapping("/v3/response-body-text")
public String responseBodyText() {
return "data"; // HTTP Message Body에 "data" 포함
}
JSON 데이터 전송 예시
@Data
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 전체 필드 포함 생성자
public class Tutor {
private String name;
private int age;
}
@ResponseBody
@GetMapping("/v3/response-body-json")
public Tutor responseBodyJson() {
return new Tutor("wonuk", 100); // HTTP Message Body에 JSON 형식으로 반환
}
@ResponseBody를 사용하면 View를 거치지 않고, HTTP Message Converter를 통해 데이터를 응답 본문에 직접 입력할 수 있다.
ResponseEntity 사용
GET - Query Param, Query String POST - HTML Form(x-www-form-urlencoded) HTTP Request Body 직접 전송 정적 리소스 View Template HTTP Message Body 직접 응답@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {
Tutor tutor = new Tutor("wonuk", 100);
return new ResponseEntity<>(tutor, HttpStatus.OK);
}
ResponseEntity의 두 번째 인자로 상태 코드 Enum을 제공하여 동적으로 상태 코드를 변경할 수 있다.HttpEntity를 상속받아 Header와 Body 모두 처리 가능하다.정리
Client에서 Server로 데이터를 전달하는 세 가지 방법
http://localhost:8080/tutor?name=wonuk&age=100@RequestParam, @ModelAttributePOST /form-data
content-type: application/x-www-form-urlencoded
key1=value1&key2=value2
@RequestParam, @ModelAttribute
@RequestBodyServer(Spring)에서 HTTP 응답을 Client에 전달하는 세 가지 방법
@Controller
@ResponseBody, ResponseEntity<Object>요청과 응답 어노테이션 요약
@RequestParam, @ModelAttribute, @RequestBody@Controller), @ResponseBody, ResponseEntity<Object>