프록시, 즉시 로딩과 지연 로딩

김지윤·2023년 3월 15일
0

JPA

목록 보기
1/4
  • 프록시는 실제 객체 클래스를 상속받아 만들어져있다.
  • 프록시는 객체를 참조한 값을 가지고 있는 클래스이다.
  • 프록시는 DB에서 직접 값을 가져오지 않는다.

프록시가 어떻게 값을 가져올까?
1. getReference()를 호출하면, 영속성 컨텍스트가 일을 한다.
2. 영속성 컨텍스트는 DB에서 값을 조회하여 객체를 새로 생성한다.
3. 프록시는 이 생성된 객체를 그때 참조하는 것이다.


  • 프록시는 처음에 한번만 초기화 된다.

  • 이후, 계속 DB에 접근해 값을 가져오지 않아도 되기 때문에 효율적이다.

  • 프록시의 타입을 알고 싶을 땐, instance of를 활용한다.




프록시를 이용한 지연 로딩


연관관계 주인인 객체를 조회하면 관계 되어있는 다른 객체들까지 모두 한꺼번에 조회가 된다. -> 이것은 낭비를 초래한다. (fetch = FetchType.LAZY)을 이용하면 로딩을 **지연**시켜 필요없는 객체를 나중에 불러올 수 있다.



실무에서는 지연 로딩을 사용해야 한다.

  • 실무에서는 테이블이 많기 때문에 너무 많은 것들이 같이 조회되기 때문이다.
  • JPQL에서 n+1 문제를 일으킨다.
  • 해결법 : 전부 지연 로딩으로 세팅을 하고, 필요한 경우에만 petch join을 이용한다.

기본 세팅

  • @OneToMany 는 지연로딩이 기본 세팅되어 있다.
  • @ManyToOne, @OneToOne은 즉시로딩이 기본 세팅되어 있다. ( -> 지연로딩으로 바꿔주자)
profile
꾸준하게 공부하고 기록하는 개발자

0개의 댓글