[spring] soft delete와 hard delete에 대해서

sujin·2023년 6월 19일
0

spring

목록 보기
4/13

만약에 사용자가 삭제한 데이터를 다시 필요로한다면? 혹은 관리자가 될 수도 있을 것이다.

사실 이러한 것까지 프로젝트를 진행하면서 생각해보지 못했다. database를 공부할 때 데이터 삭제는 delete문을 사용해서 바로 삭제해버리는 hard delete에 익숙해졌기 때문이다.

그렇지만, 최근 soft delete에 대해서 알아보게 되었고 왜 사용하고 어떻게 적용할 수 있는지에 대해서 조사를 해봤다!
그래서 조사한 것들에 대해서 오늘은 soft delete와 hard delete에 대해서 공유하려고한다.
그리고 soft delete를 적용할 때 함께 사용할 수 있는 annotation을 알아보도록하자!

0. soft delete란 무엇일까


출처: 이곳

귀여워서 가져와봤다 ㅎㅎ^^

앞서 말한것에서 힌트를 받았을 수 있지만, soft delete는 언제 사용하게 되는 것일까?
사용자가 삭제한 데이터는 실제로 남아있지만 삭제되었다고 느끼게끔 하는 로직이 필요할 때 soft delete를 사용한다.
그렇다면 어떻게 그게 가능할까?
우선 delete를 시켜버리면 안 된다는 것은 당연하다. 그리고 이게 삭제된 것인지 삭제되지 않은 것인지 구별해줄 필요가 있는데 구별해줄 무언가는 필요할 것이다. 따라서 삭제된 것인지 삭제되지 않은 것인지 구별하기 위해서 boolean값을 가지는 속성을 하나 만들어서 체크하면 될 것이다.

예를 들어서 삭제됐을 때 deleted라는 속성을 true로 하고 만약 삭제 되지 않았을 때 false로 하겠다고 했으면, 사용자에게 보여주는 정보는 deleted가 false인 데이터들을 보여주면 될 것이다.

그렇다면 soft delete를 왜하는 것일까?
사용자가 삭제를 하더라도 그 정보가 통계정보에 유용하다거나 이후에 사용가능성이 있다면 남겨두는 것이 좋을 것이다. 이외에도 데이터가 돈인 시대이기에 장점이 많을 것이다.

1. soft delete 적용 방법

  • update
    soft delete를 적용하기 위해서는 위에서 말했듯이 하나의 속성을 지정하고 그 속성을 update하는 방식으로 진행하면 된다.

  • 논리삭제

    실제로 DB에서 삭제된 것이 아니고 사용자는 deleted가 안 된 것들만 볼 수 있기에 삭제 되었다고 느끼게 한다.

논리삭제를 사용하기 때문에 이때 활용할 column을 하나 생성하면 된다.

2. Spring에서 soft delete구현하기

@SQLDelete

Custom SQL statement for delete of an entity/collection.으로 소개되고 있다.

해당 annotation을 사용하면 entity나 collection에 대해서 delete 상태를 custom할 수 있다.
sql 구문을 넣을 수 있는데 이때 sql에 update를 사용해서 entity의 특정 속성 값을 true로 update해주는 로직이 delete가 적용됐을 때 내부에서 동작하게 된다.
그렇다면 우리는 hard delete가 아니라 soft delete를 적용하게 될 것이다.

이렇게 적용했다면 우리는 속성값이 false인 것만 사용자에게 보여줘서 논리삭제 구현을 마무리해야한다.

@Where

Specifies a restriction written in native SQL to add to the generated SQL when querying an entity or collection.
For example, @Where("deleted = false") could be used to hide entity instances which have been soft-deleted. 라고 설명에 나와있다.

@Where를 사용하면 일반적인 코드에서 where를 사용하듯이 조건을 걸 수 있는데 clause에 조건을 string으로 넣어줄 수 있다.
위에서 예시를 든것을 가져와서 사용한다고 하면, deleted가 false인 조건을 넣어주면 될 것이다.
그렇다면, 우리가 jpa, querydsl을 사용할 때 조건을 걸어주지 않더라도 해당 annotation이 적용된 entity의 경우에는 무조건 deleted가 false인 것들만 사용하게 된다.

class에 적용하기

해당 두가지 annotation을 사용해서 만들고자하는 entity에 적용을 하면 soft delete를 구현할 수 있다.

마무리

한가지 의문이 들 수 있다. 왜 Filter가 아니라 where annotation을 굳이 내가 언급했을까?
사실 filter를 사용해도 될텐데 말이다!!

다음 포스트에 적어보도록 하겠다~!

0개의 댓글