Hello

Spring Data JPA Specification 간단한 사용 본문

spring

Spring Data JPA Specification 간단한 사용

nari0_0 2023. 8. 26. 19:00
728x90

간단한 검색이 필요한 API를 만들어야했는데, 쿼리 메서드를 사용해 작성하게 되면 서비스 코드에 if의 향연이 펼쳐 질 것 제외 했다. 그리고 프로젝트 규모가 너무 작아 Querydsl 사용하기 보다는 Srping Data JPA의 Specification을 사용해 보았습니다. Specification은 JPA Criteria를 활용해 조회 쿼리를 작성 하도록 지원합니다.

Specification 사용 방법

public interface NoticeRepo extends JpaRepository<Notice, Integer>, JpaSpecificationExecutor<Notice> {
}

기존에 사용하던 Repository에 JpaSpecificationExecutor 를 상속합니다.

JpaSpecificationExecutor 는 조회 기능만 지원합니다.

아래 이미지를 보면 매개변수로 Specification을 받는 것을 알 수 있습니다.

NoticeSpecification 쿼리 조건 함수 작성

 

public class NoticeSpecification {
    public static Specification<Notice> equalNoticeType(Integer type) {
        return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("NoticeType"), type);
    }

    public static Specification<Notice> equalStatus(Boolean status) {
        return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("status"), status);
    }
}

 

서비스코드 작성

public List<Notice> notices(Integer noticeType, Boolean status) {
    Specification<Notice> where = Specification.where((root, query, criteriaBuilder) -> null);
    if (noticeType != null) where = where.and(NoticeSpecification.equalNoticeType(noticeType));
    if (status != null) where = where.and(NoticeSpecification.equalStatus(status));
    return jobNoticeRepo.findAll(where, Sort.by(Sort.Direction.DESC, "id"));
}

넘겨 받은 매개변수에 따라 spce를 추가한다.

실행결과

    select
        notice0_.id as id1_0_,
        notice0_.contents as contents2_0_,
        notice0_.notice_type as notice_type3_0_,
        notice0_.language_id as language7_0_,
        notice0_.priority as priority4_0_,
        notice0_.status as status5_0_,
        notice0_.title as title6_0_ 
    from
        tb_notice notice0_ 
    where
        notice0_.status=? 
        and notice0_.notice_type=0 
    order by
        notice0_.id desc

나는 equal만 사용했지만, like, ls, gt, between, and, or 등 쿼리문을 사용할 수 있습니다.

 

참고 : https://www.baeldung.com/rest-api-search-language-spring-data-specifications

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl

728x90