일단정리해.log
로그인
일단정리해.log
로그인
[Spring] 즉시로딩 & 지연로딩, 영속성전이, 고아 객체
신범철
·
2023년 10월 5일
팔로우
0
고아객체
영속성전이
즉시로딩
지연로딩
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 에서만 가능
부모 객체를 제거하면 자식 객체는 자동으로 제거된다.
주의점
참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 판단하고 삭제한다.
참조하는 곳이
하나
일 때 사용해야 한다.
특정 엔티티가 개인 소유할 때 사용해야 한다.
신범철
https://github.com/beombu
팔로우
다음 포스트
[ Spring ] OSIV란
0개의 댓글
댓글 작성