[오류/해결] JsonMappingException: failed to lazily initialize a collection of role:

이신영·2024년 11월 14일
0

오류 모음집

목록 보기
25/25
post-thumbnail

프로젝트 중 DTO의 필드를 지연로딩으로 설정했지만 해당 필드가 초기화되지 않은 상태에서 Jackson이 이를 직렬화 시도할 때 발생한 문제다.

public class Post {

...

    @ElementCollection  // 이미지 파일 이름을 리스트로 저장
    private List<String> imageNames = new ArrayList<>();
    
...

해결

    @Query("SELECT p FROM Post p LEFT JOIN FETCH p.imageNames WHERE p.id = :id")
    Post findByIdWithImages(@Param("id") Long id);

    // JPQL로 모든 게시글 조회 시 imageNames를 함께 로드하는 쿼리
    @Query("SELECT DISTINCT p FROM Post p LEFT JOIN FETCH p.imageNames ORDER BY p.createdAt DESC")
    List<Post> findAllWithImagesOrderByCreatedAtDesc();

JOIN FETCH를 활용해서 Lazy 필드를 강제로 초기화했다.

EAGER 쓰면안됨? 할 수 있는데 필드가 항상 로드가 되기때문에 분명히 성능문제가 발생할 수 있어서 다른 방법을 찾은게 저 JOIN FETCH이다.

profile
후회하지 않는 사람이 되자 🔥

0개의 댓글