.InvalidDefinitionException: No serializer found for class ~

시은·2024년 2월 18일
0
post-thumbnail

지연로딩 니가 도대체 뭔데… 😡

얼마전 JPA 강의를 수강 하면서 양방향 매핑을 하지말고, 일단 단방향 매핑으로 엔티티 설계를 해라. 그리고 지연로딩을 사용해라 라는 말을 들은 저는 묵묵히 그를 수행했지만… 다음과 같은 에러를 맞이했습니다. 개발자의 아버지 영한님 이게 무슨 일인가요… 🫠

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 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) (through reference chain: j
ava.util.ArrayList[0]->wanted.assignment.pmsystem.domain.planner.board.dto.responses.BoardDetailResponse["taskDetailResponses"]->
java.util.ArrayList[0]->wanted.assignment.pmsystem.domain.planner.task.domain.Task["taskBox"]->
wanted.assignment.pmsystem.domain.planner.taskBox.domain.TaskBox["board"]->
wanted.assignment.pmsystem.domain.planner.board.domain.Board$HibernateProxy$Q6gL9Sv7["hibernateLazyInitializer"])

일단 문제가 생긴 엔티티를 살펴보았습니다. 아래와 같이 TaskBox(칸반보드의 컬럼 부분) 가 Many, Board 가 One 이므로 매핑도 잘 했고… 뭔가 문제가 없어보였는데요… 😑

@Entity
public class TaskBox {
// ...
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "board_id")
	private Board board;

// ...
}

개발자의 소양 폭풍 구글링을 통해 원인을 찾을 수 있었습니다. 엔티티를 아래와 같이 수정해주니 문제는 해결 되었는데요, 도대체 @JasonIgnore 이 뭐길래 이렇게 쉽게 해결 된걸까요?

@Entity
public class TaskBox {
// ...
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "board_id")
	@JasonIgnore
	private Board board;

// ...
}

FetchType.LAZY 와 JSON 직렬화

제가 마주한 문제는 Hibernate 가 지연 로딩을 처리하는 방식과 Jackson 이 자바 객체를 JSON 으로 직렬화 하는 방식과 관련이 있었습니다. @ManyToOne(fetch = FetchType.LAZY) 를 사용하면 Hibernate 는 접근을 하기전까지 데이터베이스에서 값을 찾아오지 않습니다. 즉 프록시 엔티티로 조회되며, 실제 Board 를 사용하는 시점에 초기화 됩니다(DB 조회). 이는 불필요한 데이터베이스 호출을 방지하고 성능을 향상 시킵니다. 하지만 Jackson 은 이를 지금 직렬화 해야 하는데요 😑 바로 여기서 문제가 발생하는 것 이였습니다.

즉, Jackson 은 프록시를 직렬화 할 수 없기 때문에 위와 같은 오류가 발생합니다. 때문에 @JsonIgnore 를 추가하여 Jackson 이 해당 필드를 무시할 수 있도록 하면 문제는 해결됩니다. 만약 양방향 관계인 경우 양쪽을 직렬화 하면 무한 재귀가 발생할 수 있으므로 이를 추가하면 도움이 됩니다.

로딩에 대해 더 알아보고 싶다면?

즉시로딩과 지연로딩 - 𝙎𝙄𝙀𝙐𝙉𝙉𝙉𝙉'𝙨 𝙊𝘽𝙎𝙄𝘿𝙄𝘼𝙉 🔥 - Obsidian Publish

profile
창의력 대장이 되기 위한 여정

0개의 댓글