[SpringBoot] @RequestBody binding 이해하기 (기본 생성자와 @Setter)

해니·2023년 12월 13일
0

SpringBoot

목록 보기
5/24
post-thumbnail

@RequestBody

  • 클라이언트가 전송하는 HTTP 요청 본문(JSON, XML 등)을 Java 객체로 변환하는 역할을 한다.

@RequestBody 바인딩 과정

  • @RequestBody로 받는 데이터는 Spring에서 관리하는 MessageConverter들 중 하나인 MappingJackson2HttpMessageConverter를 통해 Java 객체로 변환되는데, 이는 ObjectMapper 라는 클래스를 사용한다.
  • ObjectMapper는 Json 메세지를 자바 객체로 변환하는 과정에서 객체의 기본 생성자를 통해 객체를 생성하고, 내부적으로 Reflection을 사용한다.
    • ObjectMapper를 통해 JSON 값을 Java 객체로 역직렬화한다.
    • 역직렬화란 생성자를 거치지 않고 리플렉션을 통해 객체를 구성하는 매커니즘이다.
    • 직렬화 가능한 클래스들은 기본 생성자가 항상 필수이다.
  • 기본 생성자 + @Getter로 클래스를 구현해주면 @Setter가 없어도 값이 바인딩된다.



기본 생성자 없이 정상 동작이 된다?


@Getter
@ToString
@EqualsAndHashCode
public class ReqDto {
	...
}

사내 프로젝트에서 사용하는 DTO에는 기본 생성자가 없어서 관련 내용을 더 찾아봤다..🫨



ParameterNamesModule

  • 'org.springframework.boot:spring-boot-starter-web'를 gradle에 추가하면 com.fasterxml.jackson.module:jackson-module-parameter-names도 자동으로 추가한다. ⭐️⭐️⭐️
  • com.fasterxml.jackson.module:jackson-module-parameter-names 모듈안의 ParameterNamesModule클래스가 JsonCreator를 사용해 기본 생성자가 없는 객체도 역직렬화가 가능하게 설정해준다.



⛔️ 아래처럼 해당 모듈을 제거하면, 기본 생성자 없이 역직렬화가 수행되지 않는다.

dependencies {
    implementation ('org.springframework.boot:spring-boot-starter-web'){
        exclude group: 'com.fasterxml.jackson.module', module: 'jackson-module-parameter-names'
    }
}






출처

[Spring] @RequestBody vs @ModelAttribute

[Spring] @RequestBody, @ModelAttribute, @RequestParam의 차이
@ModelAttribute을 setter 없이 사용할 수 있는 이유
@RequestBody는 왜 Setter가 없어도 작동할까?
인프런-PostCreate 기본 생성자 문제 질문
[Spring] 2. jackson을 이용한 data binding 이해하기(생성자, constructor)
@RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까? #1
Spring에서의 직렬화

profile
💻 ⚾️ 🐻

0개의 댓글