SH380 Logo
2025-08-19

SQL 기반 검색에서 LazyInitializationException 발생 문제

#SQL#Troubleshooting

문제 원인

failed to lazily initialize a collection of role: com.project.moyora.app.domain.Board.subTags: could not initialize proxy - no Session

해결 방법

  1. @Transactional 사용
    • Service 레이어에서 트랜잭션을 열어 컬렉션 접근 시 Lazy 로딩 가능.
  2. JPQL Fetch Join
    • Repository 쿼리에서 LEFT JOIN FETCH b.subTags를 사용해 미리 데이터 로딩.
  3. DTO Projection
    • 엔티티를 직접 반환하지 않고 필요한 컬렉션까지 포함한 DTO를 Repository에서 바로 조회.
  4. Hibernate.initialize()
    • 강제로 컬렉션 초기화.
  5. EAGER Fetch
    • 엔티티 매핑 시 @OneToMany(fetch = FetchType.EAGER) 사용.

---> Repository에서 Fetch Join + Service에서 DTO 변환

@Query("""
    SELECT DISTINCT b FROM Board b
    LEFT JOIN FETCH b.subTags st
    WHERE (:keyword IS NULL OR LOWER(b.title) LIKE LOWER(CONCAT('%', :keyword, '%')))
    AND (:interestTags IS NULL OR st IN :interestTags)
    AND (:meetType IS NULL OR b.meetType = :meetType)
    AND (:meetDetail IS NULL OR b.meetDetail = :meetDetail)
""")
List<Board> searchBoardsWithUserTags(...);

이유

목록으로 돌아가기