프로젝트를 진행하던 중, 기본 구조들을 만들어놓고 잘 돌아가는지 확인을 위해
실행을 시켰는데 아래와 같은 에러가 나왔다!
자세히 보면 아래와 같다.
2023-01-10 23:08:20.969 WARN 31776 --- [Test worker] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of
com.yata.backend.domain.yata.dto.YataRequestDto$InvitationPost
(although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance ofcom.yata.backend.domain.yata.dto.YataRequestDto$InvitationPost
(although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]]
위의 에러 코드를 읽어보면,
하나 이상의 creator가 존재하지만 object 값에서 역직렬화를 할 수 없다 ..?
이게 무슨 말인가 싶으니 바로 구글링 ,,
원인은 jackson library가 빈 생성자가 없는 모델을 생성하는 방법을 모르기 때문에
Entity의 클래스 레벨에 따로 빈 생성자를 추가해주어야한다고 한다!
전에는 빈 생성자 안만들면 Entity에서 빨간 줄로 에러났다고 보여줬었는데 뭐쥐 ?
그래서 Entity의 클래스 레벨에 @NoArgsConstructor
를 추가해주었더니
에러 해결 완 ~
참고로 @NoArgsConstructor
와 @AllArgsConstructor
를 동시에 쓸 경우에
@AllArgsConstructor
를 먼저 쓰고 그 밑에 @NoArgsConstructor
를 써주어야 한다.
어떤 생성자를 먼저 만드냐에 따라 에러의 유무를 결정할 수 있으니 주의하기 !!
⚠️ 그런데
@AllArgsConstructor
와@RequiredArgsConstructor
는 사용하지 않는 게 좋다고 한다.
⠀
이 애너테이션을 붙여 생성자들이 만들어진 이후에 필드 순서를 바꾸게 되면,
이 리팩토링이 작동하지 않고 lombok이 개발자도 인식하지 못하는 사이에 생성자의 파라미터 순서를 필드 선언 순서에 맞춰 원래대로 바꾼다고 한다!
⠀
만약 이 순서를 바꿨던 두 필드가 동일한 Type이라면,
애플리케이션 실행 시 에러는 나지 않지만 값이 바뀌어 들어가기 때문에 주의해야한다.
⠀
[ 참고 ] https://kwonnam.pe.kr/wiki/java/lombok/pitfall