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 필드를 완전히 제외하고 기타 정보만을 확인하고 싶을 떄 유용하게 사용할 수 있습니다.
'알쓸I잡(알면 쓸모있는 IT 잡학사전)' 카테고리의 다른 글
NoSQL과 RDBS (0) | 2024.01.09 |
---|---|
Error resolving template api/boards template might (0) | 2023.12.28 |
The requested URL returned error: 403 (0) | 2023.12.27 |