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 엔티티가 통째로 필요했고 테스트를 빠르게 만들다보니 이런 실수가 발생했다.