1. 프록시의 특징

  • 프록시 객체는 처음 사용할 때 한 번만 초기화한다!!
  • 프록시 객체는 원본 엔티티를 상속받기 때문에 instance of를 사용해서 타입체크를 해야한다.(== 사용X) ```java Member m1 = em.find(Member.class, member1.getId()); Member m2 = em.getReference(Member.class, member2.getId());

return m1.getClass() == m2.getClass() //false return m1 instanceof Member //true return m2 instanceof Member //true

- 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티 반환
```java
Member refMember = em.getReference(Member.class, member1.getId());
Member findMember = em.find(Member.class, member1.getId());

return refMember == findMember // true

2. 즉시로딩과 지연로딩

  • 지연로딩 : (fetch = FetchType.LAZY)
    • 사용하는 이유는 Member와 Team이 조인이 되어있는데 Member조회 시 Member만 조회하고 Team을 조회 시 그때 Team을 조회하도록 성능상 이점을 주기 위해 쓴다. 즉, 실제로 team을 사용하는 시점에서 초기화를 한다.
  • 즉시로딩 : (fetch = FetchType.EAGER)
    • Member조회 시 Team도 계속 같이 조회한다.
    • N+1문제를 일으킨다.

실무에서는 가급적 지연로딩만 사용!!!!

  • 즉시 로딩은 N+1문제를 일으킨다. (@ManyToOne, @OneToOne 이 default가 즉시로딩이니 Lazy로 설정해야한다.)
  • N+1 문제를 해결하기 위한 방법 : 모든걸 지연로딩으로 바꿔주고, 패치조인을 쓴다. 다른 방법들도 있는데 그것은 다른 게시글에 쓰겠다.

JPA(Java Persistence API)에서의 프록시(Proxy)는 영속성(Persistence) 컨텍스트(Persistence Context)에서 엔티티(Entity)를 지연 로딩(Lazy Loading)하는 기술이다. JPA에서의 프록시는 지연 로딩을 위해 사용되는 객체로, 필요한 시점에 데이터를 가져오는 것을 통해 성능을 개선할 수 있다.

3. 영속성 전이 : cascade

  • 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장

  • 종류
    • ALL : 모두 적용(저장, 삭제)
    • PERSIST : 영속(저장)
    • 등등…
  • 예시
    • @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)

본 포스팅은 김영한 선생님의 강의를 보고 정리한 글입니다.

Comments