@ReqestBody를 사용하는 방법은 알겠다. 문득, 어떻게 DTO와 요청 JSON을 매핑하는지 동작 원리가 궁금했다. 어떻게 @RequestBody는 객체와 JSON을 매핑할까? 조사해본 내용들을 정리 해보려고 한다.
✔️ @RequestBody 란?
@RequestBody 는 Spring Framework (Spring MVC)에서 제공되는 어노테이션으로, HTTP 요청의 본문(body)에 있는 데이터를 자바 객체에 매핑할 때 사용된다. 주로 JSON 또는 XML과 같은 형식의 데이터를 Java 객체와 매핑할 때 사용된다. 아래 코드를 참고 해보자.
💬 테스트 해보기
테스트 환경은 Spring boot v3.2.3 이며, JDK17 을 사용했다. Spring MVC 기능 사용을 위해 Dependency는 Spring Web을 추가했다.
아래 예시 코드를 봐보자. 요청은 본문에 JSON 형식으로 보낼 것이다.
[ RequestDto.java ]
@Getter
@ToString
public class RequestDto {
private String name;
private String age;
}
- 요청 JSON 데이터와 매핑될 DTO이다. RequestDto 객체의 필드 값을 보기 좋게 출력하기 위해 @ToString 어노테이션을 사용했다. lombok 에서 제공하는 기능이다.
[ Controller.java ]
@RestController
public class Controller {
@PostMapping("/request")
public String example(@RequestBody RequestDto requestDto) {
System.out.println(requestDto.toString());
return "OK";
}
}
- @RequestBody로 요청받은 정보를 RequestDto 클래스와 매핑하는 코드이다.
스프링 부트를 실행하고, 포스트맨(Postman)을 사용하여 API 테스트 해봤다. 아래와 같이 결과가 잘 나오는 것을 확인할 수 있다.
✔️ 누가 객체를 만들어주나
@Getter
@ToString
public class RequestDto {
private String name;
private String age;
}
우리가 테스트에 이용했던 RequestDto 코드 이다. 여기엔 내가 @Getter만 선언 해두었다. 대체 어떻게 스프링은 RequestDto 객체에 값을 할당하고 객체를 생성할 수 있었던 것일까?
스프링은 내부적으로 Jackson 라이브러리 즉, ObjectMapper를 이용하여 JSON -> POJO(Plain Old Java Object)로 역직렬화(Deserialize)를 하게된다.
처음 프로젝트를 생성할 때 추가했던 spring-boot-starter-web 안에 Jackson 라이브러리가 포함되어있는 것을 볼 수 있다.
데이터 바인딩에 관련된 자세한 내용은 아래 공식 github에서 확인 가능하다.
GitHub - FasterXML/jackson-databind: General data-binding package for Jackson (2.x): works on streaming API (core) implementatio
General data-binding package for Jackson (2.x): works on streaming API (core) implementation(s) - FasterXML/jackson-databind
github.com
참고
@RequestBody 학습
@RequestBody 바인딩 시, 기본 생성자의 변덕과 필요한 이유
https://chordplaylist.tistory.com/180#%EC%--%AC%EA%B-%B-%EC%-D%--%--%EB%B-%-C%EB%-B%A-