[Spring] JPA LazyInitializationException 해결 방법

김진서·2024년 9월 26일
0

Spring MVC

목록 보기
9/9
post-thumbnail

1. @Transactional

  • LazyInitializationException이 발생하는 주요 원인은 JPA에서 관리하는 세션이 종료 된 후(정확하게는 persistence context가 종료 된 후) 관계가 설정된 엔티티를 참조하려고 할 때 발생.
  • 이것에서 착안해 DAO레이어(Spring data에서 Repository) 상위에서 세션을 시작해 DAO 계층 밖에서도 세션이 종료되지 않도록 트랜잭션을 거는 방법.

2. @EntityGraph

  • EntityGraph 어노테이션 사용.
  • 간단하고 쉬움.
@Entity
public class User {

    @Id
    ...

    @OneToMany(fetch = FetchType.LAZY)
    private List<Order> orders;
}

...

public interface UserRepository extends JpaRepository<User, Long> {
    
    // 불러올 데이터의 변수명을 설정해준다. 배열로 한번에 여러 값을 설정 할 수 있다.
    @EntityGraph(attributePaths = { "orders" })
    Optional<List<User>> fetchUsers();
}
...

public List<User> getUsers {
    var user = this.userRepository.findByUsername(username);

    // @EntityGraph 없다면 orders를 불러 올 수 없어 LazyInitializationException 이 발생한다.
    var orders = users.getOrders();
    ...
    return users;
}
profile
PAy IT forwaRD를 실천하는 프론트엔드 개발자. 근데 이제 백엔드를 곁들인..

0개의 댓글