본문 바로가기

Development/DB, JPA

Lazy Initialize Exception 방어코드

뷰에 필요한 엔티티를 미리 로딩해줌으로서 지연 로딩 익셉션에 대한 방어를 할 수있다.

1. Global Fetch 전략 수정

가장 간단한 방법으로 글로벌 페치를 fetch = FetchType.EAGER 로 잡아주면 즉시로딩을 하기 때문에 지연 로딩에 대한 문제가 발생하지 않는다.

단점

  • 해당 엔티티가 필요없는 경우에도 무조건 로딩한다.

  • N+1 Problem 발생 가능성


2. JPQL 페치 조인

기존

  //JPQL
    select o from Order o
  //SQL
    select * from order

JPQL 페치 조인 사용

  //JPQL
    select o from Order o join fetch o.orderItem
  //SQL
    select o.*, i.* from Order o join OrderItem i on o.orderItemId = i.orderItemId


3. 강제 초기화

트랜잭션이 살아있는 영역 내에서 필요한 시점에 초기화를 한다.

  @Transactional
  public Order findOrder(){
    //프록시 객체 강제 초기화
    Order order = orderRepostiory.findOne(1L);
    order.getOrderItem().getName();
    
    //또는 하이버네이트 메소드 사용
    Hibernate.initialize(order.getOrderItem());
  }