리액티브 프로그래밍과 가상 스레드(Virtual Thread)를 살펴보고, 둘의 차이점과 서로가 어떠한 장단점이 있는지 알아보겠습니다.
가상 스레드는 Java 19에서 프리뷰 기능으로 도입되었으며, Java 21에서 정식 기능으로 도입되었습니다. 이는 Project Loom이라는 OpenJDK 프로젝트의 일환으로 개발되었습니다. 경량 스레드 구현을 통해 동시성을 크게 개선했습니다.
가상 스레드는 다음과 같은 이점을 제공합니다
경량성: 가상 스레드는 기존의 플랫폼 스레드보다 훨씬 가벼워, 수백만 개의 가상 스레드를 생성할 수 있습니다.
관리의 용이성: JVM에 의해 관리되며, 운영 체제의 스레드 스케줄링에 의존하지 않습니다.
동기 프로그래밍 모델: 기존의 동기식 코드를 그대로 사용할 수 있어, 비동기 프로그래밍의 복잡성을 피할 수 있습니다.
스레드 로컬 변수 지원: 기존 스레드 로컬 변수를 그대로 사용할 수 있습니다.
효율적인 I/O 처리: I/O 작업 시 가상 스레드가 자동으로 언마운트되어 다른 작업을 수행할 수 있게 합니다.
즉 가상 스레드는 전통적인 요청-응답의 간단한 모델의 처리에 굉장히 적합하다고 볼 수 있습니다.이런 모델에서 가상 스레드는 다음과 같은 이점을 제공합니다:
높은 동시성: 수천 개의 가상 스레드를 쉽게 생성할 수 있어 대규모의 동시 요청 처리가 가능합니다.
간단한 프로그래밍 모델: 기존의 동기식 코드를 그대로 사용할 수 있어 학습 곡선이 낮습니다.
리소스 효율성: 운영 체제 스레드보다 훨씬 적은 메모리를 사용합니다.
단순한 요청-응답 시나리오에서는 가상 스레드만으로도 충분할 수 있습니다. 하지만 더 복잡한 통신 패턴이 필요한 경우, 리액티브 프로그래밍이 주는 이점이 크다고 볼 수 있습니다.
다양한 통신 패턴 지원
리액티브 프로그래밍은 데이터 스트림과 변화의 전파에 중점을 둔 선언적 프로그래밍 패러다임입니다. 이 접근 방식은 다음과 같은 네 가지 주요 통신 패턴을 지원합니다
요청-응답 (Request-Response)
전통적인 모델로, 하나의 요청에 대해 하나의 응답을 받습니다.
예: REST API 호출
요청-스트리밍 응답 (Request-Streaming Response)
하나의 요청에 대해 여러 개의 응답을 받습니다.
예: 배달 주문 추적 시스템 - 주문 요청 후 "준비 중", "조리 완료", "배달 중" 등의 상태 업데이트를 실시간으로 받음
스트리밍 요청-단일 응답 (Streaming Request-Single Response)
여러 개의 요청 데이터를 보내고 하나의 최종 응답을 받습니다.
예: 웨어러블 기기의 심박수 모니터링 - 지속적으로 심박수 데이터를 서버로 전송하고, 분석 결과를 한 번 받음
양방향 스트리밍 (Bidirectional Streaming)
클라이언트와 서버가 지속적으로 데이터를 주고받습다.
예: 실시간 스트리밍, 채팅 애플리케이션
이러한 다양한 통신 패턴은 단일 연결을 통해 구현되며, 리액티브 프로그래밍을 통해 효율적으로 관리할 수 있습니다.
가상 스레드와 리액티브 프로그래밍, 각각의 장단점을 알아봤습니다. 단순한 요청-응답 모델에서는 가상 스레드만으로도 충분할 수 있지만, 복잡한 통신 패턴이나 대규모 동시성이 필요한 경우에는 리액티브 프로그래밍이 주는 이점이 큰 편입니다.
또한 주목할 점은 이 두 기술이 상호 배타적이지 않다는 것입니다. 많은 현대적인 애플리케이션은 두 접근 방식을 혼합하여 사용합니다. 리액티브 스트림 처리에 가상 스레드를 사용하여 시스템의 전반적인 효율성을 높일 수 있습니다.