TIL

[TIL] 20240130 JPA 지연로딩, 영속성 전이

yjyj0101 2024. 1. 30. 20:50

1. 지연로딩

Fetch Type의 종류에는 2가지가 있는데 하나는 LAZY , 다른 하나는 EAGER 이다.

  • LAZY 는 지연 로딩 으로 필요한 시점에 정보를 가져옴
  • EAGER는 즉시 로딩 으로 이름의 뜻처럼 조회할 때 연관된 모든 Entity의 정보를 즉시 가져옴
  • 지연 로딩을 사용하면 실제 엔티티 객체 대신 가짜 객체가 필요한데, 이것이 바로 "프록시 객체"

실무에서는 가급적 지연 로딩만 사용 -> 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생

 

@ManyToOne, @OneToOne과 같이 @XXXToOne 어노테이션들은 기본이 즉시 로딩(EAGER) 이다.

-> 꼭 LAZY로 명시적으로 설정해서 사용

 

2. 영속성 전이

Parent가 관리하는 Child 인스턴스의 경우 Parent를 em.persist()할 때 같이 진행하면 편함

@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL)
    private List<Child> childes = new ArrayList<>();

 

Cascade 조건
  1. Cascade되는 엔티티와 Cascade를 설정하는 엔티티의 라이프사이클이 동일하거나 비슷해야한다.
  2. Cascade되는 엔티티가 Cascade를 설정하는 엔티티에서만 사용되어야 한다.

 

orphanRemoval 옵션 ( OnetoMany나 OnetoOne )
  • 부모와 연관관계가 끊어진 엔티티를 고아객체라고 함
  • 고아객체를 자동으로 삭제해주는 옵션을 활성화

 

orphanRemoval=true와 Cascade.REMOVE 차이 (remove, delete)
  • Cascade.REMOVE의 경우 : 해당하는 엔티티를 em.remove를 통해 직접 삭제할 때,그 아래에 있는 多에 해당하는 엔티티들이 삭제
  • orphanRemoval=true의 경우 : 물론, 엔티티의 리스트에서 요소를 삭제하기만 해도 해당 엔티티가 delete되는 기능까지 포함

 

 

 

 

 

 

 

 

 

출처 : https://ict-nroo.tistory.com/132 https://hongchangsub.com/jpa-cascade-2/

https://tecoble.techcourse.co.kr/post/2021-08-15-jpa-cascadetype-remove-vs-orphanremoval-true/