Specifications
DDD 책을 보면 명세라는 개념을 소개한다.
언어 상관없이 and, or 조건을 조합해 쿼리할 수 있도록 하는 기능
스프링 데이터 JPA는 JPA Criteria를 활용해 명세를 지원한다.
Predicate
org.springframework.data.jpa.domain.Specification
참 또는 거짓으로 평가한다.
and, or 같은 연산자로 조합해서 다양한 검색 조건을 쉽게 생성한다.
public interface MemberRepository extends JpaSpecificationExecutor<Member> {
}
public interface JpaSpecificationExecutor<T> {
Optional<T> findOne(@Nullable Specification<T> spec);
List<T> findAll(Specification<T> spec);
Page<T> findAll(Specification<T> spec, Pageable pageable);
List<T> findAll(Specification<T> spec, Sort sort);
long count(Specification<T> spec);
}
JpaSpecificationExecutor를 상속하면 사용할 수 있다.
class MemberRepositoryTest {
@Test
public void specBasic() throws Exception {
Team teamA = new Team("teamA");
em.persist(teamA);
Member m1 = new Member("m1", 0, teamA);
Member m2 = new Member("m2", 0, teamA);
em.persist(m1);
em.persist(m2);
em.flush();
em.clear();
Specification<Member> spec = MemberSpec.username("m1").and(MemberSpec.teamName("teamA"));
List<Member> result = memberRepository.findAll(spec);
Assertions.assertThat(result.size()).isEqualTo(1);
}
}
실무에서는 QueryDSL을 더 많이 쓰기 때문에 참고만 한다.
Last updated
Was this helpful?