티스토리 뷰

해당 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의를 수강하고 정리한 게시글입니다.

즉시 로딩과 지연 로딩

Member와 Team의 연관관계

여기서 의문 : 단순히 member 정보만 사용하는 비즈니스 로직인데, Member를 조회할 때 Team도 함께 조회해야 할까?
예시) println(member.getName());

- 지연 로딩

: Member와 Team에서 Team을 거의 사용하지 않을 때

- [지연 로딩(LAZY)을 사용해서 프록시로 조회]

Member member = em.find(Member.class, 1L);

실제 Team을 사용하는 시점에 DB에서 조회해서 초기화됨

Team team = member.getTeam();  
team.getName(); // 실제 team을 사용하는 시점에 초기화(DB 조회)

즉시 로딩

: Member와 Team을 자주 함께 사용할 때

- [즉시 로딩(EAGER), Member조회시 항상 Team도 조회]

JPA 구현체는 가능하면 조인을 사용해서 SQL 한번에 함께 조회

프록시와 즉시로딩 주의

  • 가급적 지연 로딩만 사용(특히 실무에서)
  • 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
  • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
    (N+1 문제 : 쿼리 하나를 날렸는데 추가로 N개의 쿼리가 나가는 것)
    객체 하나를 가져오는데 EAGER가 붙은 모든 객체에 쿼리를 날림
    select * from Member, select * from Team …
  • @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정
  • @OneToMany, @ManyToMany는 기본이 지연 로딩

LAZY로 다만들고 같이 가져와야할 때는 join fetch를 JPQL로 사용하면 됨, 어노테이션으로 해결하는 방법 등도 있음

지연 로딩 활용(이론적)

  • Member와 Team은 자주 함께 사용 -> 즉시 로딩
  • Member와 Order는 가끔 사용 -> 지연 로딩
  • Order와 Product는 자주 함께 사용 -> 즉시 로딩

    (실무에서는 전부 지연로딩으로 발라야함)

지연로딩 활용 - 실무

  • 모든 연관관계에 지연로딩을 사용해라!
  • 실무에서 즉시 로딩을 사용하지 마라
  • JPQL fetch 조인이나, 엔티티 그래프 기능을 사용해라!
  • 즉시 로딩은 상상하지 못한 쿼리가 나간다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함