⏰ 2024. 05. 30 목
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
지연 로딩과 즉시 로딩
연관 관계가 맵핑된 테이블들에서는 한쪽의 테이블의 정보만 조회하려고 해도 자동으로 JOIN문을 사용하여 반대쪽의 테이블의 정보도 가져온다.
JPA에서는 연관 관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때만 가져올지를 정할 수 있다.
Fetch Type
의 옵션 2가지 지연 로딩(LAZY)
, 즉시 로딩(EAGER)
가 있다.
즉시 로딩은 Entity 연관 관계에서 JOIN된 테이블의 정보를 즉시 가져오는 것을 의미하고, Fetch Type
에 EAGER
로 설정할 수 있다.
@ManyToOne
애너테이션은 Fetch Type
의 default 값이 EAGER
로 설정되어 있다.
관계 애너테이션의 뒤쪽에 One
일 경우는 default 값이 EAGER
로 설정되어 있다.
지연 로딩은 Entity 연관 관계에서 JOIN된 테이블의 정보를 필요한 시점에 가져오는 것을 의미하고, Fetch Type
에 LAZY
로 설정할 수 있다.
@OneToMany
애너테이션은 Fetch Type
의 default 값이 LAZY
로 설정되어 있다.
관계 애너테이션의 뒤쪽에 Many
일 경우는 default 값이 LAZY
로 설정되어 있다.
트랜잭션(@Transactionl)
을 설정 해야한다.영속성 전이
영속성 정이(CASCADE)
의 PERIST
옵션을 제공한다.영속 상태의 Entity에서 수행되는 작업들이 연관된 Entity까지 전파되는 상황을 의미한다.
연속성 전이를 적용해서 자동으로 저장하려는 연관된 Entity에 추가한 연관 관계 애너테이션에 CASCADE
의 PERIST
옵션을 설정하면 된다.
연속성 전이를 적용해서 삭제하려는 연관된 Entity도 자동으로 삭제하려면, CASCADE
의 REMOVE
옵션을 설정하면 된다.
CASCADE
의 PERIST
옵션과 CASCADE
의 REMOVE
옵션을 둘 다 적용하면 자동으로 저장할 수도 있고, 삭제할 수도 있다.
cascade = {CascadeType.PERIST, CascadeType.REMOVE}
고아 Entity 삭제
CASCADE
의 REMOVE
옵션을 적용하면 해당 Entity 객체를 삭제 했을 때, 연관된 Entity 객체들을 자동으로 삭제할 수 있었지만, REMOVE
옵션 같은 경우 연관된 Entity 관계를 제거했다고 해서 자동으로 해당 Entity가 삭제 되지는 않는다.
이를 간단하게 처리하는 방법으로 JPA에서는 orphanRemoval
옵션을 제공한다.
orphanRemoval
옵션을 사용하려면 연관 관계 애너테이션에 true
로 작성하면 된다.
orphanRemoval
옵션은 REMOVE와 마찬가지로 연관된 Entity를 자동으로 삭제해 준다.
orphanRemoval
와 REMOVE
옵션을 사용한 Entity에서 삭제하려고 할때, 연관된 Entity가 다른 곳을 참조하고 있는지 아닌지 꼭 확인해야 한다.@ManyToOne
애너테이션이 설정된 Entity는 해당 Entity 객체를 참조하는 다른 Entity 객체들이 있을 수 있기 때문에 orphanRemoval
를 가지고 있지 않다.