+ 질문
조회 API를 생성하여 실행해보연 오류가 발생합니다.
디버그 모드로 엔티티에 데이터가 정상 조회된 것을 확인하였습니다.
다만 리턴하는 시점에 오류 발생합니다.
Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
+ 답변
이 오류는 Enitity 내부에서 또다른 Enitity를 멤버변수로 가지고 있고, 이 항목이 FetchType.LAZY으로 설정되어 있는 경우 발생합니다.해결방법부터 말씀 드리면 아래 방법이 있습니다.
1.Entity 자체를 리턴하지 않고 DTO 객체로 리턴한다
2,fetch = FetchType.EAGER 로 설정한다. (비추)
3.외부에 보여줄 데이터가 아니라면 @JsonIgnore 처리 한다.
4.application.properties or yml에 환경설정을 한다. (매우 비추)
가장 권장되는 방법은 1번 DTO 객체로 반환입니다. 3번 JsonIgnore은 상황에 따라 사용할 수 있습니다.원인은
JPA가 데이터를 조회해 올 때 필요한 데이터만 조회해오는 지연로딩 방식을 사용하기 때문입니다.
예를 들어 Comment 엔티티 안에 User 엔티티가 존재한다면, JPA는 1차적으로 Comment 엔티티만 가져옵니다.
User 엔티티는 프록시객체로 내부에는 값을 들고 있지 않습니다. 이 시점에 User를 Serialize를 하면 위와 같은 오류가 발생하게 됩니다.아래 글 읽어보시기 바랍니다.
[JPA] FetchType.Lazy으로 인한 Jackson Serialize 에러