Spring WebFlux와 반응형 데이터베이스: 왜 필요하고 어떻게 작동하는가?

이호영·2023년 10월 3일
0

Spring WebFlux

목록 보기
2/2

Spring WebFlux와 반응형 데이터베이스

왜 반응형 데이터베이스인가?

Spring WebFlux는 비동기적인 처리 모델을 사용하는 웹 프레임워크입니다. 이러한 비동기 처리는 높은 트래픽과 대량의 데이터를 효율적으로 처리할 수 있게 해주지만, 동시에 기존의 차단 방식(blocking)의 데이터베이스 연결과는 잘 호환되지 않습니다.

왜냐하면, 차단 방식의 연결에서는 요청을 처리하는 동안 해당 스레드가 블록되어 다른 요청을 처리할 수 없습니다. 따라서 많은 수의 동시 요청이 발생할 경우 시스템 성능에 영향을 줄 수 있습니다.

반면에 반응형 데이터베이스는 비동기적인 방식으로 작동하여 여러 요청을 병렬로 처리할 수 있습니다. 이를 통해 시스템 자원을 효율적으로 활용하고 응답 시간을 개선할 수 있습니다.

Spring WebFlux와 반응형 데이터베이스 작동 방법

Reactive Data Access Library 추가

데이터 액세스를 위한 Reactive Data Access Library (예: Spring Data R2DBC)를 프로젝트에 추가합니다. 이 라이브러리는 R2DBC(Reactive Relational Database Connectivity) 스펙에 따라 구현된 드라이버와 함께 작동합니다.

Repository 인터페이스 정의

반응형 쿼리 메서드를 제공하는 Repository 인터페이스를 정의합니다. 이 인터페이스는 기존 Spring Data JPA나 MongoDB와 유사하지만, Mono나 Flux와 같은 반환 타입을 사용하여 비동기 결과 스트림을 반환합니다.

비동기 쿼리 실행

비즈니스 로직에서 Repository 인터페이스 메서드를 호출하여 비동기 쿼리 실행 및 결과 스트림 획득합니다. 이 때, Mono 혹은 Flux로 반환된 결과 스트림은 Reactor API나 다른 비동기 조합 연산자들과 함께 사용됩니다.

Mono? Flux?

  • Mono: Mono는 0개 또는 1개의 결과를 처리하는 비동기 작업을 나타냅니다. 예를 들어, 특정 ID로 데이터베이스에서 엔티티를 조회하거나 새로운 엔티티를 저장하는 작업 등에 사용됩니다.

  • Flux: Flux는 0개 이상의 결과를 처리하는 비동기 작업을 나타냅니다. 여러 개의 아이템, 예를 들어 데이터베이스에서 조회한 여러 개의 엔티티 등을 스트림으로 처리할 때 사용됩니다.

    그럼 Flux만 쓰면 안되요?

    Flux를 사용하면 0개 이상의 결과를 처리할 수 있기 때문에, 이론적으로는 Mono가 필요한 모든 곳에서 Flux를 사용할 수 있습니다. 그러나 이 둘을 적절히 구분하여 사용하는 것이 좋습니다.

  • 의미적 명확성: Mono와 Flux는 각각 0 또는 1개, 그리고 0개 이상의 아이템을 처리한다는 의미를 가지고 있습니다. 따라서 메서드의 시그니처만 보고도 반환되거나 처리될 아이템의 개수에 대한 정보를 얻을 수 있습니다.

  • 오류 방지: 예를 들어, 데이터베이스에서 단일 엔티티를 조회하는 경우에 Flux를 반환하도록 작성하면, 실제로는 항상 단일 아이템만 포함되어야 하지만 코드 상으로는 여러 아이템을 포함할 수 있다는 가능성을 내비두게 됩니다. 이런 경우 잘못된 데이터나 버그가 발생할 여지가 있습니다.

  • API 일관성: 일반적으로 반응형 프로그래밍에서 단일 결과와 다중 결과를 나타내기 위해 별도의 타입(Mono, Flux 등)을 제공합니다. 이런 패턴은 Reactor 뿐만 아니라 RxJava 등 다른 반응형 프로그래밍 라이브러리에서도 찾아볼 수 있습니다.

따라서 가능한 한 의미와 용도에 맞게 Mono와 Flux를 적절히 구분하여 사용하는 것이 바람직합니다.

결과 스트림 소비

결과 스트림은 subscribe() 메서드 호출로 시작되며, onNext(), onError(), onComplete() 등의 콜백 메서드를 통해 아이템 및 오류 핸들링 등 소비됩니다.

마치며

Spring WebFlux와 반응형 데이터베이스는 높은 성능과 확장성을 제공하기 위해 함께 사용됩니다. Spring WebFlux가 제공하는 비동기적인 처리 모델과 반응형 데이터베이스의 조합은 대량의 트래픽 및 대용량 데이터 환경에서 우수한 성능과 응답성을 보장합니다. 그러나 프로젝트 설정 및 개발 과정에서 추가적인 학습 곡선과 주의사항도 고려해야 합니다.

0개의 댓글