TIL

+36 영속성 전이

JAVABOZA 2023. 7. 27. 09:43

● 영속성 전이란?

:: CASCADE의 PERSIST

영속 상태의 Entity에서 수행되는 작업들이 연관된 Entity까지 전파되는 상황을 뜻한다.

 

부모엔티티의 상태변화가 자식 엔티티에도 전파되어 자동으로 처리됨

 즉, 부모 엔티티의 영속성 상태 변화에 따라 연관된 자식 엔티티도 같은 변화를 따라 갈 수 있음

 

영속성 작업

1. 저장(INSERT) : 새로운 엔티티를 데이터베이스에 저장하는 작업

2. 수정(UPDATE) : 엔티티의 변경 내용을 데이터베이스에 반영하는 작업

3. 삭제 (DELETE) : 엔티티를 데이터베이스에서 삭제하는 작업

4. 병합 (MERGE) : 엔티티의 변경 내용을 데이터베이스에 병합하는 작업

5. 새로고침(REFRESH) : 데이터베이스에서 엔티티의 최신상태를 가져와 엔티티를  갱신하는 작업

public void addFoodList(Food food) { this.foodList.add(food); food.setUser(this); // 외래 키(연관 관계) 설정 }

food.setUser(this)
는 음식 객체의
user필드를 현재의 사용자(this)로 설정하는 역할을 합니다.
이를 통해 음식과 사용자 간의 양방향 연관관계가 형성됩니다.

addFoodList메서드를 호출하여 음식을 사용자의 음식 목록에 추가하면, 음식과 사용자 사이의
연관관계가 맺어지고 데이터베이스에도 해당 연관관계가 반영된다.
이를 통해 사용자는 소유하고 있는 음식을 관리할 수 있게 된다

 

고객 Entity의 @OneToMany에서 영속성 전이를 적용해서 음식 Entity도 자동으로 저장될 수 있도록 설정

 

CasadeType.PERSIST  : 저장(INSERT)작업에 대해 영속성 전이 수행

CasadeType.MERGE   : 수정 작업에 대해 영속성 전이 수행

CasadeType.REMOVE   : 삭제 작업에 대해 영속성 전이 수행

CasadeType.REFRESH   : 새로고침 작업에 대해 영속성 전이를 수행

CasadeType.ALL   : 모든작업에 대해 영속성 전이를 수행

 

더보기

영속성 전이 장점

 

1. 코드의 간결성

2. 일관성유지 

3. 효율성

 

Cascade세팅

package com.sparta.jpaadvance.cascade;

import com.sparta.jpaadvance.repository.FoodRepository;
import com.sparta.jpaadvance.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class CascadeTest {

    @Autowired
    UserRepository userRepository;
    @Autowired
    FoodRepository foodRepository;


}

 


예시

@Test
@DisplayName("Robbie 음식 주문")
void test1() {
    // 고객 Robbie 가 후라이드 치킨과 양념 치킨을 주문합니다.
    User user = new User();
    user.setName("Robbie");

    // 후라이드 치킨 주문
    Food food = new Food();
    food.setName("후라이드 치킨");
    food.setPrice(15000);

    user.addFoodList(food);

    Food food2 = new Food();
    food2.setName("양념 치킨");
    food2.setPrice(20000);

    user.addFoodList(food2);

    userRepository.save(user);
    foodRepository.save(food);
    foodRepository.save(food2);
}

 

@Test
@DisplayName("영속성 전이 저장")
void test2() {
    // 고객 Robbie 가 후라이드 치킨과 양념 치킨을 주문합니다.
    User user = new User();
    user.setName("Robbie");

    // 후라이드 치킨 주문
    Food food = new Food();
    food.setName("후라이드 치킨");
    food.setPrice(15000);

    user.addFoodList(food);

    Food food2 = new Food();
    food2.setName("양념 치킨");
    food2.setPrice(20000);

    user.addFoodList(food2);

    userRepository.save(user);
}

'TIL' 카테고리의 다른 글

+38 단위테스트란? JUnit6  (0) 2023.08.08
+37 Spring 고어 Entity 삭제  (0) 2023.08.04
+35 Spring 지연로딩  (0) 2023.07.26
+34 Spring N 대 M관계  (0) 2023.07.22
+33 Spring 1대N 연관관계  (0) 2023.07.20