본문 바로가기
Develop/Spring˙Spring Boot

[Spring Reactive] 리액티브 데이터베이스 저장 요건

by 독서왕뼝아리 2023. 3. 10.

리액티브 프로그래밍의 핵심은 모든 과정이 리액티브여야 한다!

 

웹 컨트롤러와 서비스 계층도 리액티브 방식으로 동작하게 만들었는데, 블로킹 방식으로 연결되는 데이터베이스를 호출하면 리액티브는 무너진다. 블로킹 방식으로 데이터베이스를 호출한 스레드는 응답을 받을 때까지 다른 작업을 하지 못한 채 기다린다. 

 

동기, 비동기와 블로킹, 논블로킹 개념이 헷갈린다면?

2023.03.09 - [Develop/CS] - 동기(Synchronous)와 비동기(Asynchronous), 블로킹(Blocking)과 논블로킹(Non-Blocking)

 

그렇다면 어떤 데이터베이스가 리액티브 패러다임을 지원하고 있을까?

  • 몽고디비
  • 레디스
  • 아파치 카산드라
  • 엘라스틱서치
  • 네오포제이
  • 카우치베이스

우리가 평소 사용하는 관계형 데이터베이스는 포함되어 있지 않다. 관계형 데이터베이스(JPA, JDBC 등)은 블로킹 API이다. 트랜잭션을 시작하는 메시지를 전송하고, 쿼리를 포함하는 메시지를 전송하고, 결과가 나올 때 클라이언트에게 스트리밍해주는 개념 자체가 없다. 모든 데이터베이스 호출은 응답을 받을 때까지 블로킹되어 기다려야 한다.

 

 

따라서 100% 리액티브 애플리케이션을 만들려면 비동기, 논블로킹 개념을 적용할 수 있는 데이터베이스 드라이버가 필요하다. 다행히도 앞서 나열한 리액티브 지원 데이터베이스는 모두 비동기, 논블로킹을 지원하는 데이터베이스를 가지고 있다.

 

** R2DBC

Reactive Relational Database Connectivity 로 리액티브 스트림을 활용해서 관계형 데이터베이스를 연결할 수 있도록 설계된 명세다. 아직 버전이 낮아 앞으로 진행상황을 지켜본다면 의미가 있을 것이다.

 


 

pom.xml에 몽고디비 의존관계를 다음과 같이 추가하면 된다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
</dependency>

스프링부트 2.7.2 버전 기준 Maven Project

 

  1. spring-boot-starter-data-mongodb-reactive
    리액티브 버전 스프링 데이터 몽고디비를 포함하고 있다. 스프링 데이터 몽고디비는 리액티브 스트림을 완벽히 지원한다.
  2. de.flapdoodle.embed.mongo
    내장형 몽고디비 도구다. 테스트에 주로 사용하며 애플리케이션 초기 설계 단계에서 데이터 스토어로 사용할 수 있다.
  3. mongodb-driver-sync
    리액티브가 아닌 전통적인 몽고디비 드라이버이다.