JPA - @Where 어노테이션 Deprecated
사용 환경
Spring Data JPA 3.2.3 (Hibernate Core 6.4.4)
@Where
어노테이션을 사용하려고 보니 hibernate 6.3부터 deprecate 되었다고 나타났다.
그래서 https://stackoverflow.com/questions/77178963/is-there-a-replacement-for-the-in-6-3-deprecated-where-and-loader 를 참고하여 @Where
어노테이션을 사용할 자리에 @SQLRestriction
어노테이션을 적용하였다.
(참고한 링크를 타고 hibernate document에 가보면 @SQLRestriction
을 사용하라고 안내 되어 있다.)
Deprecated 전
1
2
3
@Entity
@Where(clause = "deleted = false")
public class Article {
Deprecated 후 @SQLRestriction 적용
1
2
3
@Entity
@SQLRestriction("deleted = false")
public class Article {
@SQLRestriction
https://docs.jboss.org/hibernate/orm/6.3/javadocs/org/hibernate/annotations/SQLRestriction.html
특징
- 직접 SQL 제약 조건을 정의하여 엔티티에 적용할 수 있도록 해주는 어노테이션이다.
- 데이터베이스에서 필터링을 수행한다.
@Where과의 차이점이 있는데, @Where은 Hibernate가 엔티티를 로드한 후에 메모리에서 필터링을 수행하고 @SQLRestriction은 데이터베이스에서 필터링 수행 후에 엔티티를 로드한다는 점이다.
@Where처럼 엔티티에 제약 조건을 정의하면서 메모리에서 동작하는 다른 어노테이션으로 @Filter
도 있다!
> 찾아본 @Filter에 대해 정리가 잘 되어있는 블로그
데이터는 변함이 없는데 where 조건이 자주 변하게 되는 상황이 온다면 메모리에서 필터링을 수행하는 @Filter
를 사용하는게 더 나을 것 같다는 생각을 했고,
해당 엔티티의 모든 조회되는 데이터에 적용해야 하는 조건이 있다면(예를 들면 게시판의 논리 삭제된 게시글 필터링) @SQLRestriction
을 사용하는게 좋을 것 같다는 생각을 하게되었다.
Hibernate Document
https://docs.jboss.org/hibernate/stable/orm/javadocs/org/hibernate/annotations/package-summary.html
JPA 사용 중 Deprecated 객체를 만나면 여기서 먼저 검색해보면 좋을 것 같다!