001 R2dbc Intro

R2dbc 소개 #

왜 JDBC, JPA는 non-blocking을 지원할 수 없을까? #

  • JDBC : 동기 blocking I/O 기반으로 설계
  • Socket에 대한 연결과 쿼리 실행 모두 동기 blocking으로 동작
  • JPA 또한 JDBC 기반 -> 비동기 non-blocking 지원 불가 그래서 결국, 비동기 non-blocing 기반의 API, 드라이버를 새로 만든다.

R2dbc #

  • Reactive Relational Database Connectivity
  • 비동기 non-blocking 관계형 데이터베이스 드라이버
  • Reactive streams 스펙을 제공하며 Project reactor 기반으로 구현

R2dbc 지원 데이터베이스 #

  • 공식지원
    • r2dbc-h2
    • r2dbc-mssql
    • r2dbc-pool : Reactor pool로 커넥션 풀 제공
  • 벤더 지원
    • oracle-r2dbc
    • r2dbc-mariadb
    • r2dbc-postgresql
  • 커뮤니티 지원
    • r2dbc-mysql
      • mirromutth 에서 2020년 5월부터 업데이트 X
      • asyncer-io에서 RELEASE 지원 img.png

R2dbc MySQL 구조 #

  • r2dbc-spi와 Reactor Netty 기반
  • Reactor Netty를 이용하여 r2dbc-spi 스펙을 구현
  • Reactor Netty client로 성능과 확장성 모두 제공
  • r2dbc-spi 스펙을 구현하여 여러 데이터베이스 시스템과 호환 img_1.png

R2dbc SPI #

  • r2dbc Service Provider Interface
  • SPI에서 제공하는 인터페이스를 구현해야한다.
  • db connection 스펙, Exception 등의 스펙, Result, Row 등 result 스펙, Statement(요청) 스펙

img_2.png

R2dbc SPI Connection #

  • 데이터베이스에 대한 연결을 가리킨다.

  • Closable을 구현하여 close 메서드로 connection을 닫을 수 있다.

  • ConnectionMetadata를 제공

    • database의 version과 productName을 제공
  • createStatement를 통해서 sql을 넘기고 Statement를 생성한다. img_3.png

  • transaction 관련된 기능을 제공

  • transaction을 시작

    • TransactionDefinition로 고립 수준, 읽기 전용 여부, 이름, lockWaitTime 등을 설정
  • transaction savepoint를 생성

    • transaction 중간에 savepoint를 만들고 rollback 가능
  • transaction을 commit하거나 rollback img_4.png

R2dbc SPI ConnectionFactory #

  • connection을 생성하는 factory
  • ConnectionFactoryMetadat를 통해서 ConnectionFactory의 정보를 제공
  • ConnectionFactoryMetadata는 name을 제공 img_5.png

R2dbc SPI Statement #

  • Statement는 Connection으로부터 createStatement을 통해서 생성
    • bind : sql에 parameter를 bind
    • add : 이전까지 진행한 binding을 저장하고 새로운 binding을 생성
    • execute : 생성된 binding 수만큼 쿼리를 실행하고 publisher로 반환 img_6.png

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