개발/부트캠프

본캠프 : 뉴스피드 제작(팀 프로젝트)_소프트 삭제(Soft Delete)

EJ EJ 2025. 2. 19. 14:28

[ User 소프트 삭제 방법 ]

1. User Entity  설정

  • 필드 추가

       private LocalDateTime deletedAt

  • 클래스 전체 적용

       @SQLDelete(sql = "UPDATE users SET deleted_at = now() WHERE id = ?")

       @SQLRestriction("deleted_at IS NULL")

 

 

2. 설명

1) @SQLDelete란?

  • JPA에서 @Entity가 삭제될 때 실행할 SQL을 정의하는 어노테이션입니다.
  • 기본적으로 delete from users where id = ?로 실행되는 DELETE 명령어를 사용자 정의 SQL로 변경할 수 있습니다.
  • @SQLDelete를 활용하면 데이터를 실제로 삭제하지 않고, deleted_at 컬럼을 업데이트하여 "소프트 삭제(Soft Delete)"를 구현할 수 있습니다.

2) @SQLRestriction이란?

  1. JPA에서 엔티티에 적용되는 SQL 필터 조건을 추가하는 어노테이션입니다.
  2. 삭제된 데이터(deleted_at이 NULL이 아닌 데이터)는 조회되지 않도록 필터링합니다.
  3. 단점, Not Found삭제된 데이터를 구분할 수 없습니다. 에러메세지를 구분하여 송신할 수 없다는 단점이 있습니다. 이 점은 각 프로젝트 사양마다 다를 수 있으니 Trade-off를 고려하여 적용하면 됩니다.

추가)

@Where 어노테이션은 Hibernate ORM 6.3 버전부터 Deprecated(더 이상 사용하지 않음) 되어 작성 시 경고(warning) 표시됩니다.

@SQLRestriction 은 @Where 을 대체하는 어노테이션으로 JPA를 통해 생성된 select 쿼리에 설정한 조건을 where 절에 자동으로 추가합니다.

*참고 사이트 : https://stackoverflow.com/questions/77178963/is-there-a-replacement-for-the-in-6-3-deprecated-where-and-loader