07. R2dbcRepository #
R2dbcRepository 구조 #
- ReactiveSortingRepository와 ReactiveQueryByExampleExecutor를 상속한 interface인 SimpleR2dbcRepository에서 구현
R2dbcRepository 등록 #
- R2dbcRepositoriesAutoConfiguration가 활성화되어 있다면 SpringBootApplication 기준으로 자동으로 scan
- 혹은 EnableR2dbcRepositories를 통해서 repository scan
- 만약 여러 r2dbcEntityTemplate이 존재하거나 여러 데이터베이스를 사용하는 경우, basePackages, entityOperationRef 등을 통해서 다른 경로, 다른 entityTemplate 설정 가능
Repository #
- Spring data에서는 Repository interface를 제공
- 데이터에 접근하는 계층을 추상화하고 CRUD 작업, Entity mapping, SQL 쿼리 생성 등을 자동으로 수행
ReactiveCrudRepository #
- Spring data reactive에서는 CrudRepository의 Reactive 버전인 ReactiveCrudRepository 지원
- entity의 CRUD에 집중
- 모든 결과값 그리고 일부 인자들이 Publisher 지원
ReactiveCrudRepository - save #
- saveAll은 @Transactional을 사용해서 각각의 save를 하나의 tx로 묶고 concatMap을 통해서 save를 순차적으로 수행
ReactiveCrudRepository - find #
- id 기반으로 하나 혹은 여러 개의 항목을 탐색하거나 존재 여부를 확인
- 모든 항목을 탐색하거나 모든 항목의 개수를 확인
ReactiveCrudRepository - delete #
- id 기반으로 하나 혹은 여러 개의 항목을 제거하거나
- 하나 혹은 여러 개의 entity를 기반으로 id를 추출하여 제거하거나, 모두 제거
ReactiveSortingRepository #
- ReactiveCrudRepository를 상속
- spring data의 Sort를 기반으로 여러 항목 탐색 Sort 객체는 여러 Order 객체를 포함
- 이를 기반으로 query에 sort 옵션을 제공
SimpleR2dbcRepository #
- R2dbcRepository를 구현
- R2dbcEntityOperations를 기반으로 SQL 쿼리를 실행하고 결과를 Entity로 mapping
- 기본적으로 모든 메소드에 @Transactional(readOnly = true) 적용
SimpleR2dbcRepository - save #
new entity 확인 전략 @Id에 해당하는 필드를 확인. 만약 @Id 필드가 null이거나 0이라면 새로운 entity로 간주
SimpleR2dbcRepository - find #
- findById, existsById, count 모두 R2dbcEntityOperations에서 제공하는 단축 메소드 (selectOne, exists, count) 사용
SimpleR2dbcRepository - delete #
- R2dbcEntityOperations에서 제공하는 단축 메소드 (delete) 사용
R2dbcRepository의 한계 #
- R2dbcRepository는 기본적으로 CRUD를 수행할 수 있는 메소드를 제공
- 모두 혹은 id 기반으로 CRUD를 제공
- 특정 필드로 탐색을 하거나 상위 n개만 조회 등의 기능은 제공되지 않는다
- join이나 집계와 관련된 함수들은 제공되지 않는다.
한계 해결 : query method 사용
- 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_