Kim-Baek 개발자 이야기

리액티브 프로그래밍이란 본문

개발/java basic

리액티브 프로그래밍이란

김백개발자 2024. 11. 17. 15:19

리액티브 프로그래밍은 비동기 데이터 흐름 및 이벤트 기반 프로그래밍을 구현하는 패러다임입니다. 데이터를 스트림 형태로 다루며, 시간이 지남에 따라 발생하는 이벤트를 처리합니다. 자바에서는 Reactor와 RxJava 같은 라이브러리를 통해 리액티브 프로그래밍을 구현할 수 있습니다.


---

자바에서 리액티브 프로그래밍의 핵심 개념

1. Publisher와 Subscriber

Publisher: 데이터를 발행하는 역할. (e.g., Flux, Mono)

Subscriber: 데이터를 구독하여 처리하는 역할.

이 둘은 Reactive Streams 표준 인터페이스를 따릅니다.



2. Mono와 Flux (Project Reactor 기준)

Mono: 최대 하나의 데이터를 처리하는 Publisher.

Mono<String> mono = Mono.just("Hello, Reactive World!");

Flux: 0개 이상의 데이터를 처리하는 Publisher.

Flux<Integer> flux = Flux.range(1, 5);



3. 연산자(Operators)
데이터 스트림을 변환하거나 필터링하는 함수형 API를 제공합니다.

map: 데이터를 변환.

filter: 조건에 따라 데이터를 걸러냄.

flatMap: 비동기 작업과 함께 데이터를 변환.





---

예시 1: Mono와 Flux 사용

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class ReactiveExample {
    public static void main(String[] args) {
        // Mono: 하나의 값 처리
        Mono<String> mono = Mono.just("Hello, Mono!");
        mono.subscribe(System.out::println);

        // Flux: 여러 값 처리
        Flux<Integer> flux = Flux.range(1, 5)
                                 .map(i -> i * 2) // 값을 두 배로 변환
                                 .filter(i -> i % 3 == 0); // 3의 배수만 필터링
        flux.subscribe(System.out::println);
    }
}


---

예시 2: 비동기 데이터 처리

import reactor.core.publisher.Flux;

import java.time.Duration;

public class ReactiveAsyncExample {
    public static void main(String[] args) throws InterruptedException {
        // 비동기로 1초마다 값을 생성
        Flux.interval(Duration.ofSeconds(1))
            .map(i -> "Tick: " + i)
            .take(5) // 5개의 값만 처리
            .subscribe(System.out::println);

        // 메인 쓰레드 대기 (비동기 실행 확인용)
        Thread.sleep(6000);
    }
}


---

예시 3: WebFlux와 함께 사용

Spring WebFlux 환경에서는 리액티브 프로그래밍을 통해 웹 요청 및 응답을 비동기로 처리할 수 있습니다.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.Duration;

@RestController
public class ReactiveController {

    @GetMapping("/mono")
    public Mono<String> getMono() {
        return Mono.just("Hello, WebFlux with Mono!");
    }

    @GetMapping("/flux")
    public Flux<String> getFlux() {
        return Flux.interval(Duration.ofSeconds(1))
                   .map(i -> "Value: " + i)
                   .take(5); // 5개의 값만 반환
    }
}


---

리액티브 프로그래밍의 장점

효율적인 자원 사용: 비동기 및 논블로킹 방식으로 시스템 성능 극대화.

간결한 코드: 데이터 변환과 처리를 함수형 방식으로 간단히 구현.

대규모 동시성 처리: 많은 데이터를 빠르고 효율적으로 처리 가능.



반응형

'개발 > java basic' 카테고리의 다른 글

CompletableFuture 란 무엇일까  (0) 2024.11.26
자바 리플렉션이란  (0) 2024.11.24
제네릭 타입 소거 (컴파일/런타임)  (0) 2024.11.16
일급 컬렉션이란?  (0) 2024.11.13
제네릭이란 무엇일까  (0) 2024.11.12
Comments