[trouble shooting] InvalidDefinitionException: Cannot construct instance of "DTO"(no Creators, like default constructor, exist): cannot deserialize from Object value
2023. 1. 12. 22:07ㆍBACKEND/TROUBLE SHOOTING
문제
@AllArgsConstructor를 사용해 모든 필드를 받는 생성자를 사용했는데도 Postman으로 테스트 시 에러가 남
해결
DTO에 @NoArgsConstructor을 추가
설명
Serialize(직렬화) : 객체의 상태를 바이트 스트림으로 변환
Deserialize(역직렬화) : 바이트 스트림을 객체 형태로 변환
POST 요청에서 에러가 발생했는데, 기본 생성자가 없어서 역직렬화 실패라고 한다. Controller단에서 @RequestBody가 설정되어 Json에서 DTO Object로 변환이 필요한 경우 에러가 발생하는 것 같다. @RestController에서 @RequestBody를 바인딩하기 위해 ObjectMapper를 사용하는데 기본 생성자로 DTO를 생성한다. 그렇기 때문에 @NoArgsConstructor가 있어야 한다.
참고자료
@RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까? #2 (velog.io)
자바 직렬화, 그것이 알고싶다. 훑어보기편 | 우아한형제들 기술블로그 (woowahan.com)
@Request Body에서는 Setter가 필요없다? (tistory.com)