[JPA] 즉시로딩, 지연로딩

19·2022년 10월 17일
0

JPA

목록 보기
12/18
post-custom-banner

EX) Member를 조회할 때, Team도 함께 조회해야 할까?
-> 단순히 member 정보만 사용하는 거라면, Member만 조회하는 것이 좋다.
Team도 함께 조회하는 것은 효율이 떨어지며 낭비!
그래서 JPA는 '지연로딩' 옵션을 제공한다.

그럼 Member를 조회할 때, Team도 함께 조회해야 한다면?
JPA '즉시로딩' 옵션을 사용한다.


지연로딩 (LAZY)

public class Member {
    ...
    @ManyToOne(fetch = FetchType.LAZY)  // 지연로딩 설정
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    ...
}
  • Team은 프록시 객체로 조회된다.
    • 실제로 Team의 속성을 사용하는 시점에 프록시 객체를 DB에서 가져오면서 초기화

-> 연관된 객체를 프록시로 가져오는 것!

  • 지연로딩으로 설정되어있으면 프록시 객체를 넣어둔다 (Team)
  • 실제 team을 사용하는 시점에 초기화된다 (DB로 쿼리가 날라감)

즉시로딩 (EAGER)

public class Member {
    ...
    @ManyToOne(fetch = FetchType.EAGER)  // 즉시로딩 설정
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    ...
}
  • 지연로딩과 다르게 Team은 진짜 객체로 조회된다.
    • 프록시 사용 x

  • Member 조회 시, 항상 Team도 함께 조회한다.

주의할 점!!

  • 실무에선 즉시로딩을 사용하면 안된다.
    • 예상치 못한 SQL이 발생한다. (연관된 모든 테이블을 Join 해버린다 -> 성능저하)
    • JPQL에서 N+1 문제가 발생할 위험성이 있다.
      • 최초 쿼리 1개가 나갔는데, 이 쿼리 때문에 추가 쿼리 N개가 나간다는 의미
  • 가급적 지연로딩만 사용한다.

@ManyToOne, @OneToOne은 기본이 즉시로딩이기 때문에 -> 지연로딩으로 변경해야 한다
@OneToMany, @ManyToMany는 기본이 지연로딩이기 때문에 변경안해도 된다



참고

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 김영한

profile
하나씩 차근차근
post-custom-banner

0개의 댓글