삭제에는 두가지 방법의 삭제가 있다.
물리 삭제 같은 경우는 @DeleteMapping 으로 들어와서 row 자체를 삭제 시키는 형식이며 데이터를 즉시 말소시켜야하거나 더이상 데이터의 필요성을 못 느낄때 사용하는 방식입니다.
논리삭제는 row를 삭제하는 것이 아닌 삭제 여부에 대한 필드를 넣어서 true or false로 구분하는 것입니다.
혹은 날짜가 필요한 경우 날짜가 null or date로 들어갔는지 여부에 따라 판별합니다.
@SQLDelete(sql = "UPDATE posts SET deleted = true WHERE id = ?")
그래서 물리삭제 같은 경우 delete
문이 나가지만 논리 삭제인 경우 Update
문이 나갑니다.
@SQLDelete(sql = "UPDATE shop SET deleted = true WHERE id = ?")
@SQLDelete는 엔티티 삭제가 발생했을 때 delete 쿼리 대신 실행시켜줄 커스텀 sql 구문을 뜻하는 어노테이션입니다.
이렇게 @SQLDelete를 적어주면 엔티티 삭제 요청시 delete 쿼리 대신 적어준 update 쿼리가 실행됩니다.
추가로 엔티티를 조회할때 개발자가 누락할 수 있는 부분을 보안해주는 @Where
이 존재합니다.
@Where(clause = "deleted = false")
엔티티 조회 쿼리의 where절에 반드시 포함되는 조건을 설정할 수 있습니다.
상속 관계에 있을때 부모 클래스에
@SQLDelete(sql = "UPDATE shop SET deleted = true WHERE id = ?")
을 해줘도 아래 자식들은 삭제를 진행한다.
고로 하위 자식은 @OnDelete(action = OnDeleteAction.CASCADE)
처리를 해줘서 막아줄 수 있다
하지만 위의 방법일 경우 실무에서 사용하기가 애매하다고 한다.
왜냐하면 Entity 차원에서 사용되는 AOP 이기 떄문에 데이터가 무조건 해당 where절을 필터링 되어서 나온다.
그렇게 되면 삭제된 데이터를 조회하기 힘들다.
그래서 jpql에서 삭제 데이터를 제외하거나 querydsl로 삭제 데이터를 제외하는 방법을 사용한다.
https://velog.io/@jsb100800/Spring-boot-JPA-Soft-Delete-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
https://velog.io/@nmrhtn7898/JPA-JPA-Hibernate-%EA%B8%B0%EB%B0%98%EC%9D%98-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-Soft-Delete-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0#%EB%AC%B8%EC%A0%9C%EC%9D%98-%EB%B0%9C%EC%83%9D-%EC%9D%B4%EC%9C%A0
https://velog.io/@wlsgur1533/soft-delete%EB%8A%94-%EC%99%9C%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%BC%EA%B9%8C