티스토리 뷰
soft-delete-hibernate
hibernate가 제공하는 @SoftDelete 어노테이션을 알아보자
[hibernate 6.4.4 버전 기준으로 MySQL과 함께 테스트 했으며 6.4 버전부터 도입된 어노테이션이다.]
@SoftDelete JavaDoc
다음 어노테이션을 테스트
- 디폴트로 boolean 타입의
deleted
필드가 추가되며, Entity 내부에 자바코드로 동일한 이름의 필드를 사용할 수 없다.- 중복 필드 에러가 발생한다.
- 즉,
deleted
필드는 자바 코드로 접근 불가하다.
- 필드명은 커스텀하게 설정 가능하며, boolean 타입이 싫은 경우 converter를 사용할 수도 있다. (후술 예정)
JpaRepository.deleteAll() 호출시
deleted
= true 로 update 된다.- 참고로, deleteAll() 은 spring-data-jpa 내부적으로 deleteById()와 같은 삭제 로직을 반복해 호출한다.
JpaRepository.findAll() 로 조회하는 API 호출시
deleted
= true 인 경우 조회되지 않는다.- 하단 사진의
data
가 비어있다. (envelope 패턴의 실제 데이터 부분)
커스텀한 사용
Converter
- 디폴트 설정에서 deleted = true 가 삭제됐음을 나타내는 것을 고려해 Boolean을 반환하면 된다.
- 현재 LocalDateTime.now()를 그대로 반환하면 무조건 기본으로 값이 저장됨을 확인했다. 아래 코드대로 하면 원하는대로 동작하지 않는다.
Entity 설정
datetime 타입의 deleted_at 필드 생성
api 호출시 JpaRepository는 deleted_at이 null인 부분만 조회를 수행함을 확인했다.- 잘못된 테스트였다.
삭제가 된 부분을 jpa를 통해 조회가 가능할까?
- 적절히 jpa의 쿼리를 조작하면 가능하다.
- 필드가 명시되어 있지 않기에 그냥 jpql으로는 불가하다.
- nativeQuery = true 를 통해 쿼리를 작성하면
- 쿼리가 원하는대로 실행되며
- deleted_at이 null이 아닌 row에 대한 조회 결과를 얻을 수 있다.
테스트 수행한 코드 저장소
https://github.com/ohksj77/soft-delete-hibernate/tree/main
GitHub - ohksj77/soft-delete-hibernate: hibernate가 제공하는 @SoftDelete 어노테이션을 알아보자
hibernate가 제공하는 @SoftDelete 어노테이션을 알아보자. Contribute to ohksj77/soft-delete-hibernate development by creating an account on GitHub.
github.com
'개발 탐구' 카테고리의 다른 글
성능테스트 툴 locust, k6, artillery 비교 (1) | 2024.05.01 |
---|