[Spring] 즉시로딩 & 지연로딩, 영속성전이, 고아 객체

신범철·2023년 10월 5일
0

스프링부트

목록 보기
21/24

즉시 로딩

  • 내부 참조 객체를 조회 시점에 함께 조회하는 로딩 방법

주의할 점

  • Join이 많이 발생하기 때문에 훨씬 더 많은 쿼리가 실행된다.
  • 즉시 로딩의 경우 내부 조인이 아닌 외부 조인을 사용한다.(회원은 팀이 없을 수 있기 때문에 null값을 허용하기 때문에 외부 조인을 사용한다.)
    • @JoinColumn(nullable = false)를 통해서 내부 조인을 사용해 성능을 향상 시킬 수 있다.
  • JPQL에서 N + 1문제가 발생한다.
    • 앞에서는 em.~~()으로 우리가 PK을 알 수 있는 상황이어서 join이 발생하지만
    • JPQL의 경우 PK를 알 수 없고, 단순히 SQL로 변환되어 실행되기 때문에 PK를 몰라 Select 쿼리가 발생한다.
    • 데이터가 N개인 member의 전체 데이터를 조회하는 경우
    • 전체 객체 조회 1번(member) + 내부에 참조되어 있는 객체 조회 N번(Team)이 발생한다.
    • 멤버만 원했는데 팀까지 불러오는 상황
  • 위 문제는 jpql fetch join 또는 엔티티 그래프로 해결 가능하다.

지연 로딩

  • 내부 참조 객체를 실제 사용하는 시점에서 조회하는 로딩 방법
  • 내부 참조 객체의 사용을 잘 하지 않는 로직에서 효율적(이론)
    • 실무에서 모두 지연 로딩으로 설계하고 정말 필요시에 즉시로딩을 사용하는 것이 효율적이다.

영속성 전이

  • 연관관계가 있는 엔티티간 영속성을 전이 시키는 것
  • parent를 em.persist()하면 child에 대한 em.persist()도 자동으로 수행된다.
  • 연관관계 매핑과는 상관 X
  • Spring Data JPA에서는 주로 JPARepository에 save시에 em.persist()가 발생한다.
  • 부모 엔티티와 자식 엔티티의 생명주기가 같은 경우에 사용한다.

고아 객체

  • 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 것
  • orphanRemoval 옵션으로 사용
  • DELETE query가 수행됨
  • @OneToOne / @OneToMany 에서만 가능
  • 부모 객체를 제거하면 자식 객체는 자동으로 제거된다.

주의점

  • 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 판단하고 삭제한다.
  • 참조하는 곳이 하나일 때 사용해야 한다.
  • 특정 엔티티가 개인 소유할 때 사용해야 한다.
profile
https://github.com/beombu

0개의 댓글