물리적으로 데이터를 삭제하는것이 아닌 논리적으로 데이터를 삭제 할 경우는 특정컬럼 (예 : deleted) 값을 변경하여 둔다.
비즈니스 로직을 수행하면서 데이터 조회등을 할 때에는 논리 삭제가 된 데이터가 조회되면 안된다.
따라서 Entity 클래스의 어노테이션으로 @SQLRestriction 을 이용하게 되면, 논리삭제된 데이터를 제외하고 처리할 수 있다.
사용예는 다음과 같다. 클래스 어노테이션으로 붙이고, 컬럼값 조건을 넣는다.
- @SQLRestriction("deleted = false")
- deleted 가 false 인 데이터들만 조회해 온다
논리 삭제는, @SoftDelete 어노테이션을 이용할 수 있으나, 이 경우 연관관계에 있는 엔티티에서 lazy 로딩을 할 수 없는 문제가 있고,
JPQL을 이용할 경우에는 논리 삭제 전파가 되지 않는 문제가 있다. 또한 1:N 관계에 있는 경우, @NotFoundException 을 1 관계에 있는
엔티티의 멤버변수에 붙여줘야 하는 문제도 있고.
대안으로 @SQLDelete 어노테이션을 이용하는 방법이 있다.
아래는 해당 예시이다.
@SQLDelete(sql = """
UPDATE users
SET deleted = true
WHERE id = ?
""")
- 마찬가지로 클래스 어노테이션으로 사용하며, 직접 sql문으로 delete 를 update 문으로 치환하여, JPARepository를 이용할 경우 논리삭제가 되도록 한다.
- 이 경우 또한 @JPQL은 전파되지 않는다.
- 단, SQLDelete의 경우에는 Lazy 로딩을 사용할 수 있다.
'Backend > SpringBoot' 카테고리의 다른 글
| [Spring Security] JWT 사용시 Filter 구성 예 (0) | 2025.12.15 |
|---|---|
| [Spring Security] 쿠키 및 세션 (0) | 2025.12.12 |
| Retryable, 낙관적 락 간편 적용하기 (0) | 2025.12.09 |
| Flyway 사용하기 (0) | 2025.12.04 |
| Spring batch + 스케줄링 (0) | 2025.11.27 |