지난 작업에서 SoftDelete 를 구현하기 위해 각 객체들에 isDeleted = boolean 항목을 추가했었고, 해당 값만 true 로 저장하여 삭제를 구현했었다.
하지만 이 객체와 1:N 관계에 있는 객체들의 isDeleted 도 true 로 바꿔주어야 하는데 이를 어떻게 처리해야 할까.
delete 할 때 일일히 repository의 모든 값을 불러와 직접 true 설정을 한다.
다른 또 신기한 어노테이션이 없나 찾아본다.
라는 어노테이션을 찾아냈는데, 이 어노테이션은 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 = ?")
@OnDelete 어노테이션은 DELETE 동작을 지정하는데 사용된다. @ManyToOne 또는 @OneToOne 관계에서 외래 키에 대한 삭제동작을 설정하는데 주로 사용된다.
action 속성은 삭제동작을 나타내고, CASCADE 설정을 해두면 부모의 영속성전파를 받게 된다.
부모 객체가 Delete되면 나도 Delete 쿼리를 실행하라는 뜻!
이 외에도 @SQLInsert, @SQLUpdate 등의 어노테이션도 있다고 하니 필요할 때 쓸 수 있도록 눈에 익혀두어야겠다.