도메인 주도 개발 시작하기 - 5장
5장 스프링 데이터 JPA를 이용한 조회 기능
5.1
CQRS는 명령모델과 조회모델을 분리하는 패턴
5.2
검색 조건이 고정되어 있고 단순하면 특정 조건으로 조회하는 기능을 만들면 된다.
다양한 검색조건을 조합해야할 때 사용할 수 있는 것이 스펙이다.
검사 대상 객체가 조건을 충족하면 true를 리턴하고 그렇지 않으면 false
JPA를 이용한 스펙구현에 대해 알아볼 것
5.3
JPA 크리테리아 API에서 조건을 표현하는 Predicate
스펙 구현 클래스를 개별적으로 만들지 않고 별도 클래스에 스펙 생성 기능을 모아도 된다.
스펙 인터페이스는 함수영 인터페이스이다.
5.4
스펙을 충족하는 엔티티를 검색하고 싶다면 findAll() 메서드를 사용하면 된다.
스펙 구현체를 사용하면 특정 조건을 충족하는 엔티티를 검색할 수 있다.
5.5
and와 or을 이용해서 스펙을 조합한다.
and, or은 기본 구현을 가진 디폴트 메서드이다.
not 메서드도 제공
5.6
orderby, sort를 사용해서 정렬
정렬 기준 프로퍼티가 두 개 이상이면 메서드 이름이 길어지는 단점
정렬순서가 정해지기 때문에 상황에 따라 정렬순서를 변경할 수 없다. 이럴때는 Sort타입 사용
5.7
Pageable 타입 파라미터를 사용하면 페이징을 자동으로 처리해준다.
PageRequest와 Sort를 사용하면 정렬 순서를 지정할 수 있다.
Page 타입은 전체 개수도 구할 수 있다.
스펙을 사용하는 findAll() 메서드도 Pageable을 사용할 수 있다.
findBy프로퍼티 형식의 메서드는 Pageable 타입을 사용하더라도 리턴 타입이 List면 Count 쿼리를 실행하지 않는다.
스펙을 사용하고 페ㅣ징 처리르 ㄹ하면서 Count 쿼리를 실행하고 싶지 않다면 스피링 데이터 JPA가 제공하는 커스텀 리포지터리 기능을 이용해서 직접구현
처음부터 N개의 데이터가 필요하다면 findFirstN을 사용한다.
First 대신 Top을 사용해도 된다.
5.8
if와 각 스펙을 조합하는 코드가 섞여 있어 실수하기 좋고 복잡한 구조를 갖는다. 이떄 스펙 빌더를 만들어 사용한다.
5.9
JPQL의 selet 절을 보면 new키워드가 있다.
생성자로 전달받은 데이터를 저장한다.
JPQL을 그대로 사용하므로 객체 기준으로 쿼리를 작성하면서도 동시에 지연/즉시 로딩과 같은 고민 없이 원하는 모습으로 데이터를 조회할 수 있다는 점이다.
5.10
Subselect, Immutable, Synchronize는 쿼리 결과를 @Entity로 매핑할 수 있는 유용한 기능
Subselect 의 update문제를 해결하기 위해서 Immutable 사용
Synchronize는 변경이 발생할 때 flush를 하므로 조회 시 최신 데이터를 읽을 수 있게 해준다.
Subselect에서 서브쿼리를 사용하고 싶지 않다면 네이티브 SQL 쿼리, 마이바티스를 사용해서 조회 기능을 구현해야한다.