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 지원
- r2dbc-mysql
R2dbc MySQL 구조 #
- r2dbc-spi와 Reactor Netty 기반
- Reactor Netty를 이용하여 r2dbc-spi 스펙을 구현
- Reactor Netty client로 성능과 확장성 모두 제공
- r2dbc-spi 스펙을 구현하여 여러 데이터베이스 시스템과 호환
R2dbc SPI #
- r2dbc Service Provider Interface
- SPI에서 제공하는 인터페이스를 구현해야한다.
- db connection 스펙, Exception 등의 스펙, Result, Row 등 result 스펙, Statement(요청) 스펙
R2dbc SPI Connection #
-
데이터베이스에 대한 연결을 가리킨다.
-
Closable을 구현하여 close 메서드로 connection을 닫을 수 있다.
-
ConnectionMetadata를 제공
- database의 version과 productName을 제공
-
createStatement를 통해서 sql을 넘기고 Statement를 생성한다.
-
transaction 관련된 기능을 제공
-
transaction을 시작
- TransactionDefinition로 고립 수준, 읽기 전용 여부, 이름, lockWaitTime 등을 설정
-
transaction savepoint를 생성
- transaction 중간에 savepoint를 만들고 rollback 가능
-
transaction을 commit하거나 rollback
R2dbc SPI ConnectionFactory #
- connection을 생성하는 factory
- ConnectionFactoryMetadat를 통해서 ConnectionFactory의 정보를 제공
- ConnectionFactoryMetadata는 name을 제공
R2dbc SPI Statement #
- Statement는 Connection으로부터 createStatement을 통해서 생성
- bind : sql에 parameter를 bind
- add : 이전까지 진행한 binding을 저장하고 새로운 binding을 생성
- execute : 생성된 binding 수만큼 쿼리를 실행하고 publisher로 반환
- 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_