Reactive Relational Database Connectivity(R2DBC)

김기현·2025년 8월 4일

Spring WebFlux

목록 보기
17/28

Reactive Relational Database Connectivity(R2DBC)는 관계형 데이터베이스에 반응형 프로그래밍 API를 제공하는 프로젝트이다.
기존의 JDBC(Java Database Connectivity)가 블로킹 방식으로 동작하여 리액티브 스택과의 통합에 어려움이 있었던 문제를 해결하기 위해 등장했다.


R2DBC의 핵심 개념 및 특징

리액티브 스트림즈 기반

  • R2DBC는 리액티브 스트림즈 명세(Specification)를 기반으로 한다.
  • 이는 비동기적이고 논블로킹 방식으로 데이터를 처리한다.
  • 배압(Backpressure)를 지원항 생산자(Publisher)가 소비자(Subscriber)의 처리 속도를 넘어서 데이터를 생산하지 않도록 한다.

논블로킹 I/O

  • JDBC는 데이터베이스 작업 시 해당 세르드를 블로킹하여 응답을 기다린다.
  • 이는 높은 동시성 환경에서 많은 스레드를 필요로 하게 되고 리소스 낭비와 성능 저하를 초래할 수 있다.
  • 반면 E2DBC는 논블로킹 I/O를 사용하여 스레드가 데이터베이스 응답을 기다리는 동안 다른 작업을 수행할 수 있도록 한다.

Service Provider Interface (SPI)

  • R2DBC는 드라이버 벤더가 구현하고 클라이언트 라이브러리가 사용할 수 있는 개방형 SPI를 정의한다.
  • 이를 통해 다양한 관게형 데이터베이스에 대한 리액티브 드라이버를 개발할 수 있다.

확장성 및 효율성

  • 연결당 하나의 스레드라는 기존 모델에서 벗어나 더 강력하고 확장 가능한 접근 방식을 가능하게 한다.
  • 적은 수의 스레드로 더 많은 동시 요청을 처리할 수 있어 CPU 및 메모리 사용 효율을 높인다.

리액티브 스택과의 통합

  • Spring WebFlux와 같은 리액티브 웹 프레임워크와 함께 사용될 때 R2DBC는 애플리케이션 전체 스택을 논블로킹으로 유지하여 진정한 리액티브 애플리케이션을 구축할 수 있도록 돕는다.

R2DBC와 JDBC의 차이점

특징JDBCR2DBC
I/O 모델블로킹논블로킹
스레드 모델일반적으로 "연결 하나 당 하나의 스레드"를 사용
(스레드 풀 사용)
적은 수의 스레드로 많은 연결을 처리
이벤트 루프 기반
프로그래밍동기(Synchronous) 방식비동기(Asynchronous) 빛 반응형(Reactive) 방식
(Publisher/Subscriber)
확장성높은 동시성에 스레드 오버헤드로 인한 확장성 제한높은 동시성에 효율적인 리소스 사용으로 확장성 우수
사용 편의성익숙하고 성숙한 API반응형 프로그래밍 패러다임 이해 필요
성숙도매우 성숙하고 광범위하게 사용비교적 새로운 기술이다
주요 사용처전통적인 엔터프라이즈 애플리케이션, 단순한 CRUD 작업고성능, 고확장성, 마이크로서비스, 이벤트 기반 애플리케이션

R2DBC의 장점

  • 향상된 성능 및 처리량: 높은 동시성 환경에서 더 적은 CPU와 메모리를 사용하여 더 빠른 응답 시간과 더 높은 처리량을 제공한다.
  • 리소스 효율성: 스레드 블로킹이 없으므로 제한된 수의 스레드로 더 많은 요청을 처리할 수 있어 서버 리소스 사용을 최적화한다.
  • 확장성: 클라우드 네이티브 애플리케이션 및 마이크로서비스 아키텍처에서 고확장성 시스템을 구축하는 데 적합하다.
  • 반응형 스택과의 통합: Spring WebFlux와 같은 반응형 프래임워크와 완벽하게 어울려 엔드 투 엔드 리액티브 애플리케이션을 구축할 수 있다.
  • 백프레셔 지원: 생산자가 소비자의 처리능력을 초과라여 데이터를 푸쉬하는 것을 방지하여 시스템 과부하를 막는다.

R2DBC의 단점 및 고려사항

  • 제한된 드라이버 지원: 주요 관계형 데이터베이스는 R2DBC 드라이버를 제공하지만 일부 데이터베이스는 공식적인 R2DBC 드라이버가 없을 수 있다.
  • 디버깅의 복잡성: 비동기 및 논블로킹 특성으로 인해 전통적인 블로킹 코드보다 디버깅이 더 복잡할 수 있다.
  • 성숙도: JDBC에 비해 비교적 새로운 기술이므로 복잡한 프로덕션 환경에서는 아직 보완할 부분이 많을 수 있다.
  • ORM의 부재: R2DBC 자체는 JPA와 같은 완전한 ORM 기능을 제공하지 않는다. Spring Data R2DBC는 어느 정도 객체 매핑과 추상화를 제공하지만, JPA의 캐싱이나 지연 로딩 같은 기능은
    제공하지 않는다.

정리

  • R2DBC는 고성능, 고확장성 애플리케이션, 특히 마이크로서비스 아키텍처나 이벤트 기반 시스템에서 관계형 데이터베이스와 효율적으로 상호작용하기 위한 솔루션이다.
  • 논블로킹 I/O와 리액티브 스트림즈를 통해 리소스 활용을 최적화하고 응답성을 향상시키지만 반응형 프로그래밍에 대한 이해와 아직 JDBC만큼 성숙하지 않다는 단점이 있다.
  • 전체 애플리케이션 스택이 리액티브하다면 R2DBC는 데이터베이스 통신을 위한 좋은 선택이다.
profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글