지연로딩과 즉시로딩

2021. 1. 20. 15:59JPA/JPA

지연로딩(fetch = FetchType.LAZY)

  • A엔티티가 B엔티티를 참조하고 있다고 하자
  • 지연로딩은 A엔티티를 조회할때 A엔티티 정보만 SELECT하고 B엔티티 정보는 SELECT하지 않다가 B엔티티 정보를 참조할때 B엔티티 정보를 SELECT하는 것.
  • A엔티티를 조회할 시점에 B타입의 프록시를 생성하여 대체.
  • 프록시는 B타입을 상속받아 구현.
  • B엔티티 정보를 조회해야할때 프록시는 영속성 컨텍스트에 초기화 요청을 하면 영속성 컨텍스트가 B엔티티 정보를 DB에 요청하여 받아서 B엔티티를 생성해주고 프록시는 생성된 B엔티티 객체를 참조하여 데이터를 읽어온다.

즉시로딩(fetch = FetchType.EAGER)

  • 즉시로딩은 A엔티티를 조회할때 B엔티티 정보도 같이 조인하여 전부 가져오는 것.

즉시로딩의 주의점

  • 실무에서는 지연로딩으로만 사용해라
  • 즉시로딩을 사용하면 예상치 못한 SQL이 생성된다.
  • 즉시로딩은 JPQL에서 N+1문제를 일으킨다. N+1문제란 A엔티티의 리스트를 조회(1)하게되면 A엔티티 리스트의 수(N)만큼 B엔티티의 SELECT 쿼리가 생성되는 것.
  • @ManyToOne, @OneToOne은 기본이 즉시 로딩
 -> LAZY로 설정
  • @OneToMany, @ManyToMany는 기본이 지연 로딩
  • 즉시로딩을 사용하지 말고 JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해라