5장 : 스프링 데이터 JPA를 이용한 조회 기능

시작에 앞서

CQRS는 명령(Command) 모델과 조회(Query) 모델을 분리하는 패턴이다.

검색을 위한 스펙

검색 조건을 다양하게 조합해야 할 때 사용할 수 있는 것이 스펙이다. 스펙은 애그리거트가 특정 조건을 충족하는지를 검사할 때 사용하는 인터페이스다.

스프링 데이터 JPA를 이용한 스펙 구현

스프링 데이터 JPA는 검색 조건을 표현하기 위한 인터페이스인 Specification을 제공한다.

public interface Specification<T> extends Serializable {
    // not, where, and, or 메서드 생략

    @Nullable
    Predicate toPredicate(Root<T> root,
                    CriteriaQuery<?> query,
                    CriterialBuilder cb);
}

스펙 구현 클래스를 개별적으로 만들지 않고 별도 클래스에 스펙 생성 기능을 모아도 된다.

리포지터리/DAO에서 스펙 사용하기

스펙을 충족하는 엔티티를 검색하고 싶다면 findAll()메서드를 사용하면 된다.

스펙 조합

정렬 지정하기

스프링 데이터 JPA는 두 가지 방법을 사용해서 정렬을 지정할 수 있다.

1 . 메서드 이름에 OrderBy를 사용해서 정렬 기준 지정

findByOrdererIdOrderByNumberDesc 메서드는 다음 조회 쿼리를 생성한다.

  • ordererId 프로퍼티 값을 기준으로 검색 조건 지정

  • number 프로퍼티 값 역순으로 정렬

2 . Sort를 인자로 전달

아래와 같이 두 개 이상의 정렬 순서를 짧게도 표현 가능

페이징 처리하기

스펙 조합을 위한 스펙 빌더 클래스

동적 인스턴스 생성

JPA는 쿼리 결과에서 임의의 객체를 동적으로 생성할 수 있는기능을 제공하고 있다.

동적 인스턴스는 JPQL을 그대로 사용하므로 객체 기준으로 쿼리를 작성하면서도 동시에 지연/즉시 로딩과 같은 고민 없이 원하는 모습으로 데이터를 조회할 수 있다.

하이버네이트 @Subselect 사용

하이버네이트는 JPA 확장 기능으로 @Subselect를 제공하는데, @Subselect는 쿼리 결과를 @Entity로 매핑할 수 있는 유용한 기능이다.

서브 쿼리를 사용하고 싶지 않다면 네이티브 SQL 쿼리를 사용하거나 마이바티스와 같은 별도 매퍼를 사용해서 조회 기능을 구현해야 한다.

Image https://dribbble.com/shots/3657142-Roller-skating-cat

Last updated