개발/부트캠프
본캠프 : 뉴스피드 제작(팀 프로젝트)_소프트 삭제(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이란?
- JPA에서 엔티티에 적용되는 SQL 필터 조건을 추가하는 어노테이션입니다.
- 삭제된 데이터(deleted_at이 NULL이 아닌 데이터)는 조회되지 않도록 필터링합니다.
- 단점, Not Found 와 삭제된 데이터를 구분할 수 없습니다. 에러메세지를 구분하여 송신할 수 없다는 단점이 있습니다. 이 점은 각 프로젝트 사양마다 다를 수 있으니 Trade-off를 고려하여 적용하면 됩니다.
추가)
@Where 어노테이션은 Hibernate ORM 6.3 버전부터 Deprecated(더 이상 사용하지 않음) 되어 작성 시 경고(warning) 표시됩니다.
@SQLRestriction 은 @Where 을 대체하는 어노테이션으로 JPA를 통해 생성된 select 쿼리에 설정한 조건을 where 절에 자동으로 추가합니다.