📦 HTTP Message Body(응답)
- REST API를 만드는 경우, HTTP Message Body에 직접 Data를 JSON 형식으로 담아 전달
📌 핵심 개념
❗ 여기서 말하는 HTTP Body 응답은 정적 리소스나 템플릿 엔진과 무관한 직접 데이터 응답
HTTP Message Body 응답 방식 4가지
1. HttpServletResponse 직접 사용 (저수준 방식)
@Controller
public class ResponseBodyController {
@GetMapping("/v1/response-body")
public void responseBodyV1(
HttpServletResponse response
) throws IOException {
response.getWriter().write("data");
}
}
→ HttpServlet API 그대로 사용
→ Body에 "data"를 직접 작성
→ 단순하지만 Spring 기능을 거의 활용하지 못함
2. ResponseEntity<T> 사용 (가장 많이 쓰는 실무 방식)
@GetMapping("/v2/response-body")
public ResponseEntity<String> responseBodyV2() {
return new ResponseEntity<>("data", HttpStatus.OK);
}
→ Body 내용과 상태 코드 함께 설정 가능
→ JSON, TEXT 모두 가능
→ HttpHeaders도 추가 가능
✅ 유연한 제어 가능: 바디 + 상태 코드 + 헤더
3. @ResponseBody(TEXT, JSON) 사용
@Data
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 전체 필드를 인자로 가진 생성자
public class Tutor {
private String name;
private int age;
}
✔ 텍스트 응답
// TEXT 데이터 통신
@ResponseBody
@GetMapping("/v3/response-body-text")
public String responseBodyText() {
return "data"; // HTTP Message Body에 "data"
}
→ View가 아닌 문자열 자체가 응답 Body에 포함됨
✔ JSON 객체 응답
// JSON 데이터 통신
@ResponseBody
@GetMapping("/v3/response-body-json")
public Tutor responseBodyJson() {
Tutor tutor = new Tutor("wonuk", 100);
return tutor; // HTTP Message Body에 Tutor Object -> JSON
}
}
→ 내부적으로 HttpMessageConverter가 동작
→ 객체는 MappingJackson2HttpMessageConverter에 의해 JSON으로 직렬화됨
✔ @ResponseStatus로 상태 코드 지정 가능
@ResponseStatus(HttpStatus.OK)
@ResponseBody
@GetMapping("/v4/response-body")
public Tutor responseBodyV4() {
Tutor tutor = new Tutor("wonuk", 100);
return tutor;
}
→ 응답 상태 코드도 지정할 수 있음
→ ❗ 단, 조건에 따라 상태 코드를 동적으로 변경할 수는 없음
4. ResponseEntity<Object>(JSON)
@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {
Tutor tutor = new Tutor("wonuk", 100);
return new ResponseEntity<>(tutor, HttpStatus.OK);
}
→ ResponseEntity<> 두 번째 파라미터에 Enum을 사용하여 상태 코드를 바꿀 수 있음
❗ 조건에 따라 응답 코드를 변경할 수 있음
@ResponseBody
@GetMapping("/v5/response-body")
public ResponseEntity<Tutor> responseBody() {
Tutor tutor = new Tutor("wonuk", 100);
if (조건) {
return new ResponseEntity<>(tutor, HttpStatus.OK);
} else {
return new ResponseEntity<>(tutor, HttpStatus.BAD_REQUEST);
}
}
→ 상태 코드 제어가 유연하여 실무에서 자주 사용
🔄 응답 처리 방식 요약표
| 방식 | 사용 예 | 상태 코드 설정 | 특징 |
|---|---|---|---|
HttpServletResponse | response.getWriter() | 수동 설정 필요 | 가장 저수준 |
@ResponseBody | @ResponseBody String, 객체 | 기본 200 OK | 간단 응답 처리 |
@ResponseStatus | 함께 사용 가능 | 고정된 상태만 가능 | 선언형 설정 |
ResponseEntity<T> | new ResponseEntity<>() | 자유롭게 제어 | 실무 최다 사용 |
🏁 마무리 정리
✅ Client → Server (요청)
| 전송 방식 | 설명 | 사용 어노테이션 |
|---|---|---|
| GET (Query Param) | ?key=value | @RequestParam, @ModelAttribute |
| POST (HTML Form) | application/x-www-form-urlencoded | @RequestParam, @ModelAttribute |
| Body (JSON, TEXT) | Request Body에 직접 데이터 전달 | @RequestBody |
✅ Server → Client (응답)
| 응답 유형 | 설명 | 사용 어노테이션/클래스 |
|---|---|---|
| 정적 리소스 | HTML, JS, CSS 등 파일 | 없음 (/static 등 위치) |
| View Template | 서버에서 HTML 동적 렌더링 | @Controller, View 이름 반환 |
| HTTP Body (데이터) | JSON, TEXT 응답 | @ResponseBody, ResponseEntity<T> |
✅ HTTP Message Converter
@RequestBody + JSON → Java 객체