No serializer found for class...
테스트 코드를 작성하다가 No serializer found for class ...
에러를 만났다.
JPA 사용하면서 자주하는 실수이기 때문에 정리해보기로 했다.
원인
@Entity
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
. . .
}
위 코드처럼 JPA 연관 관계를 Lazy loading으로 설정한 경우 실제 데이터가 아닌 Hibernate Proxy이므로 오류가 발생한다.
해결
dto를 만들어 리턴하는게 가장 좋은 방법이지만, Hibernate5Module
을 사용하여 해결할 수 있다.
이 모듈은 LazyLoading 설정으로 아직 불러오지 못한 엔티티에 대해서 null 값을 내려주는 모듈이다.
1) 의존성 추가
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
2) 코드
println(jacksonObjectMapper().registerModule(Hibernate5Module())
.writeValueAsString(items))
정리
dto를 만들어 리턴하는게 가장 좋은 해결책이다.
Item 엔티티가 통째로 필요했고 테스트를 빠르게 만들다보니 이런 실수가 발생했다.