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

2023. 8. 5. 10:31스터디/DDD 스터디

728x90

# 시작에 앞서

CQRS : 명령 모델과 조회 모델을 분리하는 패턴. 상테(데이터) 변경 기능 구현시에는 명령 모델, 데이터를 보여주는 기능을 구현할 때는 조회 모델 사용

 

# 검색을 위한 스펙

스팩 Specification : 검색 조건을 다양하게 조합해야 할 때 사용할 수 있는 것

agg는 애그리거트 루트, agg는 검색 결과로 리턴할 데이터 객체가 됨.

Spec 인터페이스 예시
Spec 인터페이스 구현 예시

만약 리포지터리가 메모리에 모든 애그리거트를 보관하고 있다면 다음과 같이 사용 가능하나, 실제로는 모든 데이터를 메모리에 저장을 못하기에 사실상 위와 같이 사용 불가능

실제 스펙은 사용하는 기술에 맞춰 구현하게 됨

 

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

JPA 크리테리아 API를 같이 이용

 

스펙은 and 혹은 or, where 등으로 조합이 가능함

 

 

##### 개인적으로 가지는 의문점 

1. 크리테리아 문법이 가독성이 떨어지는 것으로 보이는데, 차라리 QueryDSL 혹은 JooQ 로 대체를 못하는 것인가

2. 정적 메타 모델을 사용할 바에 차라리 Enum으로 관리를 하는게 낫지 않나? 

 

# 정렬 지정하기

스프링 데이터 JPA에서 정렬 지정 방법

- 메서드 이름에 OrderBy를 사용

- Sort 인자를 전달

# 페이징 처리

find에 Pageable 파라미터를 사용하면 페이징을 자동으로 처리

페이징 처리와 관련된 정보가 필요 없다면 Page 리턴 타입이 아닌 List를 사용해서 불필요한 Count쿼리를 실행하지 않도록 함

 

처음부터 N 개의 데이터가 필요하다면 Pageable을 사용하지 않고 First 혹은 Top를 사용해도 됨

 

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

스팩 빌더를 이용해서 다양한 스펙 조합 가능

 

# 동적 인스턴스 생성

# 하이버네이트 @Subselect 사용

@Subselect는 쿼리 결과를 @Entity로 매핑함

- @Subselect를 사용하면 쿼리 실행 결과를 매핑할 테이블 처럼 사용

- @Subselect로 조회한 @Entity 역시 수정 불가

- @Immutable을 사용하면 해당 엔티티의 매핑 필드/프로퍼티가 변경돼요 DB에 반영하지 않고 무시

- @Synchroize는 해당 엔티티와 관련된 테이블 목록을 명시, 엔티티를 로딩하기 전에 지정한 테이블과 관련된 변경이 발생하면 플러시를 먼저 함

 

728x90

'스터디 > DDD 스터디' 카테고리의 다른 글

도메인 서비스  (0) 2023.08.18
응용 서비스와 표현 영역  (0) 2023.08.12
리포지터리와 모델 구현  (0) 2023.07.28
애그리거트  (0) 2023.07.19
도메인 주도 개발 시작하기  (0) 2023.07.11