반응형

FetchType.Lazy Error

org.springframework.http.converter.HttpMessageConversionExcepti on: Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]] with root cause 에러 발생.... 

원인 

클래스의 FetchType을 Lazy로 설정하면, 해당 엔티티의 연관된 객체들은 필요할 때까지 로딩 되지 않고 프록시 객체로 대체됩니다. 이 프록시 객체는 실제 객체를 감싸고 있으며, 필요한 시점에 데이터베이스에서 정보를 가져와 초기화됩니다.

하지만 이러한 Lazy로딩은 객체를 직렬화할 때 문제를 일으킬 수 있습니다. 직렬화 과정에서 프록시 객체의 내부 상태를 직렬화하려 할 때, Hibernate는 실제 객체가 아닌 프록시 객체의 상태인 hibernateLazyInitializer를 직렬화하려고 하기 때문에 에러가 발생할 수 있습니다.

해결 방법

1. Eager 로딩으로 변경

FetchType을 Lazy에서 Eager로 변경하여 연관된 엔티티를 로딩할 때 즉시 가져오도록합니다. 이 경우 Seat객체를 가져올 때 figure 객체도 함께 가져와 직렬화할 때 문제가 발생하지 않을 것입니다. 하지만 모든 연관된 객체를 한 번에 가져오기 때문에 성능상 문제가 발생할 수 있습니다. (Eager는 사용 안 하는 걸 추천합니다.!)

2. DTO사용 

객체를 직접 직렬화하기 보다 DTO사용하여 필요한 정보만을 가지고 있는 새로운 객체를 만들고 이를 직렬화합니다. Seat엔티티를 JSON으로 변환하는 대신, Seat 정보와 필요한 figure 정보를 담은 DTO를 만들어 직렬화할 수 있습니다. 이 경우 Lazy로딩을 유지한 상태로 직렬화 문제를 해결할 수 있습니다.

3. @JsonIgnore 사용

저장 성공한 객체를 확인시키기 위해 JSON response를 생성할 때, figure를 제외하고 보내는 방법을 사용하려면 @JsonIgonre 애너테이션을 활용할 수 있습니다. 이를 통해 직렬화 시에 figure필드를 무시하고 JSON으로 변환되지 않도록 설정할 수 있습니다.

 

이렇게 하면 저장된 객체를 JSON으로 반환할 때 figure 필드는 무시되어 반환되지 않습니다. 

이 방법으로 해결했으며 이 방법은 figure 필드를 완전히 제외하고 기타 정보만을 확인하고 싶을 떄 유용하게 사용할 수 있습니다.

728x90