[JPA] soft delete 란?

Coodori·2023년 3월 29일
0

CherishU

목록 보기
12/29

Soft Delete 란?

삭제에는 두가지 방법의 삭제가 있다.

  • 물리 삭제
  • 논리 삭제

물리 삭제(Hard Delete)

물리 삭제 같은 경우는 @DeleteMapping 으로 들어와서 row 자체를 삭제 시키는 형식이며 데이터를 즉시 말소시켜야하거나 더이상 데이터의 필요성을 못 느낄때 사용하는 방식입니다.

논리 삭제(Soft Delete)

논리삭제는 row를 삭제하는 것이 아닌 삭제 여부에 대한 필드를 넣어서 true or false로 구분하는 것입니다.
혹은 날짜가 필요한 경우 날짜가 null or date로 들어갔는지 여부에 따라 판별합니다.

@SQLDelete(sql = "UPDATE posts SET deleted = true WHERE id = ?")

물리삭제, 논리삭제

그래서 물리삭제 같은 경우 delete 문이 나가지만 논리 삭제인 경우 Update 문이 나갑니다.

삭제

  • 물리삭제는 테이블의 레코드와 인덱스의 노드를 삭제처리해야함
  • 논리삭제는 삭제 구분자 컬럼만 바꾼다.

조회

  • 물리삭제는 해당 row가 삭제 되었기 때문에 추가 로직이 필요하지않습니다.
  • 논리삭제는 컬럼값의 여부에 따라 삭제 유무가 결정되니 추가로 컬럼 확인이 필요합니다.

복원

  • 물리삭제는 로그와 과거 기록된 매체를 보며 복구해야합니다.
  • 논리삭제는 삭제유무 컬럼만 다시 원복해주면 됩니다.

디스크 사용량

  • 물리삭제는 row를 제거하니 디스크 사용량이 줄어듭니다.
  • 논리삭제는 조회하는 과정에서 삭제된 데이터들도 조회가 되기때문에 사용량이 줄어들지 않을 수 있습니다.

CASCADE

  • 물리삭제일 경우 부모가 사라지면 아래 관련된 항목에 대해 CASCADE 옵션이 작동합니다.
  • 논리삭제일 경우 부모가 삭제된 것이 아니기때문에 cascade 삭제를 사용하기 위해서는 애플리케이션 또는 데이터베이스 레벨에서 트리거로 직접 구현해야합니다.

논리 삭제를 편하게 하는법

@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로 삭제 데이터를 제외하는 방법을 사용한다.

과연 논리삭제를 쓰는 것만이 좋을까?

  • ORM 프레임워크의 기능에 따라 다르다.
  • 삭제 이후에 데이터가 활용될수 있을 때 사용하는 것이 좋다.

Reference

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

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640

0개의 댓글