006 R2dbc Entity Operations

06. R2dbcEntityOperations #

구조 #

  • R2dbcEntityTemplate가 R2dbcEntityOperations를 상속한다.
  • R2dbcEntityOperations가 FluentR2dbcOperations를 상속한다.
  • FluentR2dbcOperations는 여러 Operations를 상속한다.
    • ReactiveSelectOperation : select query와 관련된 메서드 제공
    • ReactiveInsertOperation : insert query와 관련된 메서드 제공
    • ReactiveUpdateOperation : update query와 관련된 메서드 제공
    • ReactiveDeleteOperation : delete query와 관련된 메서드 제공 img.png

ReactiveSelectOperation #

  • ReactiveSelectOperation의 select부터 시작
  • TerminatingSelect의 count, exists, first, one, all 등으로 종료
  • 구조
    • select -> from -> as -> matching -> 실행
    • select -> from -> matching -> 실행
    • select -> as -> matching -> 실행
    • select -> matching -> 실행
    • select -> -> 실행 img_1.png

ReactiveSelectOperation 사용 #

  • from : query를 실행할 table 이름을 전달
  • as : Entity를 전부 mapping 하지 않고 특정 필드만 mapping 하고 싶은 경우
    • Entity의 일부 프로퍼티만 담고 있는 subclass(혹은 인터페이스)를 넘겨서 projection
    • projection이 제공되지 않는다면 Entity에 모든 필드를 mapping img_2.png
  • matching : query의 where문에 해당
    • matching을 생략하면 table 전체에 대한 요청을 보내는 것과 동일
  • 실행 : 마지막으로 count, exists, first, one, all 등의 연산을 선택
    • count: 조건에 맞는 row의 개수 반환
    • exists: 조건에 맞는 row 존재 여부 반환
    • first: 조건에 맞는 첫 번째 row 반환
    • one: 조건에 맞는 하나의 row 반환. 하나가 넘으면 exception
    • all: 조건에 맞는 모든 row 반환 img_3.png

ReactiveSelectOperation 실행 #

  • ConnectionFactory를 이용하여 R2dbcEntityTemplate을 생성
  • Query와 Criteria를 이용해서 query 생성
  • PersonNameOnly class를 이용해서 name만 projection img_4.png img_5.png img_6.png

ReactiveInsertOperation #

  • ReactiveInsertOperation의 insert 부터 시작하여 TerminatingInsert의 using으로 종료
  • 구조
    • insert -> into -> using
    • insert -> using img_7.png

ReactiveInsertOperation 사용 #

  • into : query를 실행할 table 이름을 전달
  • using : insert query에 이용할 entity를 전달
    • 주어진 entity를 OutboundRow로 변환
    • 변환된 OutboundRow로 쿼리 실행 img_8.png

ReactiveInsertOperation 실행 #

  • into를 통해서 insert할 table 명시
  • entity를 생성하여 using에 전달 img_9.png img_10.png

ReactiveUpdateOperation #

  • ReactiveUpdateOperation의 update부터 시작하여 TerminatingUpdate의 apply로 종료
  • 구조
    • update -> inTable -> matching -> apply
    • update -> inTable -> apply
    • update -> matching -> apply
    • update -> apply img_11.png

ReactiveUpdateOperation 사용 #

  • inTable : query를 실행할 table 이름을 전달
  • matching : query의 where문에 해당
    • Query를 전달하여 query의 where에 들어갈 내용을 설정
    • matching을 생략하면 table 전체에 대한 요청을 보내는 것과 동일 img_12.png
  • apply : update를 수행
    • Entity가 아닌 Update 객체 전달
    • Update는 내부에 SqlIdentifier를 Key로 변경하려는 값을 Value로 갖는 Map 포함
    • from과 update static method로 Update 객체 생성
    • 결과로 영향을 받은 row의 숫자 반환 img_13.png

ReactiveUpdateOperation 실행 #

  • inTable을 통해서 update할 table 명시
  • matching으로 update 영향을 받는 row 제한
  • update를 생성하여 apply에 전달 img_14.png img_15.png

ReactiveDeleteOperation #

  • ReactiveDeleteOperation의 delete 부터 시작하여, TerminatingDelete의 all로 종료
  • 구조
    • delete -> from -> matching -> all
    • delete -> from -> all
    • delete -> matching -> all
    • delete -> all img_16.png

ReactiveDeleteOperation 사용 #

  • all : delete를 수행
    • 결과로 영향을 받은 row의 숫자 반환 img_17.png

ReactiveDeleteOperation 실행 #

  • from을 통해서 delete할 table 명시
  • maching으로 delete 영향을 받는 row 제한
  • all을 실행하여 결과 출력 img_18.png img_19.png

R2dbcEntityOperations #

  • FluentR2dbcOperations에서 제공하는 조합 방식 대신 다양한 쿼리를 수행하는 단축 메소드 제공
  1. Query 객체를 인자로 받는 경우 img_20.png

  2. Entity를 직접 인자로 받는 경우

  • insert, update의 경우 주어진 entity로 값을 추가하거나 변경
  • delete는 id를 추출하여 해당 id를 갖는 row를 제거 img_21.png

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