007 R2dbc Repository

07. R2dbcRepository #

R2dbcRepository 구조 #

  • ReactiveSortingRepository와 ReactiveQueryByExampleExecutor를 상속한 interface인 SimpleR2dbcRepository에서 구현 img.png

R2dbcRepository 등록 #

  • R2dbcRepositoriesAutoConfiguration가 활성화되어 있다면 SpringBootApplication 기준으로 자동으로 scan
  • 혹은 EnableR2dbcRepositories를 통해서 repository scan
    • 만약 여러 r2dbcEntityTemplate이 존재하거나 여러 데이터베이스를 사용하는 경우, basePackages, entityOperationRef 등을 통해서 다른 경로, 다른 entityTemplate 설정 가능 img_1.png img_2.png

Repository #

  • Spring data에서는 Repository interface를 제공
  • 데이터에 접근하는 계층을 추상화하고 CRUD 작업, Entity mapping, SQL 쿼리 생성 등을 자동으로 수행 img_3.png

ReactiveCrudRepository #

  • Spring data reactive에서는 CrudRepository의 Reactive 버전인 ReactiveCrudRepository 지원
  • entity의 CRUD에 집중
  • 모든 결과값 그리고 일부 인자들이 Publisher 지원 img_4.png

ReactiveCrudRepository - save #

  • saveAll은 @Transactional을 사용해서 각각의 save를 하나의 tx로 묶고 concatMap을 통해서 save를 순차적으로 수행 img_5.png

ReactiveCrudRepository - find #

  • id 기반으로 하나 혹은 여러 개의 항목을 탐색하거나 존재 여부를 확인
  • 모든 항목을 탐색하거나 모든 항목의 개수를 확인 img_6.png

ReactiveCrudRepository - delete #

  • id 기반으로 하나 혹은 여러 개의 항목을 제거하거나
  • 하나 혹은 여러 개의 entity를 기반으로 id를 추출하여 제거하거나, 모두 제거 img_7.png

ReactiveSortingRepository #

  • ReactiveCrudRepository를 상속
  • spring data의 Sort를 기반으로 여러 항목 탐색 Sort 객체는 여러 Order 객체를 포함
  • 이를 기반으로 query에 sort 옵션을 제공 img_8.png

SimpleR2dbcRepository #

  • R2dbcRepository를 구현
  • R2dbcEntityOperations를 기반으로 SQL 쿼리를 실행하고 결과를 Entity로 mapping
  • 기본적으로 모든 메소드에 @Transactional(readOnly = true) 적용 img_9.png

SimpleR2dbcRepository - save #

img_10.png

new entity 확인 전략 @Id에 해당하는 필드를 확인. 만약 @Id 필드가 null이거나 0이라면 새로운 entity로 간주 img_11.png

SimpleR2dbcRepository - find #

  • findById, existsById, count 모두 R2dbcEntityOperations에서 제공하는 단축 메소드 (selectOne, exists, count) 사용 img_12.png

SimpleR2dbcRepository - delete #

  • R2dbcEntityOperations에서 제공하는 단축 메소드 (delete) 사용 img_13.png

R2dbcRepository의 한계 #

  • R2dbcRepository는 기본적으로 CRUD를 수행할 수 있는 메소드를 제공
    • 모두 혹은 id 기반으로 CRUD를 제공
    • 특정 필드로 탐색을 하거나 상위 n개만 조회 등의 기능은 제공되지 않는다
  • join이나 집계와 관련된 함수들은 제공되지 않는다.

한계 해결 : query method 사용


  1. 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_