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

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]\n\tat org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:489)\n\tat org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:114)\n\tat

 

이런 애라가 나오는데 직렬화 문제가 발생해서 이다.

 

Orm 객체를 생성할때

@ManyToOne(fetch = FetchType.LAZY)

 

이렇게 Lazy를 걸어줬는데 말이 어렵지만, 그냥 중요하지 않다고 판단되는 애들은

천천히 로딩하고, 중요한 애들먼저 하라는 의미인데

 

필자는 일발전으로 조인 객체를 부를때 넣어둔다. 

상황에 따라 다르지만, 일반적으로 FK로 설정해둔 엔티티들을 모두 중요하게 쓰는 경우가 아니기 때문인데

 

스프링에서는 이를 조회방식에 따라 구분할 수 있다.

 

흔히 말하는 Eager Loding은 한번에 조인해서 때려불러오는데

이러면 조인하는 객체가 크거나 조인- 조인 - 조인 이렇게 깊게 들어가지는 경우 성능이 떨어지는 경우가 발생한다.

 

그래서 타객체를 타지 않는 경우에는 LazyLoding을 넣는다.

 

근데 문제는 이것이 계속 타고 select를 하기 시작하면 Json 객체로변환하는 과정중

충돌이 발생하게 되서 위에 오류가 발생하게 되는데 

 

이럴때는 여러방법이있다.

 

일단 필자는 연결된 외부 객체는 필요없어서 

 

@JsonIgnore

 

어노테이션을 붙여서 더 부르지 말것을 명령했고 

 

만약

 

양뱡향 연결이 필요하면

 

@JsonManagedReference와 @JsonBackReference를 사용하여 순환 참조를 해결할 수 있다.