매일 매일, 차곡 차곡 쌓기



완벽하지 않은 것을 두려워 말며,
완성도를 높히는데 집중하자.

Spring 40

[WebClient] Configuration Reactor Netty

Reactor Netty 란? Reactor Netty는 Reactor 프로젝트 일부로서 Reactor Core와 함꼐 사용되는 Non-blocking I/O 네트워크 프레임워크입니다. 이 프레임워크는 SpringFramework와 함께 사용되며, 웹 애플리케이션의 클라이언트 및 서버 사이드의 비동기 HTTP 가능하게 합니다 https://projectreactor.io/docs/netty/1.1.16/reference/index.html#getting-started-introducing-reactor-netty Reactor Netty Reference Guide ./../../reactor-netty-examples/src/main/java/reactor/netty/examples/documentat..

Spring/WebClient 2024.03.28

[WebClient] Configuration MaxInMemorySize

MaxInMemorySize 설정 Codecs는 어플리케이션 메모리 문제를 피하기 위해 메모링레서 데이터를 버퍼링하는데 제한이 있다. 기본적으로 이 값은 256KB로 설정되는데, 이 값이 충분하지 않으면 다음과 같은 오류가 발생한다. org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer 기본 Codecs의 한계는 다음과 같이 변경한다. WebClient webClient = WebClient.builder() .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(2 * 1024 * 1024)) .build(); Codec..

Spring/WebClient 2024.03.28

[WebClient] Configuration Default

기본적인 사용방법 WebClient를 사용하는 가장 간단한 방법은 정적 팩토리 메서드를 사용하여 WebClient를 생성하는 것 WebClient.create() WebClient.create(String baseUrl) WebClient.builder()를 통해 추가적인 옵션을 설정할 수 있으며, 옵션은 다음과 같다. uriBuilderFactory: 기본 URL로 사용할 사용자 정의 UriBuilderFactory. defaultUriVariables: URI 템플릿 확장 시 사용할 기본 값. defaultHeader: 모든 요청에 대한 헤더. defaultCookie: 모든 요청에 대한 쿠키. defaultRequest: 모든 요청을 사용자 정의하는 Consumer. filter: 모든 요청에 대한..

Spring/WebClient 2024.03.28

[WebClient] WebClient 란?

WebClient 란? Spring5 부터 도입된 웹 클라이언트 라이브러리 내부적으로 HTTP 클라이언트 라이브러리에게 HTTP Request를 위임하며, 기본 HTTP 클라이언트 라이브러리는 Reactor Netty Non-blokcing/Blocking HTTP Request를 모두 지원하기 때문에 RestTemplate 대체 가능 왜 WebClient를 배워야 하나? 1. WebClient의 장점 비동기/Non-Blocking 방식을 지원하여 높은 처리량과 확장성을 가짐 리액티브 프로그래밍으로 데이터 스트림을 효과적으로 처리 할 수 있음 선언적 방식으로 API 호출을 정의하므로 가독성이 좋음 2. WebClient의 단점 웹플럭스 학습곡선이 존재한다. WebClient 공식 가이드 공식가이드를 먼저..

Spring/WebClient 2024.03.27

트랜잭셔널 전파

트랜잭션 전파란? 트랜잭셔널 전파(Transaction Propagation)는 트랜잭션의 범위를 결정하고 해당 트랜잭션이 다른 메서드나 컴포넌트로 전파되는 방식을 제어하는 메커니즘입니다. 트랜잭셔널 전파는 주로 분산 환경에서 여러 개의 서비스나 메서드 간에 트랜잭션을 관리할 때 사용됩니다. 트랜잭션 전파옵션 사용방법 import org.springframework.transaction.annotation.Transactional; @Service public class MyService { @Autowired private MyRepository repository; @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REA..

Spring/JPA 2024.03.12

2. 리액티브 스트림즈

1. 리액티브 스트림즈란? 데이터 스트림을 Non-Blocking이면서 비동기적인 방식으로 처리하기 위한 리액티브 라이브러리의 표준 사양 리액티브 스트림즈를 구현한 구현체로 RxJava, Reactor, Akka Streams, Java 9 Flow API 등이 있다. 2. 리액티브 스트림즈 구성요소 리액티브 스트림즈를 통해 구현해야되는 API 컴포넌트는 Publisher, Subscriber, Subscription, Processtor가 있습니다. Publisher : 데이터를 생성하고 통지(발행, 게시, 방출)하는 역할을 한다. Subscriber : 구독한 Publisher로부터 통지(발행, 게시, 방출)된 데이터를 전달받아서 처리하는 역할을 한다. Subscription : Publisher에 ..

Spring/Webflux 2024.03.07

1. 리액티브 시스템과 리액티브 프로그래밍

1. 리액티브 시스템이란? 리액티브 시스템은 리액티브한 원리와 원칙을 적용하여 개발된 소프트웨어 시스템을 의미합니다. 쉽게 말하면 어떤 이벤트나 상황이 발생했을 때, 그에 따라 적절하게 반응을 잘 하는 시스템을 말합니다. 2. 리액티브 선언문으로 리액티브 시스템 이해하기 리액티브 선언문 : https://www.reactivemanifesto.org/ko 2.1 Means(방법) 리액티브 시스템에서 주요 통신 수단으로 무엇을 사용할 것인지 표현한 것입니다. 그림에 나와 있는 비동기 메세지 기반 통신을 통해서 구성요소들 간의 느슨한 결합, 격리성, 위치 투명성을 보장하빈다. 2.2 Form(형성) 메세지 기반 통신을 통애서 어떠한 형태를 지니는 시스템으로 형성되는지를 나타냅니다. 그림에서는 리액티브 시스템..

Spring/Webflux 2024.03.06

서블릿 컨테이너, 스프링부트 동작 과정

서블릿이란? JAVA 언어를 사용하여 웹 애플리케이션을 개발할 때 사용되는 자바 클래스. 서블릿은 클라이언트의 요청을 처리하고, 동적인 웹 컨텐츠를 생성하는데 사용됨. 이렇게 만든 서블릿 클래스는 Tomcat 같은 서블릿 컨테이너(WAS)가 관리하며 클라이언트에서 받은 요청에 맞는 서블릿을 실행시켜 웹페이지 생성 후 반환해준다. WAS WAS 는 Web-Application Server로 동적인 컨텐츠 처리를 담당함. 예를 들어서 Tomcat 이 있음 Spring Boot 에서 Tomcat 과거에는 요청마다 서블릿을 하나씩 매핑하여 처리했던 것과 달리, Spring Boot에서는 DispatchServlet 이라는 서블릿 하나만 만들어 둔 다음, 해당 서블릿이 각 요청을 SpringBoot 에서 개발자가..

Multicasting a Flux to several Subscribers

publish 구독 시점에 즉시 데이터를 Emit 하지 않고, connect()를 호출하는 시점에 데이터를 emit한다. Hot Sequence로 변환되기 때문에 구독 시점 이후에 emit된 데이터만 전달 받을 수 있다. autoConnect 파라미터로 지정한 숫자만큼의 구독이 발생하는 시점에 Upstream 소스에 자동으로 연결된다. 즉, publish() 처럼 connect()를 직접 호출할 필요가 없다. refCount 파라미터로 지정하는 숫자만큼의 구독이 발생하는 시점에 Upstream 소스에 자동으로 연결된다. 파라미터로 입력한 숫자 만큼의 구독이 취소되거나 Upstream 데이터 emit이 종료되면 연결이 해제된다. replay 구독 시점에 즉시 데이터를 emit 하지 않고, connet()를..

Spring/Webflux 2024.03.05

Splitting a Flux

window Upstream에서 emit되는 첫 번째 데이터부터 maxsize 숫자만큼의 데이터를 포함하는 새로운 Flux로 분할한다. Upstream 에 요청하는 데이터 개수 = Downstream에서 요청한 개수 x maxSize buffer Upstream 에서 emit 되는 데이터가 maxSize 숫자만큼 버퍼에 채워지면 버퍼를 비운다. 버퍼에 비워진 데이터는 List 형태로 한번에 Downstream으로 emit된다. bufferTimeout Upstream에서 emit된 데이터가 버퍼에 채워질 때, maxTime에 도달하면 버퍼를 비운다. maxTime에 도달하기 전에 maxSizxe 만큼의 데이터가 버퍼에 채워지면 maxTime까지 기다리지 않고, 버퍼를 비운다. groupBy groupBy..

Spring/Webflux 2024.03.05