@RequestBody 에 mapping될 object가 no-argument constructor 를 필요로 하는 이유

LSM ·2022년 1월 8일
1

1. 문제 발생 배경

@RequestBody에 maping될 dto를 형성하여 jakson 라이브러리로 json형식의 Request를 자바 객체로 변환시키면서 발생한 이슈를 정리하겠다.
결론만 먼저 이야기 하자면, @RequestBody에 maping될 dto class에는 no-argument constructor 를 필요로 하다는 것을 알게되었다.

* Error code
No suitable constructor found for type [simple type, class 클래스명]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)

2. @RequestBody,@Response Body 분석

문제의 원인을 파악하기 위해, 먼저 해당 어노테이션의 동작 원리에 대해 좀더 알아볼 필요가 있다고 생각하여 이에 대해 찾아보고 정리하겠다.

사용목적)

웹페이지에서 json으로 request한 파라미터들을 java에서 받으려면 java object로의 변환이 필요하며
마찬가지로 response 시에도 java object에서 json으로 변환이 필요하다.
이러한 작업들을 해주는 어노테이션이 바로 @RequestBody 와 @ResponseBody 이다

@RequestBody :

  • HTTP body안에 JSON을 VO(value obejct)에 맵핑하는 스프링 어노테이션

@ResponseBody :

  • VO 객체를 JSON으로 바꿔서 HTTP body에 담는 스프링 어노테이션.

HTTP란?

  • 데이터를 주고 받기 위한 프로토콜
  • 아래의 사진과 같은 모양으로 HTTP body 부분에 XML 또는 JSON이 들어갈 수 있다.
  • HTTP의 header값을 확인하기 위해서 HttpEntity나 @RequestHeader를 사용
  • HTTP의 Body를 쉽게 접근하기 위한 어노테이션이 바로 @RequestBody 와 @ResponseBody

실행 과정)

HTTP 요청이 오면 Spring은 messageConverter들 중에서 HTTP REQUEST의 ContentType으로 읽을 수 있는 컨버터를 찾고, 해당 컨버터로 body를 읽는 메서드를 호출해 저장하는 과정이 포함되어 있다. 프로젝트에서는 HTTP body로 JSON을 요청하므로 MappingJackson2HttpMessageConverter가 Body를 읽는다. Jackson 라이브러리는 body를 읽기 위해 ObjectMapper를 사용한다.Object Mapper가 body를 읽는 메서드를 파고 들어가보면 기본 생성자로 DTO를 생성하는 것을 알 수 있다. 따라서 기본 생성자가 없는 DTO일시, object mapper가 정상적으로 작동하지 않음을 알 수 있다.

3. 결론

Http body를 dto 객체에 Mapping 하기 위해서는 MessageConverter를 사용하는데 Jackson Library를 사용하여 이를 converting 하는게 일반적이다.
Jackson Library는 Object Mapper가 Http body를 읽는 메서드를 실행하고 그 과정에서 DTO의 기본 생성자를 필요로 한다. 따라서 lombok을 사용하는 사람들에게는 @NoArgConstructor를 사용하여 기본 생성자를 만드는 과정이 필요하며, 사용하지 않는 사람들은 직접 기본 생성자를 만들어 줄 필요가 있다.


4. 참고자료

자세한 method Flow는 아래 참고자료를 통해 알 수 있다.

  1. https://velog.io/@conatuseus/RequestBody에-기본-생성자는-왜-필요한가
  2. https://velog.io/@conatuseus/RequestBody에-왜-기본-생정자는-필요하고-Setter는-필요-없을까-2-ejk5siejhh
profile
개발 및 취준 일지

0개의 댓글