본문 바로가기
Java/Spring

23-07-09) Spring 강의 노트

by NH_club 2023. 7. 9.
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