반응형

Back-End/Reactive Programming 5

Java / Servlet 비동기 기술 흐름 with Spring

1. Servlet 3.0 이전 기존 알고 있었던과 같이 1 Request per 1 Thread 할당 방식이다. 오래걸리는 무거운 작업은 @Async 를 활용해 비동기로 처리할 수 있었지만 이는 말 그대로 해당 스레드 내부에서 유효할 뿐 해당 작업이 끝나기 까지 그 스레드가 반환되지 못하는건 매한가지였다. 톰캣의 NIO 지원은 HTTP Connection 관련 부분을 비동기로 처리하는 것 뿐 서블릿 동작과는 별개의 문제 이 방식의 문제점은 짧게 끝나는 작업이 오래 걸리는 작업이 스레드를 오래 점유하여 덩달아 오래걸리게 되는 문제가 있었다. 2. Servlet 3.0 Servlet 3.0 부터는 이런 문제점을 어느정도 해결하여 오래 걸리는 작업을 별로 스레드에 할당하여 처리하고, 해당 스레드는 빨리 반환..

Java CompletableFuture 개념 및 간단한 활용 사례

Future 는 비동기 작업 수행의 결과를 담고있는 자바의 인터페이스이다. ListenableFuture 는 Spring 에서 제공하는 인터페이스로 Future에 콜백을 등록해 사용할 수 있도록 한 방식이다. 자바 8 때 소개된 CompletableFuture 는 여러 비동기 작업을 결합하고 처리하는데 기존 방식에 비해 훨씬 편하게 수행할 수 있다. 아래는 간단히 반환값이 없는 2개 비동기 작업을 수행하는 예시이다. CompletableFuture .runAsync(() -> log.info("runAsync")) .thenRun(() -> log.info("thenRun")); 반환값이 있는 비동기 작업은 아래와 같이 할 수 있다. CompletableFuture .supplyAsync(() -> 1)..

리액티브 프로그래밍 시리즈 3 - 스레드 스케쥴링 (Thread scheduling)

이 포스트 시리즈는 Reactive Programming은 토비의 스프링 저자 이일민님의 리액티브 프로그래밍 유튜브 강좌를 공부하며 정리한 내용입니다. 1. 표준 Reactive streams의 문제점 지금까지 봐온 코드는 전부 하나의 스레드에서 동작한다. 이 코드를 실전에서 활용하기엔 그닥 유용하지 않은 코드이다. Publisher가 Blocking I/O를 사용하거나 데이터를 준비하는데 시간이 오래걸릴 경우 그걸 다 기다려야하기 때문이다. 반대로 Publisher의 데이터 생성은 굉장히 빠른데, Subscriber의 데이터 처리가 늦을 경우도 마찬가지다. Reactor에서는 Scheduler를 스레드 개념의 오퍼레이터를 활용해 이부분을 해결한다. 여기에서는 이 개념을 직접 구현한 코드를 보겠다. 아래..

리액티브 프로그래밍 시리즈 2 - Operators와 Reactor 맛보기

이 포스트 시리즈는 Reactive Programming은 토비의 스프링 저자 이일민님의 리액티브 프로그래밍 유튜브 강좌를 공부하며 정리한 내용입니다. 0. Tips Stream 인터페이스에 iterate 라는 메소드가 있다. 이 메소드는 어떠한 데이터 스트림을 쉽게 만들어 낼 수 있는 메소드이다. public List createSampleIntegerList(int count) { return Stream.iterate(1, e -> e + 1).limit(count).collect(Collectors.toList()); } 위 코드는 1 ~ 10까지 정수를 담은 리스트를 만든다. 핵심은 iterate(시작값, 값의 변화 함수) 메소드인데, 위 예시에서 시작값은 1, 변화는 1씩 증가시킨다라는 뜻이다..

리액티브 프로그래밍 시리즈 1 - Reactive Streams 개요

이 포스트 시리즈는 Reactive Programming은 토비의 스프링 저자 이일민님의 리액티브 프로그래밍 유튜브 강좌를 공부하며 정리한 내용입니다. 1. Iterable과 Observable의 차이점 Iterable과 Observable은 정반대의 동작방식으로 같은 목적의 문제를 해결한다. 1.1. Iterable 개념 자바에서 연속적인 데이터 구조를 표현할 때 List를 주로 사용한다. 그리고 주로 아래와 같이 for-each 구문을 사용한다. import java.util.List; import java.util.Arrays; List list = Arrays.asList(1, 2, 3, 4, 5); for (Integer i : list) { System.out.println(i); } 이는 L..