코딩과 결혼합니다

[JPA] 프록시 - 즉시 로딩과 지연 로딩 본문

2세/JPA

[JPA] 프록시 - 즉시 로딩과 지연 로딩

코딩러버 2024. 2. 22. 16:13
728x90
public class Order {

    @Id
    @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "member_id")
    private Member member;
    
    ...
    
}

 

지연 로딩 동작

  • LAZY를 걸어주면 Order를 조회할 때에  Member까지 조인해서 가져오지 않고, proxy 객체로 조회한다.
  • Member를 직접 다루게 될 때에 쿼리가 나가게 된다.
Order order = em.find(Order.class, 1L) //Order --LAZY-- Member(proxy)

Member member = order.getMember();
member.getName(); //실제 member를 사용하는 시점에 초기화(DB조회)

 

🤔 만약 Order와 Member를 자주 사용하게 된다면?

지연로딩을 사용하게 되면 쿼리가 두 개씩 계속 나가게 된다. 이러면 아무래도 성능상의 손해를 보기 때문에 

EAGER(즉시 로딩)을 사용하여 함께 조회할 수 있다.

 

즉시 로딩 동작

  • Order와 Member를 조인하여 한 번에 쿼리를 날린다. / 프록시 사용 x

⁉️ 즉시로딩을 쓸 때 주의할 점

  • 가급적 지연 로딩만 사용
  • 즉시 로딩을 적용하면 예상치 못한 SQL 발생
  • JPQL에서 N + 1 문제를 일으킨다.
  • @xToOne 은 기본이 즉시 로딩이다. ➡️ 지연 로딩으로 설정하기.
  • @xToMany 는 기본이 지연 로딩

 

지연로딩을 사용했을 때에도 N+1 문제가 발생할 수 있지만, 이는 대응할 수 있는 방법이 여러가지 있다.

https://coding-s2-chaewon.tistory.com/252

 

[JPA] 지연 로딩과 조회 성능 최적화(1)

등록이나 수정 등은 데이터 한 건을 다루는 것이기 때문에 거의 성능 문제가 발생하지 않는다. 주로 조회하는 데에 문제가 발생하는데 이번에는 여러 방법으로 데이터를 조회해 보면서 JPA로 성

coding-s2-chaewon.tistory.com

https://coding-s2-chaewon.tistory.com/253

 

[JPA] 지연 로딩과 조회 성능 최적화(2)

https://coding-s2-chaewon.tistory.com/252 [JPA] 지연 로딩과 조회 성능 최적화(1) 등록이나 수정 등은 데이터 한 건을 다루는 것이기 때문에 거의 성능 문제가 발생하지 않는다. 주로 조회하는 데에 문제가

coding-s2-chaewon.tistory.com