현대적인 REST API는 대부분의 데이터를 HTTP Body에 JSON 형식으로 담아 통신한다. 이번 편에서는 HTTP Body를 처리하는 방법과 서버의 처리 결과를 클라이언트에 효과적으로 전달하는 방법을 알아본다.
HTTP Body 데이터 처리: @RequestBody
@RequestBody는 HTTP 요청의 Body 내용을 읽어 자바 객체로 변환(역직렬화)하는 역할을 한다. JSON 형식의 요청을 처리하는 데 필수적이다.
- 요청:
POST /api/json-user,Content-Type: application/json - Body:
{"username": "hello", "age": 20}
@RestController
public class RequestBodyJsonController {
@PostMapping("/api/json-user")
public String processJsonUser(@RequestBody UserDto userDto) {
// HTTP Body의 JSON 데이터가 UserDto 객체로 변환되어 바인딩된다.
return "json user ok: " + userDto.getUsername();
}
}
@ModelAttribute vs @RequestBody
| 구분 | @ModelAttribute |
@RequestBody |
|---|---|---|
| 처리 대상 | 요청 파라미터, Form 데이터 | HTTP Body |
| 데이터 형식 | application/x-www-form-urlencoded |
application/json, application/xml 등 |
| 동작 원리 | 각 파라미터에 해당하는 객체의 setter 호출 |
HttpMessageConverter가 Body 전체를 객체로 변환 |
| 생략 가능 | O (복합 타입일 경우) | X (불가) |
HTTP 응답 처리
@RestController 환경에서는 메서드의 반환 값이 HTTP 응답 Body에 직접 쓰여진다.
자바 객체의 JSON 변환
@RestController의 메서드가 자바 객체를 반환하면, 스프링은 HttpMessageConverter를 사용해 해당 객체를 JSON 문자열로 변환하여 응답한다.
@RestController
public class ResponseBodyController {
@GetMapping("/api/get-user")
public UserDto getUser() {
UserDto user = new UserDto();
user.setUsername("userA");
user.setAge(20);
// 이 UserDto 객체가 JSON으로 변환되어 응답 Body에 담긴다.
return user;
}
}
응답 결과:
// HTTP/1.1 200 OK
// Content-Type: application/json
{
"username": "userA",
"age": 20
}
응답 상태 제어: ResponseEntity
데이터뿐만 아니라 HTTP 상태 코드나 헤더를 동적으로 제어해야 할 경우 ResponseEntity를 사용한다. 이는 HTTP 응답 전체를 표현하는 객체다.
@RestController
public class ResponseBodyController {
@PostMapping("/api/create-user")
public ResponseEntity<UserDto> createUser(@RequestBody UserDto userDto) {
// ... 사용자 저장 로직 ...
// 생성 성공을 의미하는 201 Created 상태 코드와 함께 데이터를 반환
return new ResponseEntity<>(userDto, HttpStatus.CREATED);
}
}
HttpMessageConverter의 역할
@RequestBody와 @ResponseBody가 동작하는 핵심 원리가 HttpMessageConverter이다. 이는 HTTP 메시지 Body와 자바 객체 사이의 변환을 담당하는 인터페이스다.
@RequestBody동작 시: HTTP 요청 Body → 자바 객체 (역직렬화)@ResponseBody동작 시: 자바 객체 → HTTP 응답 Body (직렬화)
스프링 부트는 MappingJackson2HttpMessageConverter(JSON 처리), StringHttpMessageConverter(문자열 처리) 등 다양한 구현체를 미리 등록해두고, 요청의 Content-Type 헤더와 컨트롤러 메서드의 파라미터/반환 타입을 보고 적절한 컨버터를 선택하여 사용한다.
'SpringBoot' 카테고리의 다른 글
| Spring MVC: 요청 매핑과 파라미터 처리 (0) | 2025.06.13 |
|---|---|
| Spring MVC 구조: 어댑터 패턴과 다형성은 왜 중요한가? (0) | 2025.05.20 |
| 웹 애플리케이션의 이해 (0) | 2025.05.13 |
| RequestScope로 요청별 로그 분리하기 (0) | 2025.05.07 |
| 스프링 DI: 생존자 주입을 권장하는 이유 (0) | 2025.05.05 |