프로젝트

[트러블 슈팅] cascade의 위험성..

매일_공부 2025. 1. 11. 16:26
반응형

쇼핑몰 프로젝트를 하다가 또 에러에 고통을 받게 되었다..

 

멤버의 장바구니에서 장바구니 상품을 삭제하는 기능을 개발하고 있었다.

 

 

장바구니와 장바구니 상품은 orphanRemoval로 장바구니 리스트에서 상품을 제거하면,

 

자동으로 db에 반영되는 방식으로 진행하려고 했고, 쉽게 개발이 될 거라고 예상했다.

 

 

그러나 갑자기

 

ould not execute statement [Cannot delete or update a parent row: a foreign key constraint fails (`goodpang`.`order_item`, CONSTRAINT `FKija6hjjiit8dprnmvtvgdp6ru` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`))] [delete from item where id=?]; SQL [delete from item where id=?]; constraint [null] at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException

 

이런 에러가 발생하였다.

 

나는 장바구니에서 장바구니 상품을 지우는 기능을 실행했는데 갑자기 뜬금없는

 

주문 상품에서 오류가 발생해버렸다.

 

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
public class CartItem extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;


    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    @JoinColumn(name = "item_id")
    private Item item; // 배송 상품

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cart_id")
    private Cart cart;

    private Integer count; //상품 개수
    public void setCart(Cart cart) {
        this.cart = cart;
    }
    public void addCount(int count) {this.count += count;}
}

 

기존 주문 상품 코드이다.

 

여기에서 item을 보면 cascade = CascadeType.REMOVE인 것을 볼 수 있다.

 

이거 때문에 문제가 생긴거였다!!

 

 

cascade가 붙게 되면, 현제 엔티티가 삭제되면, 자동으로 cascade가 붙은 엔티티까지 삭제된다는 것이다.

 

 

즉, cartItem이 db에서 삭제되면, cartItem 클래스에 cascade가 붙은 Item도 db에서 삭제되는 것이다.

 

 

Item이 db에서 삭제 되니까. 당연하게 Item을 참조하고 있던 orderItem에서 오류가 발생한 것이다.

 

 

cascade를 남발하지 않아야 함을 깨달았고, cascade의 역할을 제대로 알게 된 계기가 되었다!

반응형