R2DBC는 언제 사용할까?
Reactive Programming을 하는 과정에서 Dtabase 사용이 필요한 경우에 사용한다. 많은 예제로 Proejct Reactor 기반의 Spring Webflux를 사용하며 Database를 사용해야 할 때 R2DBC를 많이 사용한다.
그냥 Stpring 진영에서 많이 사용하는 JPA를 사용하면 안되나?
사용할 수 있다만, 사용하지 않는것이 좋다.
JPA는 기본적으로 비동기를 제공하지 않는다. 즉 Webflux 기반에서 JPA를 사용하면 Database 부분에서 block 되고, 그동안 thread가 기다리게 된다. Webflux 환경에서 이러한 block은 전체 시스템에 영향이 갈 수 있다. 따라서 Webflux 기반에서 JPA를 사용할 수 있으나 사용하지 않는것이 좋다.
이러한 문제를 해결하기 위한것이 R2DBC(Reactive Realtional Database Connectivity) 이다.
R2DBC 를 사용하기 전에 3가지 주요사항을 알자
R2DBC는 interface를 제공하는 Specification 일 뿐이며, 데이터베이스 벤더 측에서 해당 데이터베이스에 맞도록 구현해야 한다.
R2DBC 는 Reactive streams specification을 기반으로 만들어졌다.
R2DBC의 목적은 기존 관계형 데이터베이스 driver specification에 대한 non-blockiing alterantive를 제공하는 것이다.
R2DBC의 장점
Reactive progamming이 가지는 장점을 그대로 갖는다.
Blocking progamming 일 때 보다 높은 동시성이 요구되는 상황에서 더 좋은 성능을 낼 수 있다.
성능에 대한 자세한 내용은 Spring: Blocking vs non-blocking: R2DBC vs JDBC and WebFlux vs Web MVC 글 을 참조하자.
해당 글에서 볼 수 있듯 동시성이 높아짐에 따라 MVC-JDBC를 사용하는 것보다 Latency는 더 줄었고, Throughput은 더 증가한다.
그럼 무조건 R2DBC가 좋은것이지 않나? 측면에서는 조심스럽게 접근해야 한다.
기술적 측면에서 숙련도가 높지 않다. 즉 Blocking 방식에 비해 사용자도 많지 않고, 경험자도 많지 않다. 커뮤니티의 부재, 노하우 및 자료가 적음, 피드백을 받기 어려움 등 이슈가 잇다.
구현체 측면에서도 아직 제공되지 않는 데이터베이스 벤더가 있따. 또한 공식적으로 벤더사에서 제공하지 않는 경우도 있다. 이런 경우 추후 관리 측면에서 문제가 발생할 수 있으므로 도입하는데 고려해봐야할 점이 많다.
Java fucture Speicifiacation에도 영향을 받을 수 있다. Proejct Loom 이라고 하는 Blocking API에 반응성을 가져오는 JAVA프로젝트 등 Java 생태계에 Reative를 달느 방향에서 제공할 수 있다.
'Spring > Webflux' 카테고리의 다른 글
Filtering a sequence (0) | 2024.03.04 |
---|---|
Creating a new sequence (0) | 2024.03.04 |
Reactive Programming 2 (0) | 2024.03.01 |
Reactive Programming (0) | 2024.03.01 |
Context (0) | 2024.03.01 |