리액티브 프로그래밍의 핵심은 모든 과정이 리액티브여야 한다!
웹 컨트롤러와 서비스 계층도 리액티브 방식으로 동작하게 만들었는데, 블로킹 방식으로 연결되는 데이터베이스를 호출하면 리액티브는 무너진다. 블로킹 방식으로 데이터베이스를 호출한 스레드는 응답을 받을 때까지 다른 작업을 하지 못한 채 기다린다.
동기, 비동기와 블로킹, 논블로킹 개념이 헷갈린다면?
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
- spring-boot-starter-data-mongodb-reactive
리액티브 버전 스프링 데이터 몽고디비를 포함하고 있다. 스프링 데이터 몽고디비는 리액티브 스트림을 완벽히 지원한다. - de.flapdoodle.embed.mongo
내장형 몽고디비 도구다. 테스트에 주로 사용하며 애플리케이션 초기 설계 단계에서 데이터 스토어로 사용할 수 있다. - mongodb-driver-sync
리액티브가 아닌 전통적인 몽고디비 드라이버이다.
'Develop > Spring˙Spring Boot' 카테고리의 다른 글
[Spring Reactive] 리액티브 테스트 작성하기 (0) | 2023.03.13 |
---|---|
[Spring Reactive] 리액티브 데이터 Repository 정의하기 (0) | 2023.03.12 |
[Spring Reactive] WebFlux를 사용해 Reactive Spring Boot 구성해보기 (0) | 2023.03.08 |
[Spring] 컴포넌트 탐색, 의존관계 주입과 서비스 로케이터 (0) | 2023.03.07 |
[Spring Boot] 애플리케이션 배포하기 (0) | 2023.02.18 |