우아한테크코스 4기/프로젝트
[JPA] cascade = CascadeType.REMOVE와 @OnDelete(action = OnDeleteAction.CASCADE)의 차이
giron
2022. 7. 24. 01:13
728x90
가장 큰 차이로는, JPA에 의해 처리되느냐, DDL에 의해 cascade가 걸린 테이블이 생겨 DB단에서 처리되느냐 이다.
전자의 방식을 취할 경우, JPA에 의해 외래 키를 찾아가며 참조하는 레코드를 제거해주게 됩니다.
따라서, JPA 상에서는 참조하고 있는 레코드의 개수만큼 delete 쿼리가 생성됩니다.
후자의 방식을 취할 경우, 데이터베이스 자체에서 on delete cascade 제약조건이 걸리게 됩니다. 이를 통해 참조하는 레코드가 모두 제거되는 것입니다.
cascade = CASCADE.REMOVE
- JPA 레벨에서 작동한다.
- 외래 키를 찾아 참조하는 레코드를 제거해준다.
- 참조하고 있는 레코드 수 만큼 delete쿼리가 나간다.
- 부모 테이블의 자식 컬럼에 걸어여하므로(일반적으로 @OneToMany(cascade= CASCADE.REMOVE) 양방향 매핑이 아닌 이상 적용하기 어렵다.
@OnDelete
- database에서 직접 처리한다.
- DDL 생성시 cascade 제약 조건이 생성 됨.
- 데이터베이스 자체에서 on delete cascade 제약조건이 걸리게 된다.
- 따라서 삭제 쿼리가 나가지 않는다!
- 단방향 매핑에서도 적용이 가능하다. - 자식 테이블의 부모 컬럼에 적용하면 된다.
대충 @OnDelete가 좋아보이는데,
@OnDelete 방식으로 테이블을 생성하여 데이터베이스를 직접 다루다보면, on delete cascade에 의해 어떠한 레코드의 참조 레코드까지 연쇄적으로 삭제해버리는 실수 할 여지가 있는 반면,
라고 한다. 해당 부분은 이해가 잘 안가서 다음에 봐야할 것 같다.
728x90