Spring/Webflux 11

스프링 웹플럭스의 코루틴 지원

코루틴 코루틴(Coroutine)은 코틀린에서 비동기-논브로킹 프로그래밍을 명령어 스타일로 작성할 수 있도록 도와주는 라이브러리이다. 코루틴은 멀티 플랫폼을 지원하여 코틀린을 사용하는 안드로이드, 서버 등 여러 환경에서 사용할 수 있다. 코루틴은 일시 중단 가능한 함수(suspend function)을 통해 스레드가 실행을 잠시 중단했다가 중단한 지점부터 다시 재개(resume) 할 수 있다. 코루틴을 사용한 구조적 동시성 예시 suspend fun combineApi() = coroutineScope { val res1 = async { getApi1() } val res2 = async { getApi2() } return ApiResult ( res1.await() res2.await() ) } 리..

Spring/Webflux 2024.01.29

스프링 웹 플럭스 (Spring Webflux)

프로젝트 리액터 프로젝트 리액터는 리액티브 스트림의 구현체 중 하나로 스프링의 에코시스템 범주에 포함된 프레임워크이다. 리액티브 스트림 사양을 구현하고 있으므로 리액티브 스트림에서 사용하는 용어와 규칙을 그대로 사용한다. 리액터를 사용하면 애플리케이션에 리액티브 프로그래밍을 적용할 수 있고 비동기-논블로킹을 적용할 수 있다. 함수형 프로그래밍의 접근 방식을 사용해서 비동기-논블로킹 코드의 난해함을 어느정도 해결한다. 백프레셔를 사용해 시스템의 부하를 효율적으로 조절할 수 있다. 모노와 플럭스 리액터는 리액티브 스트림의 Publisher 인터페이스를 구현하는 모노(Mono)와 플럭스(Flux)라는 두 가지 핵심 타입을 제공한다. 모노는 0..1개의 단일 요소 스트림을 통지하는 발행자이다. 플럭스는 0..N..

Spring/Webflux 2024.01.28

리액티브 프로그래밍이란

리액티브 프로그래밍이란 데이터 또는 이벤트의 변경이 발생하면 이에 반응해 처리하는 프로그래밍 기법을 말한다. 리액티브 프로그래밍은 비동기 프로그래밍을 처리하는 새로운 접근 방식. 리액티브 프로그래밍은 데이터의 통지, 완료, 에러에 대한 처리를 옵저버 패턴에 영감 받아 설계되었고, 데이터의 손쉬운 비동기 처리를 위해 함수형 언어의 접근 방식을 사용. 리액티브 프로그래밍이 나오기 전 비동기 프로그래밍은 대부분 콜백 기반의 비동기 처리 방식을 사용했다. fetch("/api/users/me") { user -> fetch("/api/users/${user.id}/followers") { followers -> fetch("/api/users/${user.id}/likes") { likes -> fetch("/..

Spring/Webflux 2024.01.27

Thread, Future, CompletableFuture 란

Thread 스레드가 하나인 경우를 싱글 스레드, 하나 이상인 경우를 멀티 스레드라 부른다. 멀티 스레드를 사용하면 애플리케이션에서 여러개의 작업을 동시에 할 수 있다. 멀티 스레드를 사용하면 스케쥴링 알고리즘에 의해 스레드가 전환되면서 작업을 처리하는데 이를 컨텍스트 스위칭이라 부른다. 하나의 프로세스에는 최소 하나 이상의 스레드가 존재하고 프로세스 내에 스레드들은 동일한 메모리를 공유한다. 스레드가 무한정 많아지면 메모리 사용량이 높아져 OOME 가 발생할 수 있고 동시 처리량을 요구하는 시스템에서는 스레드를 생성하면서 발생하는 대기 시간 때문에 응답 지연이 발생한다. 이러한 문제를 해결하기 위해 스레드 풀을 사용해야 한다. 스레드 풀을 사용하면 애플리케이션 내에서 사용할 총 스레드 수를 제한할 수..

Spring/Webflux 2024.01.27

토비의 봄 TV - CompletableFuture (7)

https://hyokeun0419.tistory.com/89 CompletableFuture (4) 자바에서 비동기(Asynchronous) 프로그래밍을 가능케하는 인터페이스이다. Future 인터페이스는 java5부터 java.util.concurrency 패키지에서 비동기의 결과값을 받는 용도로 사용했지만 비동기의 결과값 hyokeun0419.tistory.com https://hyokeun0419.tistory.com/90 CompletableFuture (5) 지난 시간에 이어 진행해보자. 이번엔 CompletableFuture 를 가지고 여러 작업을 조합하는 방법과 예외를 처리하는 방법에 대해 살펴보자. Future 만 가지고는 특정 작업들을 이어서 처리하는게 힘들었 hyokeun0419.ti..

Spring/Webflux 2022.06.28

토비의 봄 TV - AsyncRestTemplate의 콜백 헬과 중복 작업 문제 (6)

저번시간엔 비동기 논블록킹 작업의 자원을 최소화하는 방법을 다뤘다. 하지만 문제는 중첩된 외부 서비스들을 호출하게되면 콜백의 구조가 복잡해지는 문제 즉, 콜백 헬에 빠지게 되었고 이를 어떻게 개선할 수 있는지 살펴보자. 다시한번 정리해보자면, 명령형 스타일의 콜백을 이용했고, 이를 함수형 스타일의 코드로 가독성을 높여보자. 콜백 안에 인자는 완료가 된 후 한번 실행되고 끝나 작업이 완료 후 어떤 액션을 하겠다 라는 것들을 구조적으로 제공해줄수 없다. 비동기 처리를 할 때 마다 에러를 처리하는 코드가 중복된다. 콜백 헬이 일어난다. Completion 클래스 추가 비동기 작업을 수행해서 ListenableFuture 와 같은 결과를 가져오고, 콜백에 지정한 작업이 완료나 에러가 발생했을때 이후의 처리를 다..

Spring/Webflux 2022.06.24

토비의 봄 TV - 스프링의 비동기 기술 (4) 2/2

@Async Spring MVC 3.2 부터 Servlet 3.0 기반의 비동기 요청 처리가 가능해졌다. @Async 어노테이션을 추가해 해당 메서드를 비동기적으로 호출할 수 있다. 해당 메서드를 호출한 호출자(caller)는 즉시 리턴하고 메소드의 실제 실행은 Spring TaskExecutor에 의해서 실행된다. 비동기로 실행되는 메서드는 Future 형식의 값을 리턴하고, 호출자는 해당 Future의 get() 메서드를 호출하기 전에 다른 작업을 수행할 수 있다. @SpringBootApplication @EnableAsync @Slf4j public class AsyncApp { @Service public static class MyService { /* 내부적으로 AOP를 이용해 복잡한 로직이..

Spring/Webflux 2022.06.17

토비의 봄 TV - 자바의 비동기 기술 (4) 1/2

ExcutorService 쉽게 비동기로 작업을 실행할 수 있도록 도와주는 JDK(1.5부터)에서 제공하는 interface 이다. 일반적으로 ExecutorService는 작업 할당을 위한 스레드 풀과 API를 제공한다. @Slf4j public class ExcutorServiceApp { public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("Async"); System.out.print..

Spring/Webflux 2022.06.17

토비의 봄 TV - Reactive Streams Scheduler (3)

해당 강좌에서는 publisher, subscriber 의 동작 코드를 reactive streams 에서 제공하는 scheduler 를 이용하여 서로 다른 스레드에서 동작하도록 해보자. 스케줄러 (Scheduler) 메인 쓰레드가 언제 일어날줄 모르는 이벤트를 blocking 방식으로 무한정 기다리는건 비효율적 이다. 비동기로 효율적으로 처리 될 수 있도록 다른 쓰레드를 이용하거나 생성하는데, 이를 스케줄러라 부른다. 스케줄러 (Scheduler) 종류 publishOn publisher(데이터 생성)는 빠르나 subscriber(데이터 사용)쪽의 작업이 느린 경우 subscriber를 별도의 쓰레드로 분리 e.g) 데이터 가공/저장 작업이 느린경우 사용 subscribeOn publisher가 느리고..

Spring/Webflux 2022.06.14

토비의 봄 TV - Reactive Streams Operators (2)

Observable 형태를 발전시킨 Publisher 와 Subscriber 를 만드는 방식을 이전 시간에 살펴보았다. 이번엔 이를 조금 더 발전 시켜서 Operator 를 추가하는 방법과 동작방식을 살펴보고 실제 Reactive Strems 의 구현체인 Reactor 까지 사용해보자. 복습 ReactiveStreams 는 아래 기능들을 제공한다. Publisher Subscriber Subscription Processor Publisher 가 가장 중요한데, 데이터스트림을 계속해서 만들어내는 Provider 역할을 한다. 아래 코드를 살펴보자. import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; import org...

Spring/Webflux 2022.06.07