@SQLRestriction vs @Where vs @Filter

haruceki·2025년 2월 13일

1️⃣ @SQLRestriction

엔티티에 SQL 조건을 추가해서 조회시 자동 필터링되도록 하는 방법.
즉, 엔티티 레벨에서 조건이 강제되는, Hibernate가 내부적으로 SQL에 직접 포함하며, QueryDSL, Criteria API, JPQL을 사용할 때도 항상 적용된다.

JPA가 자동 적용되며, 성능 최적화가 가능하며 일괄 적용되는 장점이 있지만, 특정 조회에서 제외 처리하기가 어렵고 쿼리 성능이 저하될 수 있으며 동적으로 변경이 불가능하다는 단점이 있다. 그래서 실제로 잘 쓰이지는 않는다.

2️⃣ @Where

특정 필드에 대한 조건을 자동으로 추가한다. @SQLRestriction과 비슷하지만 JPQL에는 적용되지 않고 @Filter 처럼 동적으로 변경할 수 없다.

👉 @SQLRestriction보다는 가볍게 적용 가능하지만, QueryDSL 등에서는 무시될 수 있음

  • 예시
@Entity
@Where(clause = "is_delete = false")
public class User {
    @Id
    private Long id;

    private Boolean isDelete;
}

3️⃣ @Filter

Hibernate에서 제공하는 동적 필터링 기능으로, Session.enableFilter()를 사용해서 특정 조건을 동적으로 적용 가능하다. 특정 쿼리에 대해서만 적용할 수도 있다.

동적 필터링 즉 필요한 경우만 활성화하고 쓰이지 않는 경우 비활성화가 가능하지만, 적용하기 위해서는 Session이 필요하다.

  • 예시
@Entity
@FilterDef(name = "deletedFilter", parameters = @ParamDef(name = "isDeleted", type = "boolean"))
@Filter(name = "deletedFilter", condition = "is_delete = :isDeleted")
public class User {
    @Id
    private Long id;

    private String username;

    private Boolean isDelete;
}
  • 사용 예시
Session session = entityManager.unwrap(Session.class);
session.enableFilter("deletedFilter").setParameter("isDeleted", false);
profile
희망도 절망도 없이 매일 코딩을 한다.

0개의 댓글