FetchType
더보기
FetchType.LAZY(지연로딩)는 필요한 시점에 필요한 정보만 가져온다.
FetchType.EAGER(즉시로딩)은 조회하는 즉시 연관된 모든 정보를 가져온다.
원래는 조회만 하면 @Transactional이 필수가 아니지만, 지연로딩이 적용된 엔터티를 조회할 땐 영속성 컨텍스트가 필요함으로 @Transactional이 필요하다.
LAZY는 데이터가 필요할 때 필요한 데이터의 값만 가져온다. 그러니 모든 정보가 필요하지 않다면 LAZY로 설정해야한다. EAGER로 설정시 불필요한 데이터까지 로딩하여 성능저하를 일으킬 수 있다.
영속성 전이
더보기
@OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
Cascade를 통해서 영속성 전이가 가능나며, 이 Cascade는 여러가지 옵션을 제공함.
서로 연관이 되어있는 엔터티들에서 둘 다 영속성을 부여하지 않고 하나의 엔터티만 부여해도 영속성 전이가 일어나서 굳이 따로 생성, 삭제 등을 하지 않아도 자동으로 생성, 삭제가 가능하게 함.
orphanRemoval
더보기
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
연관관계를 제거하는 것 만으로도 데이터 베이스에서 삭제가 가능함.
@Test
@Transactional
@Rollback(value = false)
@DisplayName("연관관계 제거")
void test1() {
// 고객 Robbie 를 조회합니다.
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
// 연관된 음식 Entity 제거 : 후라이드 치킨
Food chicken = null;
for (Food food : user.getFoodList()) {
if(food.getName().equals("후라이드 치킨")) {
chicken = food;
}
}
if(chicken != null) {
user.getFoodList().remove(chicken);
}
// 연관관계 제거 확인
for (Food food : user.getFoodList()) {
System.out.println("food.getName() = " + food.getName());
}
}
만약 user를 제거하면 연관된 음식까지 사라지는 REMOVE의 기능도 포함하고 있음.
orphanRemoval 이나 REMOVE 옵션 사용할 때 주의사항
더보기
연관된 엔터티를 다른 곳에서도 참조하고 있는지 확인해야함.
A는 C를 참조하고 있었는데 B가 삭제되면서 C도 삭제되면 문제가 발생하게 됨.
orphanRemoval같은 경우는 ManyToOne에는 사용할 수 없음.
orphanRemoval이나 REMOVE는 꼭 다른곳에 문제가 가지 않을지 생각하고 적용시켜야함.
'Java > Spring' 카테고리의 다른 글
Spring) refresh token (0) | 2023.07.23 |
---|---|
23.07.19) CORS 에러 해결 (0) | 2023.07.19 |
23.07.07) Spring 강의 노트 (0) | 2023.07.07 |
23.07.06) Spring 강의 노트 (0) | 2023.07.06 |
23.07.01) Spring 강의 노트 (0) | 2023.07.01 |