@RequestBody 이용 시의 객체 매핑

고범수·2023년 7월 31일
3

Spring Boot

목록 보기
5/12


위와 같이 @RequestBody 어노테이션을 사용하여 객체를 매핑하는 경우, Jackson 라이브러리를 사용하여 매핑된다. 이 때, 매핑되는 클래스(DemoDto)는 각 필드에 대응하는 Getter, Setter가 있어야 하는 것으로 알고 있었다.

그러나 최근 프로젝트를 진행하면서 Getter만 있어도 매핑에는 문제없다는 사실을 알게 되었다. 즉, 다음과 같은 객체도 매핑이 된다는 사실이다.


위 처럼 요청을 보냈더니, 아래 결과처럼 Getter가 존재하는 name 필드만 값이 설정되었다.

그렇다면 이제 여러 경우를 테스트하며 살펴보도록 하자.

다음과 같이 각 두 필드에 Setter, Getter를 설정하면 어떻게 될까?



위와 같이 매핑이 올바르게 되는 것을 확인 할 수 있다. 즉, Getter나 Setter 둘 중 어느 하나만 존재해도 된다는 말이다.

Getter와 Setter가 모두 없는 경우



값이 매핑 되지 않은 것을 확인 할 수 있다. 그 이유는 Jackson 라이브러리가 프로퍼티를 기반으로 매핑하기 때문이다. 다시말해, 필드가 아니라 getXXX, setXXX 메소드를 찾아서 매핑한다.

Getter 혹은 Setter가 프로퍼티 형식을 지키지 않는 경우

아래의 DemoDto 클래스는 address의 Setter 이름이 setSomething으로 필드명과 맞지 않다. 이런 경우는 매핑이 어떻게 될까?

이제 아래 형식으로 요청을 보내보자.

요청의 결과는 아래 이미지에서 확인할 수 있듯, address는 매핑이 되지 않는다.

그렇다면 요청 형식을 아래 이미지처럼 한다면 어떻게 될까?

다음과 같이 address에 값이 설정 되는 것을 확인 할 수 있다. 다만, 의도한 동작이 아니다.

정리

  • @RequestBody 어노테이션 사용시 기본적으로 Jackson 라이브러리가 사용된다
  • Jackson은 필드가 아닌 setXXX, getXXX 메소드를 찾아서 매핑한다
  • 매핑 시 Getter 혹은 Setter 둘 중 하나만 있어도 매핑이 된다
  • 기본 생성자는 필수다

2개의 댓글

comment-user-thumbnail
2023년 7월 31일

좋은 정보 얻어갑니다, 감사합니다.

1개의 답글