콘텐츠로 이동
Bluetape4k 문서1.11

R2DBC 생태계 학습 경로

최신 안정판 Bluetape4k 1.11.0 릴리스 기준

같은 database를 사용해도 필요한 제어 수준에 따라 시작점이 달라집니다.

필요한 것권장 시작점
Spring Data entity mapping과 coroutine CRUDbluetape4k-spring-boot-r2dbc
raw SQL, binding, custom row mapping, connection·transaction helperbluetape4k-r2dbc
Kotlin table DSL, DDL/DML, repository abstractionbluetape4k-exposed R2DBC
blocking driver 생태계와 단순한 transaction modelbluetape4k-jdbc
object graph, dirty checking, persistence contextbluetape4k-hibernate

R2DBC가 항상 JDBC보다 낫다는 뜻은 아닙니다. 호출 경로가 실제로 non-blocking이어야 하고, 사용하는 database와 driver가 필요한 기능을 지원해야 합니다.

이 모듈에서 먼저 익힐 것은 R2dbcEntityOperations, Query, Criteria, Flow, suspend cardinality입니다. 내부 coroutines.blog 예제를 따라 entity→repository→controller 흐름을 실행합니다.

추천 순서:

  1. PostRepository의 전체·단건 조회
  2. CommentRepository의 조건 Flow와 count
  3. R2dbcEntityOperationsExtensionsTest의 CRUD cycle
  4. PostControllerTest의 WebFlux 경계

Spring Data entity abstraction으로 표현하기 어려운 join, DTO projection, vendor SQL이 생기면 bluetape4k-r2dbc로 내려갑니다. connection pool과 transaction lifecycle, typed null binding, raw SQL mapping은 core R2DBC 매뉴얼에 따로 설명되어 있습니다.

한 애플리케이션에서 두 모듈을 함께 사용할 수 있습니다. 단순 entity CRUD는 이 모듈에 두고, 복잡한 조회만 R2dbcClientDatabaseClient로 구현하면 됩니다.

SQL을 직접 쓰되 table·column을 Kotlin DSL로 표현하고 repository 패턴을 쌓고 싶다면 bluetape4k-exposed의 R2DBC 모듈을 검토합니다. Spring Data mapping과 Exposed table mapping은 서로 다른 model이므로 한 aggregate를 두 persistence model로 중복 소유하지 않게 경계를 정합니다.

Exposed R2DBC Workshop은 다음 흐름을 실행 예제로 제공합니다.

  • table과 schema 정의
  • coroutine transaction과 CRUD
  • repository와 domain mapping
  • Spring WebFlux integration
  • 실제 database를 사용한 test와 운영 패턴

기존 JDBC driver와 library가 충분하고 요청 처리량보다 구현 단순성이 중요하면 JDBC가 더 나을 수 있습니다. virtual thread나 명시적인 Dispatchers.IO 경계도 선택지입니다. 반대로 WebFlux부터 driver까지 non-blocking 흐름을 유지하고 많은 concurrent I/O를 처리해야 한다면 R2DBC가 맞습니다.

JDBC 매뉴얼은 blocking connection, transaction, statement lifecycle을 설명합니다. 기술 이름이 아니라 application 호출 경로와 driver 성숙도를 기준으로 고릅니다.

  • one, oneOrNull, first, Flow의 cardinality를 테스트로 구분했다.
  • update/delete의 반환 행 수를 domain 조건과 비교한다.
  • transaction owner와 connection/pool owner를 문서에 적었다.
  • H2 test와 운영 database test가 증명하는 범위를 구분했다.
  • raw SQL이 필요한 query와 entity operation을 분리했다.
  • blocking library를 coroutine 함수 안에서 직접 호출하지 않는다.

현재 application에 필요한 수준을 골랐다면 해당 매뉴얼의 첫 장에서 작은 repository 하나를 구현합니다. 기능이 커질 때만 다음 abstraction으로 이동합니다.