Querydsl 사용시 SoftDelete 된 엔티티가 조회가 되어버리는 이슈를 확인해봅니다.
join 에 들어가는 엔티티에 대해서는
@Where
어노테이션이 동작하지 않는것을 알아봅니다.
Goal
- Querydsl 사용시
@Where
조건이 동작하지 않는 이슈를 확인해봅니다. - 해결방법을 알아봅니다.
엔티티 조건
두개의 엔티티 전부
@Where(clause = "deleted_at is null")
어노테이션을 달아주어 SoftDelete 된 조건은 조회해오지 않게 하였습니다.
Member
1 |
|
team
1 |
|
from 절에 있는 엔티티 조회시
엔티티의
@where
어노테이션에 걸려있는 쿼리가 추가되어 나갑니다.
Dao
1 |
|
조회 결과
1 |
|
- 쿼리를 확인해보면
@Where(clause = "deleted_at is null")
조건에 따라서 필터링이 되는것을 확인할 수 있습니다.
join 에 들어가는 엔티티는 @where 어노테이션이 동작하지 않습니다.
SoftDelete 된 엔티티가 조회될 수 있습니다.
Dao
1 |
|
조회 결과
1 |
|
- team 에 대해서만
@where
어노테이션의 조건이 추가되고, member 엔티티에@where
는 동작하지 않아서 softDelete 된 member 엔티티도 조회되어버립니다.
해결방법
조건을 쿼리에 명시적으로 추가 해줍니다.
1 |
|
- softDelete 조건으로 따지는
delted_at
에 isNull 을 추가 해주면 조건이 추가되어 걸러지는것을 확인할 수 있습니다.
Conclusion
- QueryDsl 사용시 join 에 들어가는 엔티티 테이블에 대해서는
@Where
어노테이션이 동작하지않아, 원하지 않는 결과가 나올수 있다. - join 에 들어가는 엔티티에 대해서는 미조회 조건을 쿼리에 넣어주자.
Code
- 관련된 코드는 Github 에서 볼 수 있습니다.