즉시 로딩(Eager)와 지연 로딩(Lazy)

Soyun_p·2025년 4월 10일
0

📖 지식

목록 보기
8/10
post-thumbnail

같이 읽기 좋은 글 :
프록시(Proxy)
Fetch Join (패치 조인) 이란? (w/ N+1 문제)

즉시 로딩

  • 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다
  • @ManyToOne(fetch = FetchType.EAGER)

지연 로딩

  • 연관된 엔티티를 실제 사용할 때 조회한다
  • @ManyToOne(fetch = FetchType.LAZY)

🪼 즉시 로딩

연관된 엔티티를 즉시 조회한다. 하이버네이트는 가능하면 SQL 조인을 사용해서 한번에 조회한다

@Entity
public class Member{
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "TEAM_ID")
	private Team team
}
Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); //객체 그래프 탐색
  • 이때 회원과 팀 두 테이블을 조회해야 하므로 쿼리를 2번 실행할 것 같지만, JPA 구현체는 즉시 로딩을 최적화하기 위해서 가능하면 조인 쿼리를 사용한다

🪼 지연 로딩

연관된 엔티티를 프록시로 조회한다. 프록시를 실제 사용할 때 초기화하면서 데이터베이스를 조회한다

@Entity
public class Member{
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "TEAM_ID")
	private Team team
}
Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); //객체 그래프 탐색
team.getName(); //팀 객체 실제 사용
  • em.find(Member.class, “member1”) 호출하면 회원만 조회하고 팀은 조회하지 않는다
  • 대신 회원의 team 멤버변수에 프록시 객체를 넣어둔다
  • 이 프록시 객체는 실제 사용될 때까지 데이터 로딩을 미룬다 ⇒ 지연로딩이라 불리는 이유

📌 JPA 기본 패치 전략

fetch 속성의 기본 설정값

  • @ManyToOne, @OneToOne : 즉시 로딩
  • @OneToMany, @ManyToMany : 지연 로딩

추천하는 방법 : 모든 연관관계에 지연로딩을 사용하자 ⇒ 개발이 어느정도 완료단계에 왔을 때 실제 사용하는 상황을 보고 꼭 필요한 곳에만 즉시 로딩을 사용하도록 최적화하자

📌 컬렉션에 FetchType.EAGER 사용 시 주의점

  • 컬렉션을 하나 이상 즉시 로딩하는 것은 권장하지 않는다
  • 컬렉션 즉시 로딩은 항상 외부 조인(Outer Join)을 사용한다

출처: 자바 ORM 표준 JPA 프로그래밍 (김영한)

0개의 댓글