포스트

JPA - @Where 어노테이션 Deprecated

사용 환경
Spring Data JPA 3.2.3 (Hibernate Core 6.4.4)


@Where 어노테이션을 사용하려고 보니 hibernate 6.3부터 deprecate 되었다고 나타났다.
image


그래서 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

특징

  1. 직접 SQL 제약 조건을 정의하여 엔티티에 적용할 수 있도록 해주는 어노테이션이다.
  2. 데이터베이스에서 필터링을 수행한다.


@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 객체를 만나면 여기서 먼저 검색해보면 좋을 것 같다!

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.