Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

스파르타 부트캠프 Spring Master 3강 영속성 전이 본문

Spring

스파르타 부트캠프 Spring Master 3강 영속성 전이

H.S-Backend 2024. 5. 29. 16:59

@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);
}

 


외래키 연관관계 설정 addFoodList를 고객 Entity에 추가

@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user",cascade = {CascadeType.PERSIST,CascadeType.REMOVE})
    private List<Food> foodList = new ArrayList<>();

    public void addFoodList(Food food) {
        this.foodList.add(food);
        food.setUser(this); //외래키 설정
    }
}
userRepository.save(user);
foodRepository.save(food);
foodRepository.save(food2);

Robbie가 음식주문을하기위해서

위처럼 모두 직접 save()메서드를 호출하여 영속화를해야하는데


 

JPA에서는 이를 간편하게 할 수있도록

영속성 전이(CASCASE)의 PERSIST옵션을 제공한다.

@OneToMany(mappedBy = "user",cascade = CascadeType.PERSIST )
private List<Food> foodList = new ArrayList<>();

 


영속성 전이란

영속 상태의 Entity에서 수행되는 작업들이

연관된 Entity까지 전파되는 상황

 

 영속성 전이를 적용하여 해당 Entity를 저장할 때

연관된 Entity까지 자동 저장되기 위해서

저장하려고 하는 연관된 Entity에 추가한 연관관계 에너테이션

@OneToMany(mappedBy = "user",cascade = CascadeType.PERSIST )

CASCADE의 PERSIST옵션을 설정하면된다.


 

@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);
}

 

CASCADE PERSIST를 적용했기에

직접 음식 Entity(food, food2)객체마다 save를 하지않아도

자동으로 저장이된다.

 


Robbie가 주문 APP을 탈퇴하여

주문 음식정보를 모두 삭제하려고할 때

 

JPA에서는 이를 간편하게 처리할 수 있는 방법

영속성 전이(CASCADE)의 REMOVE옵션을 제공한다.

@OneToMany(mappedBy = "user",cascade = {CascadeType.PERSIST,CascadeType.REMOVE} )
private List<Food> foodList = new ArrayList<>();

중괄호를 사용하여 PERSIST와 REMOVE 동시 사용이 가능하다.


 @Test
    @Transactional
    @Rollback(value = false)
    @DisplayName("영속성 전이 삭제")
    void test4() {
        // 고객 Robbie 를 조회합니다.
        User user = userRepository.findByName("Robbie");
        System.out.println("user.getName() = " + user.getName());

        // Robbie 가 주문한 음식 조회
        for (Food food : user.getFoodList()) {
            System.out.println("food.getName() = " + food.getName());
        }

        // Robbie 탈퇴
        userRepository.delete(user);
    }
}

Robbie를 조회하고

주문한 FoodList를 가져와서

userRepository.delete(user) 를 하면

연관된 음식데이터와 고객정보가 삭제된다.

 


JPA영속성전이를 사용하지 않으면

@Test
@Transactional
@Rollback(value = false)
@DisplayName("Robbie 탈퇴")
void test3() {
    // 고객 Robbie 를 조회합니다.
    User user = userRepository.findByName("Robbie");
    System.out.println("user.getName() = " + user.getName());

    // Robbie 가 주문한 음식 조회
    for (Food food : user.getFoodList()) {
        System.out.println("food.getName() = " + food.getName());
    }

    // 주문한 음식 데이터 삭제
    foodRepository.deleteAll(user.getFoodList());

    // Robbie 탈퇴
    userRepository.delete(user);
}

 

user.getFoodList를 삭제하고 delete (user)를 하여

FoodList도 삭제하고 User도 삭제해야한다.

 


https://hs-backend.tistory.com/165

 

스파르타 부트캠프 Spring Master 3강 지연로딩과 즉시로딩

음식테이블과 고객 테이블이 N: 1양방향 관계일 때@Test@DisplayName("아보카도 피자 조회")void test1() { Food food = foodRepository.findById(2L).orElseThrow(NullPointerException::new); System.out.println("food.getName() = " + food.ge

hs-backend.tistory.com

 

반응형