[Spring] Hibernate @Where로 인한 논리 삭제 데이터 조회 문제 트러블 슈팅

2025. 2. 8. 17:25·Framework/Spring

 

 

문제 상황

논리 삭제된 데이터가 조회되지 않음

 

Spring Boot와 JPA를 사용해 논리 삭제(Soft Delete) 기능을 구현하던 중 예상치 못한 이슈가 발생했습니다.

`isDeleted = true` 조건으로 논리 삭제된 데이터를 조회하려 했으나,

Hibernate의 `@Where` 애노테이션이 모든 조회 쿼리에 `isDeleted = false` 조건을 강제 적용하면서

원하는 데이터를 가져오지 못하는 상황이 발생했습니다.

 

SQL 로그 확인 결과

SELECT * FROM user u WHERE u.is_deleted = false;

쿼리를 `isDeleted = true` 조건으로 작성했음에도 `is_deleted = false` 조건이 추가되어 논리 삭제된 사용자를 조회할 수 없었습니다.

 

 

 

 

문제 원인 분석

이 문제는 Hibernate의 `@Where` 애노테이션과 JPQL의 기본 필터 조건 적용 방식의 충돌로 발생했습니다.

 

1️⃣ @Where 애노테이션

`@Where(clause = "is_deleted = false")`는 모든 JPQL 및 기본 조회 쿼리에 자동으로 적용됩니다.

`findAllByIsDeletedTrue()` 메서드에서도 `is_deleted = false` 조건이 우선 적용되어 원하는 데이터를 조회할 수 없습니다.

2️⃣ Boolean 필드 매핑 이슈

Boolean 타입 필드가 데이터베이스의 `TINYINT(0, 1)`로 매핑되며 필터링 조건이 부정확하게 적용될 수 있습니다.

 

 

 


 

 

 

해결 방법

1️⃣ Native Query 사용

`@Where` 애노테이션이 모든 JPQL 조회에 기본 필터를 적용하기 때문에,

특정 상황에서는 `isDeleted = true` 조건으로 논리 삭제된 데이터를 조회하는 데 어려움이 발생합니다.

 

이때 Native SQL Query를 사용하면 `@Where` 필터 조건을 우회하여 정확한 데이터를 조회할 수 있습니다.

 

 

(1) Repository 클래스 수정

// 삭제 요청된 사용자 조회
@Query(value = "SELECT * FROM user WHERE is_deleted = true", nativeQuery = true)
List<User> findAllByIsDeletedTrue();

 

 

 

2️⃣ UserService 코드 수정

UserService에서 findAllSoftDeletedUsers() 메서드를 호출해 DTO로 변환합니다.

 

 

(2) Service 클래스 수정

// 논리 삭제된 사용자 조회
public List<UserResponseDto> getDeletedUsers() {
    return userRepository.findAllByIsDeletedTrue().stream()
            .map(UserResponseDto::toDto)
            .toList();
}

 

 

 


 

 

 

Spring Boot와 Hibernate의 논리 삭제 기능을 구현할 때,

`@Where` 애노테이션과 JPQL 필터 조건 충돌을 주의해야 합니다.

 

일반 조회에는 @Where로 필터링을 유지하고,

논리 삭제된 데이터를 조회할 때는 Native Query를 사용해 조건을 명확히 지정하는 것이 가장 안전합니다.

 

이러한 트러블슈팅 경험을 통해 데이터 무결성을 유지하면서도 효율적으로 데이터를 관리할 수 있는 시스템을 설계할 수 있습니다.

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'Framework/Spring' 카테고리의 다른 글
  • [Spring] Hibernate @Where 애노테이션 대신 @Filter로 특정 조건 조회하기
  • [Spring] 하이버네이트와 영속성 개념 완벽 이해 및 적용 방법
  • [Spring] JPA로 일정 시간 후 데이터 삭제 구현하기
  • [Spring] 동적 쿼리를 활용한 사용자 조회 기능 구현 및 트러블슈팅
leonie.
leonie.
  • leonie.
    leveloper
    leonie.
  • 글쓰기 관리
    • 분류 전체보기 N
      • Language
        • Java
      • Git
      • CS
      • CodingTest
        • [프로그래머스] 자바
      • Information
      • Framework
        • Spring
      • DBMS
        • Redis
        • SQL
      • AWS
      • OS
        • Mac
      • 자격증 N
        • 정보처리기사 N
      • 회고
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    정처기필기
    프로그래머스
    스프링
    springboot
    코딩테스트
    Java
    정보처리기사
    정처기
    알고리즘
    자바
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
leonie.
[Spring] Hibernate @Where로 인한 논리 삭제 데이터 조회 문제 트러블 슈팅
상단으로

티스토리툴바