프로젝트 중 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이다.