상품리스트 api를 만들기 위해 ArrayList에 상품정보와 이미지id리스트를 가공하여 내려주는 로직을 작성하고 있었다.
에러문구는 다음과 같다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException : No serializer found for class com.jnjlabs.amiparure.product.dto.ProductDto$ListRes and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.jnjlabs.amiparure.common.response.Response["data"]->java.util.ArrayList[0])
번역해보니 ArrayList에 넣은 리스펀스DTO의 직렬변환기가 없다는 내용이다.
이해가 좀 어려워 에러문구 그대로 구글링해보니 StackOverflow에 게시글이 하나있었다.
코드는 많이 다른 구조지만 나랑 비슷한 에러문구에 어려움을 겪고있는 게시글의 답변이다.
번역해보면 ObjactMapper는 Public이거나 Getter/Setter가 있는 Class에만 동작한다고 한다.
나또한 Jackson으로부터 에러문구가 발생되었고, StackOverflow에서는 Jackson의 Class인 ObjectMapper에서의 문제라고 하는것으로 보아 맞는것같다.
그래서 ObjectMapper의 역할부터 찾아보았다.
(출처 : https://www.tutorialspoint.com/jackson/jackson_objectmapper.htm)
Json을 커스텀해주는 Class라고 이해하면 될것같다.
오피셜은 구글링해보아도 찾을 수 없었지만 추측은 해보았는데 과거 직장에서 Angular1.x로 개발에 1년정도 참여해본 경험이있는데 HttpEntity를 이용하여 내려주었고 Response들은 항상 Json상태였다.
그래서 내 코드와 비교해보면 ResponseEntity가 Json으로 변환을 위해 Jackson.ObjectMapper를 이용해 변환을 해보려했지만 내가 ArrayList에 넣은 DTO는 Getter속성이 없기때문에 ArrayList[0]에서부터 문제가 발생했다는 가설이 완성된다.
실제로 DTO에 @Getter 어노테이션을 넣어주니 해결되었다.
지금까지는 Entity에 @Getter 어노테이션을 달아놓고 있었기에 알지못했던 요소였다.
오피셜을 찾는데 2일정도 소모하였지만 코드도 문서도 찾을 수 없어 아쉽지만 여기서 마무리하고 마저 개발을 이어가기로했다.