Spring
@RequestBody의 원리와 RequestDto 만드는 법
김예나
2025. 2. 13. 23:23
@RequestBody
- HTTP 요청의 본문(payload) 데이터를 Java 객체로 매핑해줌
- JSON 데이터를 DTO 객체로 변환
위와 같이 요청을 JSON 데이터를 요청 보내면 아래의 객체로 매핑됨!
@PostMapping("/signup")
public ResponseEntity<SignupResponseDto> signUp(@Valid @RequestBody SignupRequestDto requestDto){
SignupResponseDto signupResponseDto = authService.signUp(requestDto);
return new ResponseEntity<>(signupResponseDto, HttpStatus.CREATED);
}
동작 원리
1. HttpMessageConverter
- Spring이 HttpMessageConverter를 사용하여 HTTP의 Body를 읽어옴!
2. Jackson은 객체를 생성하기 위해 기본 생성자를 사용
- Jackson : JSON 데이터를 Java 객체로 변환하는 라이브러리
- HttpMessageConverter가 Jackson 라이브러리를 사용하여 JSON 데이터를 Java 객체로 변환
3. 기본생성자로 Dto 객체를 생성한 후에 필드값들은 NULL로 정의되어 있음
4. 리플렉션을 통해서 객체 값 세팅
- Dto의 내부 필드는 private이지만 리플렉션(reflection)을 통해 객체.필드값 = Http Body와 매칭할 값 으로 필드값을 세팅
리플렉션(Reflection)
- Java의 클래스, 메서드, 필드, 생성자 등의 정보를 실행 중(runtime)에 동적으로 탐색하고 조작할 수 있는 기능
- 캡슐화(private, protected) 필드나 메서드에도 접근이 가능!
-> 그러므로 RequestDto는 기본생성자를 사용하고, 필드에는 final을 붙일 필요가 없음!
이렇게 작성하면 된다!
@Getter
public class SignupRequestDto {
private String name;
private String email;
private String password;
}
하지만 필드를 final로 선언하고 생성자를 따로 만들어도 작동은 됐었다! -> 기본 생성자가 없는 경우 Jackson은 클래스의 파라미터가 있는 생성자를 사용해 객체를 생성 하기 때문이다.
결론 : 그래도 앞으로 요청 Dto를 만들 때는 기본생성자 + final 안쓰기 조합으로 만들자!