[R2DBC 알아보기] 1. R2DBC란 무엇인가?

effiRin·2022년 11월 13일
4

R2DBC

목록 보기
1/4
post-thumbnail

1. R2DBC


R2DBC 정의

R2DBC (Reactive Relational Database Connectivity)는 이름 그대로 관계형 DB에서 reactive programming을 가능하게 해주는 데이터베이스 접근 API다.


R2DBC의 등장 배경 그리고 장점

R2DBC적은 스레드로 동시성을 처리하고 더 적은 하드웨어 리소스로 확장할 수 있는 논블로킹(non-blocking) 어플리케이션 스택이 필요해지면서 등장했다.

기존에 많이 쓰이던 관계형 데이터베이스 접근 API는 주로 JDBC였다. 그러나 JDBC는 블로킹(blocking) API 였고, ThreadPool로 블로킹 동작을 절충하려고 해도 완전한 논블로킹 서비스를 구축할 수 없었다.

또한 몇몇 NoSQL 드라이버가 자체 Reactive Database Clients를 제공하고 있지만, 대다수의 어플리케이션이 관계형 데이터베이스에 데이터를 저장하고 있고, NoSQL로의 마이그레이션은 프로젝트에서 쉽지 않은 선택이었다.

이는 결국 논블로킹 데이터베이스 드라이버와도 잘 동작하는 새로운 공통 API를 만드는 계기가 되었고, 적은 스레드와 하드웨어로 더 많은 동시 처리를 할 수 있는 R2DBC가 탄생했다.


R2DBC를 사용할 때의 단점

1. JDBC나 JPA에서 쉽게 사용했던 여러 기능들을 제공하지 않는다.

아래 글에서 보면 다음과 같은 기능을 제공하지 않는다고 나와있다.

Spring Data R2DBC aims at being conceptually easy. In order to achieve this, 
it does NOT offer caching, lazy loading, write-behind, or many other features of ORM frameworks. 
This makes Spring Data R2DBC a simple, limited, opinionated object mapper.

- 출처 : Spring Data Overview

R2DBC는 개념적으로 쉬운 것을 목표로 하고 있다. 이를 달성하기 위해, R2DBC는 caching, lazy loading, write-behind 등 ORM 프레임워크의 많은 기능들을 제공하지 않는다. 이는 R2DBC를 단순하고, 제한적이고, 독단적인(유연하지 않은) object mapper가 되도록 만들었다.



2. 몇몇 관계형 DB는 아직 공식적인 R2DBC driver implementation(드라이버 구현체)이 없다.

R2DBC를 사용하기 위해선 데이터베이스에 맞는 R2DBC driver와 그 구현체를 의존성 추가해줘야 하는데, 아직 모든 관계형 DB가 reactive driver를 지원하는 것이 아니다.
(또한 다른 reactive 드라이버들이 있다 해도(예 : Quarkus Reactive Postgres 클라이언트), 이는 R2DBC를 사용하지 않으며 성능적으로 다른 특성을 갖는다.)

공식적인 드라이버 구현체가 적어서 R2DBC를 사용하려면 비공식 드라이버 구현체를 써야 하고, 이는 가용성을 저하시킬 수밖에 없다.
(+ 가용성(Availability, 可用性) : 서버, 네트워크 등의 정보 시스템이 장애 없이 정상적으로 요청된 서비스를 수행할 수 있는 능력)

즉, R2DBC는 '가용성'이 떨어진다.



3. R2DBC가 JDBC의 후계자가 되지 않을 수도 있다. (= R2DBC는 결국 JDBC의 대체제가 될 수 없다는 뜻.)

적은 스레드, 적은 하드웨어로 더 많은 동시 처리를 할 수 있다는 R2DBC의 장점은, JDBC의 대체제로서 제안되기도 했다.
그러나, 2017년부터 시작된 'Project Loom'이란 OpenJDK 프로젝트가 등장하면서, R2DBC가 JDBC의 후계자가 될 수 없다는 이야기가 나오기 시작했다.

Project Loom은 새로운 유형의 Java 스레드 (Java Fiber)를 포함하여 가벼운 동시성 처리를 제공하는 것을 목표로 하고 있다. 즉, R2DBC의 장점(동시성 처리)을 갖고 있으면서, 추가적인 프레임워크 필요없이 JVM 자체에서 처리되도록 만들어진 셈이다.

이는 R2DBC는 물론이고 데이터베이스의 드라이버 환경이 크게 변할 수 있다는 것을 뜻한다.
그렇기 때문에, R2DBC가 JDBC를 뛰어넘는 대체제가 될 수 있는지는 아직 확신할 수 없다.


[참고] Project Loom에 대해서
이번 Java 19에서 Project Loom의 가상 스레드와 구조화된 동시성을 맛볼 수 있도록 preview 버전으로 나왔다고 한다.

궁금하면 아래의 링크들을 읽어보자.
https://nipafx.dev/inside-java-newscast-27/
http://gunsdevlog.blogspot.com/2020/09/java-project-loom-reactive-streams.html



4. 이외에도…

1) 애플리케이션 서버들이 여전히 JDBC에 의존하고 있다는 점

2) 신생 기술이고, 비교적 사용하는 곳이 많지 않아 R2DBC의 자료가 극히 적다는 점 (아주 치명적인 단점)

~~3) 난 JPA 쓰고 싶은데 reactive repository를 써야 한다면 R2DBC를 써야 한다는 점 ~~
(JPA는 R2DBC가 제공하는 만큼의 reactive repository 처리를 지원하지 않는다)


이런 기타 등등의 단점들도 있다...



[참고 2]

아래의 데이터베이스 드라이브는 현재 R2DBC와 함께 사용될 수 있으며, 논블로킹으로 처리된다.

- H2
- MariaDB
- MySQL
- Postgres
- Oracle
- Microsoft SQL Server  (MS SQL)
- jasync
- sql MySQL



[출처]

Spring Data R2DBC - Reference Documentation
[R2DBC] R2DBC란 무엇인가?
What is R2DBC?
Spring: Blocking vs non-blocking: R2DBC vs JDBC and WebFlux vs Web MVC
R2DBC
R2DBC를 사용해보자 (2) - CRUD를 만들어보자
R2DBC - Reactive Programming with Spring, Part 4. | Callista

profile
모종삽에서 포크레인까지

1개의 댓글

comment-user-thumbnail
2022년 11월 13일

와 좋은정보 감사합니다!

답글 달기