Backend/SpringBoot

@SQLRestriction 및 논리 삭제

Dean83 2025. 12. 11. 16:04

물리적으로 데이터를 삭제하는것이 아닌 논리적으로 데이터를 삭제 할 경우는 특정컬럼 (예 : 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