CRUD를 아무생각없이 작성하다보면 간과하는것이 생겨버린다..
바로 DELETE에서의 cascade문제!
JPA로 entity class 작성시에 참조가 있는 곳에 cascade 옵션을 주지 않으면 참조 무결성의 제약조건 때문에
Cannot delete or update a parent row (...)
와 같은 에러가 발생하고 삭제를 할 수 없다.
현재 프로젝트에서 유저(부모엔티티) 삭제 시에 관련된 데이터들을 모두 삭제 시키고 싶었기 때문에 cascade옵션을 주고자 했다
JPA를 사용하여 cascade 옵션을 줄 때 주로
@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL)
와 같이 @OneToMany
에 cascade 옵션을 붙일 수 있다.
이 경우에는 JPA레벨에서 JPA가 부모 엔티티 삭제시 자식 데이터에 대해 DELETE쿼리를 실행한다.
하지만.. 순환참조 등 양방향 매핑을 하고 싶지 않았고
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
@OnDelete(action = OnDeleteAction.CASCADE)
private User user;
@OnDelete
를 사용하여 cascade 옵션을 주었다.
이 경우에는 JPA레벨이 아닌 DDL생성시 cascade옵션이 주어져 DB에서 처리하게 된다.
@OnDelete
를 적용하여 DELETE를 실행했으나..! 여전히 참조 무결성에의한 에러가 해결되지 않았다..
properties에 ddl-auto
가 update
로 설정되어있었기 때문이었고
spring.jpa.hibernate.ddl-auto=create
create
로 변경하여 테이블이 새로 create되도록 하니 정상 작동되었다..
다만 테스트 데이터가 전부 날라간다는 슬픈 사실😭
정상 작동 확인 후 update
로 변경해주었다.