JPA [기본] 즉시로딩과 지연로딩

신재원·2023년 1월 28일
0

JPA 기본

목록 보기
18/31

지연로딩

  • 단순히 A객체만 사용하는데 B객체까지 함께 조회하면 성능이 저하됨으로, 지연로딩을 사용한다.
  • @ManyToOne 어노테이션에 fetch 타입을 LAZY 조건으로 설정한다.
  • @ManyToOne(fetch = FetchType.LAZY)
    • 연관된 관계를 프록시 (가짜)로 가져온다.
  • 실제 프록시로 가져온 그 객체를 사용하는 시점 (해당 객체의 메서드를 터치할때) 에 초기화가일어난다. (쿼리가 발생한다)

즉시로딩

  • 대부분 비즈니스 로직에서 A객체와 B객체를 같이 사용할때 사용한다.
  • @ManyToOne 어노테이션에 fetch 타입을 EAGER 조건으로 설정한다.
  • @ManyToOne(fetch = FetchType.EAGER)
  • 한방 쿼리로 다 조회해오고, 프록시 객체가 아니라 실제객체가 조회된다.

프록시와 즉시로딩 주의 (중요)

  • 가급적 지연 로딩만 사용한다 (특히 실무에서는) 즉시로딩 사용 X !!
  • 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
  • 즉시 로딩은 JPQL에서 N+1 (추가쿼리가 발생하는) 문제를 일으킨다
  • @ManyToOne, @OneToOne( X To One)은 기본이 즉시로딩 -> 클라이언트가 LAZY로 변경
  • @OneToMany, @ManyToMany (X To Many)는 기본이 지연로딩이다.
  • JPQL fetch 조인이나, Entity 그래프 기능을 사용하여 로직을 구성한다.

0개의 댓글