[BackOffice Project] Soft Delete 시 is_delete 속성 전파하기 - @SQLDELETE, @OnDelete

JUNHYUK CHANG·2024년 1월 26일
0

TIL

목록 보기
12/33

지난 작업에서 SoftDelete 를 구현하기 위해 각 객체들에 isDeleted = boolean 항목을 추가했었고, 해당 값만 true 로 저장하여 삭제를 구현했었다.

하지만 이 객체와 1:N 관계에 있는 객체들의 isDeleted 도 true 로 바꿔주어야 하는데 이를 어떻게 처리해야 할까.

  1. delete 할 때 일일히 repository의 모든 값을 불러와 직접 true 설정을 한다.

  2. 다른 또 신기한 어노테이션이 없나 찾아본다.

1. @SQLDelete( sql = " SQL 명령어 " )

라는 어노테이션을 찾아냈는데, 이 어노테이션은 repository.delete( ) 가 실행되었을 때 delete 쿼리 대신 실행하게 되는 것이다.

우리는 DELETE 쿼리를 받았을 때 UPDATE 를 통해 값을 고치기만 할 것이므로 SQL 쿼리로는 다음과같이 작성할 수 있다.

UPDATE boards SET is_deleted = true WHERE id = ?

따라서 아래와 같이 완성하여 원하는 Entity 위에 붙여주면 된다!

@SQLDelete(sql = "UPDATE boards SET is_deleted = true WHERE id = ?")

2. @OnDelete( action = OnDeleteAction.CASCADE)

@OnDelete 어노테이션은 DELETE 동작을 지정하는데 사용된다. @ManyToOne 또는 @OneToOne 관계에서 외래 키에 대한 삭제동작을 설정하는데 주로 사용된다.

action 속성은 삭제동작을 나타내고, CASCADE 설정을 해두면 부모의 영속성전파를 받게 된다.
부모 객체가 Delete되면 나도 Delete 쿼리를 실행하라는 뜻!

즉, 위의 두 어노테이션을 붙여놓으면 Delete 명령이 전파되고, Delete 명령을 받아올 시 is_deleted = true 로 변경하는 작업이 실행되는 것이다!

이 외에도 @SQLInsert, @SQLUpdate 등의 어노테이션도 있다고 하니 필요할 때 쓸 수 있도록 눈에 익혀두어야겠다.

0개의 댓글