본문 바로가기

Spring/WebFlux

(17)
[Reactive Programming] 자바 & 스프링 비동기 기술 - Stress Test Spring WebFlux Series - 9 지금까지 우리는 자바의 Future(링크) 와 스프링의 Async(링크) 를 학습하면서 자바와 스프링의 비동기 기술에 대해서 알아보았다. 이번 장에서는 동기 방식과 비동기 방식으로 작성되어 있는 컨트롤러 코드를 부하 테스트를 통하여 성능을 확인하는 시간을 가져본다. 모든 코드는 깃 허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 부하 테스트 설정 지금까지 계속 비동기 서블릿 방식으로 웹 개발을 해야 한정된 자원을 활용하여 더 많은 요청을 처리할 수 있다고 학습하였다. 정말로 우리가 학습한 내용이 맞는지 부하 테스트를 진행하여 결과를 확인해본다. 결과를 확인하기에 앞서 이번 단계에서는 스레드 상태를 직접 눈으로 확인하기 위해 VisualVM..
[Reactive Programming] 자바 & 스프링 비동기 기술 - Modern Spring WebFlux Series - 8 지금까지 우리는 자바의 Future(링크) 와 스프링의 Async(링크) 를 학습하면서 자바와 스프링의 비동기 기술에 대해서 알아보았다. 이번 장에서는 자바와 스프링의 비교적 최신 비동기 기술에 대해서 알아보도록 한다. 모든 코드는 깃허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 비동기 서블릿 출시 처음으로 비동기 서블릿이 언급되기 시작한 것은 스프링 3.0 버전부터이며 아래와 같은 기능을 가지고 있었다. HTTP Connection은 논블로킹 IO 서블릿 요청 읽기, 응답 쓰기는 블록킹 비동기 작업 시작 즉시 서블릿 스레드 반납 비동기 작업이 완료되면 서블릿 스레드를 재할당 하여 마무리 비동기 서블릿 컨텍스트 이용(AsyncCon..
[Reactive Programming] 자바 & 스프링 비동기 기술 - @Async Spring WebFlux Series - 7 이전 장(링크) 에서는 자바와 비동기 기술 중 기본이 되는 Future에 대해서 알아보았다. 이번 장에서는 스프링의 비동기 기술 중에서 가장 많이 사용되는 @Async 애노테이션에 대해서 알아본다. 모든 코드는 깃허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 테스트 코드 구성 @SpringBootApplication 애노테이션을 사용하여 테스트를 진행할 때 스프링 부트를 통해 테스트를 진행하도록 구현하였고 비동기 작업이 가능하도록 @EnableAsync 애노테이션을 사용하였따. ApplicationRunner을 스프링 빈으로 등록하여 프로젝트가 실행되면서 run() 메서드가 호출되도록 구현하였다. 우리가 작성하는 테스트 코드는 run()..
[Reactive Programming] 자바 & 스프링 비동기 기술 - Future Spring WebFlux Series - 6 이번 장에서는 자바와 스프링의 비동기 개발 기술 중 기본이 되는 Future에 대해서 알아본다. 모든 코드는 깃허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 리액티브 프로그래밍을 Flux와 Mono를 사용하여 몇가지 API를 작성하는 것만으로 이해했다고 보기는 힘들다. 물론 보는 관점에 따라 다를 수는 있지만 핵심 기술을 이해해야 리액티브 프로그래밍을 제대로 이해하고 사용할 수 있다. 리액티브 프로그래밍을 옵저버 패턴을 사용하여 역할이 다른 관찰자와 관찰 대상자를 나누어 구현하는 구조만을 말하는 것이 아니라 비동기적인 동작 환경에서 어떠한 의미를 가지는지 살펴봐야 한다. 스프링이 10년 이상 유지한 MVC 방식에서 어떠한 문제를 해..
[Reactive Programming] Scheduler - Reactor Spring WebFlux Series - 5 우리는 이전 장 Scheduler - Basic 에서 reactivestreams의 Publisher와 Subscriber를 사용하여 Scheduler를 구현하였다. 이번 장에서는 동일한 기능을 Spring Reactor를 사용하여 구현해본다. 모든 코드는 깃허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 직접 Publisher와 Subscriber를 구현하지 않고 스프링의 Reactor를 사용하면 손쉽게 스케쥴러를 구현할 수 있다. 하지만 실제로 스케쥴러의 종류는 다양하고 사용가능한 스레드풀의 종류도 다양하다. 여러 종류의 스케쥴러를 사용하여 레이턴시를 낮추거나 애플리케이션의 실행 속도를 빠르게 만드는 방법 등 여러가지 튜닝 요소가..
[Reactive Programming] Scheduler - Basic Spring WebFlux Series - 4 이전 장 에서는 reactivestreams 패키지의 Publisher와 Subscriber를 구현하여 Operators를 만들어보았다. 이번 장에서는 Reactive Streams의 Scheduler에 대해서 알아본다. 모든 코드는 깃허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 지금까지 사용했던 방식으로 Reactive Streams의 Publisher와 Subscriber를 구현해서 테스트를 실행시켜 본다. @Slf4j class SchedulerLectureTest { @Test void schedulerLectureTest() { Publisher publisher = (subscriber) -> { subscriber.o..
[Reactive Programming] Operators - Lambda & Reactor Spring WebFlux Series - 3 이전 장 에서는 reactivestreams의 Subscriber와 Publisher를 일반 클래스에서 구현하여 Operators를 구현해보았다. 이렇게 구현하는 과정에서 많은 클래스들이 생기는 불편함과 가독성이 떨어지는 불편함이 발생하였다. 이번 장에서는 람다 표현식을 사용하여 이러한 불편함을 해결해보고 Reactor의 Flux로 우리가 만든 기능을 똑같이 구현해보고 어떠한 차이가 있는지 살펴본다. 모든 코드는 깃허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 람다 표현식으로 변환 기존에 일반 클래스로 작성되어 있던 코드를 전부 람다 표현식으로 변경하였다. getLambdaPublisher는 1 ~ 10을 출력하는 Subscription..
[Reactive Programming] Operators - Basic Spring WebFlux Series - 2 이전 장 에서는 Reactive Streams의 핵심 기술인 Observer 패턴과 Pub, Sub 구조에 대해서 알아보았다. 이번 장에서는 Reactive Streams의 Operators에 대해서 알아본다. 모든 코드는 깃허브 (링크)의 테스트 코드에 있으므로 필요하다면 참고하도록 한다. 개요 이전 장에서는 java.util.concurrent.Flow.Subscriber와 java.util.concurretn.Flow.Publisher를 사용하여 간단한 Pub, Sub 구조에 대해서 알아보았다. 이번 장에서는 일반 클래스로 java.reactivestreams의 Subscriber와 java reactivestreams의 Publisher를 구현하여 중..