spring webflux에서 kotlin coroutine으로 reactive 프로그래밍 구현하기

·5 min read·2·
Spring WebFlux에서 Kotlin Coroutine으로 Reactive 프로그래밍 구현하기

Spring WebFlux에서 Kotlin Coroutine으로 Reactive 프로그래밍 구현하기

💡 핵심 요약

LGU+ 디지털 커머스랩에서 Spring WebFlux 기반의 리액티브 스트림 구현 시, 기존 Reactor의 Mono와 Flux 대신 Kotlin Coroutine의 Flow를 활용하여 러닝 커브를 낮추고 개발 효율성을 높인 사례입니다.


🎯 배경 및 문제점

우리가 마주친 문제

2022년 LGU+ 디지털 커머스랩은 기존 서비스 플랫폼을 **마이크로서비스 아키텍처(MSA)**로 전면 전환한 후, 다음과 같은 문제들을 해결해야 했습니다:

  • 느린 네트워크 환경에서의 사용자 경험 저하
  • API 호출 증가로 인한 네트워크 지연
  • MSA로 인해 세분화된 API의 호출 횟수 증가

🏗️ 해결 방안: Backend For Frontend (BFF) 패턴

BFF 패턴 도입 배경

BFF 패턴을 적용하여 다음과 같은 이점을 얻었습니다:

✅ BFF의 주요 장점

  • API 마다 다른 인증 방식 처리 가능
  • 서비스에 필요한 API를 묶어서 한 번에 처리 (API Aggregation)
  • API 엔드포인트 분리로 후속 작업 비용 절감
  • CORS 이슈 해결
  • 세분화된 API 변경 시 커뮤니케이션 비용 절감

📋 구체적인 요구사항

필수 요구사항

  • 급증 트래픽을 감당할 수 있는 고성능 웹 애플리케이션
  • 서비스에 필요한 API를 묶어서 한번의 API 호출(API aggregation)

추가 요구사항

  • *피처 플래그(Feature Flag)**를 통한 A/B 테스트 지원
  • MSA 장애 대비 캐싱(Cache)차단기(Circuit Breaker) 역할

🛠️ 구현 방법

프로그래밍 언어: Kotlin 선택

Kotlin을 선택한 이유

  • 개발자의 개발 역량 강화
  • 코드 작성 간결성 (Java 대비 구문이 간결)
  • 비동기/논블로킹/코루틴 스펙 쉬운 적용

Kotlin의 주요 특징

특징설명
자바와의 상호운용성기존 Java 코드와 완벽 호환
널 안전성타입 시스템에서 널 값 명시적 선언
확장 함수기존 클래스 수정 없이 새로운 기능 추가
함수형 프로그래밍람다식과 고차 함수 지원
동시성 프로그래밍코루틴을 통한 경량 비동기 처리

🔄 코루틴(Coroutine)의 이해

코루틴이란?

Co(함께, 서로) + routine(규칙적 일의 순서, 작업의 집합)

함께 동작하며 규칙이 있는 일의 순서를 뜻합니다.

코루틴의 특징

  • 스레드가 아닌 스레드 내 동작하는 하나의 작업 단위
  • 컨텍스트 스위칭 오버헤드가 적은 비동기 경량 스레드
  • 스레드 내 컨텍스트 스위칭 없이 여러 코루틴을 실행, 중단, 재개

⚡ Spring WebFlux와 리액티브 스트림

WebFlux vs WebMVC

Spring Framework는 웹 관련하여 두 가지 프레임워크를 제공합니다:

  • WebMVC: 전통적인 서블릿 기반
  • WebFlux: 리액티브 기반의 고성능 프레임워크

리액티브 스트림의 핵심 구성요소

구성요소역할
Publisher데이터를 생성하여 전송
Subscriber데이터를 소비, 요청 및 구독 취소
SubscriptionPublisher와 Subscriber 간의 구독 상태 관리
Processor중간 데이터 변환 수행

Reactor의 핵심 타입

  • Mono: 0 또는 1개의 데이터를 비동기적으로 처리
  • Flux: 0개 이상의 데이터 스트림을 비동기적으로 처리

🚧 리액티브 프로그래밍의 도전 과제

주요 어려움

  • 높은 적응 시간: 기존 동기 프로그래밍과 다른 개념
  • 스택 트레이스 추적의 어려움: 비동기 코드에서 디버깅 복잡
  • 높은 숙련도 요구: Reactor API에 대한 깊은 이해 필요

💡 해결책: Kotlin Coroutine + WebFlux

핵심 아이디어

2019년 4월부터 Kotlin Coroutine은 Flow로 리액티브 스트림의 Reactor와 유사하게 시그널을 전달하고 처리할 수 있는 기능을 제공합니다.

지원 버전

  • Spring Framework 5.2 이상
  • Spring Boot 2.2 이상 (2019년 4월부터 코루틴 지원)
  • Spring WebFlux 5.2 이상에서 코틀린 코루틴을 리액티브 스트림에 대응해 사용 가능

개발 스펙

📦 최종 개발 환경
├── OpenJDK 17
├── Kotlin 1.9.21
├── Spring Boot 3.2.2
└── Gradle 8.4


📊 성능 비교 결과

테스트 환경

  • 대상 노드: GCP K8S POD — vCPU 2 core, MEM 4G (2개)
  • 대상 API: LGU+ 메인 전시 구좌 조회 API
  • 테스트 클라이언트: 2개, 동시 스레드 10개~100개 (10초 단위 증가)

성능 개선 결과

지표WebMVCWebFlux with Coroutine개선율
처리량(TPS)기준값300% 향상🚀
응답시간기준값50% 단축
메모리 사용량기준값30% 절약💾

🎯 결론 및 효과

주요 성과

개발 시간 단축: WebMVC와 유사한 코드 패러다임으로 러닝 커브 최소화

성능 향상: 리액티브 스트림의 고성능 특성 그대로 활용

운영 비용 절감: 디버깅과 유지보수의 복잡성 감소

개발자 경험 개선: 기존 동기 프로그래밍 방식과 유사한 코드 작성

핵심 메시지

코루틴을 이용해서 WebMVC와 코드 작성 패러다임은 비슷하지만, 내부는 리액티브 스트림으로 동작하도록 쉽게 코드를 개발할 수 있습니다.

리액티브 스트림의 Reactor를 배우고 적용하는 것보다 코루틴을 배워서 적용하는 것이 프로젝트의 개발 시간을 단축하고 개발 난이도 및 운영 비용을 절감하는 측면에서 더 효과적입니다.


📚 참고 자료


출처: LG U+ 기술블로그 - Spring WebFlux에서 Kotlin Coroutine으로 Reactive 프로그래밍 구현하기

작성자: LG U+ TechBlog (권세욱님)

발행일: 2024년 10월 28일