Spring 71

[Spring WebFlux] R2DBC MySQL

MySQL 개요오픈 소스 기반의 관계형 데이터베이스데이터 읽기 쓰기 등에서 높은 성능 제공MVCC(Multi Version Concurrency Control) 기술을 통해 트랜잭션 간 충돌을 방지하고 읽기 성능 향상자동으로 데드락을 감지하여 강제 종료하며 완료되지 못한 트랜잭션에 대한 복구 작업도 자동으로 수행 인덱스 및 다양한 튜닝 옵션 등을 통해 성능 향상 도모할 수 있음트랜잭션 ACID 원칙 준수master-slave 구조를 통한 데이터 복제 및 replication 지원대규모 트랜잭션 지원이 필요한 서비스에 적합5.5 버전 이후부터는 InnoDB 엔진이 기본 엔진5.5 버전 이전에는 MyISAM 엔진이 디폴트 엔진 JDBC, JPA는 non-blocking 지원 불가JDBC는 동기 blockin..

[Spring WebFlux] 애너테이션 기반 컨트롤러

컨트롤러 관점에서 Spring MVC vs Spring WebFlux 1. Spring MVC Controller@RequestBody 애너테이션을 지정해서 클라이언트의 요청 데이터를 전달받고, ResponseEntity 클래스를 이용해 응답 데이터를 클라이언트에게 전달하는 전형적인 Spring MVC 기반 Controller  2. Spring WebFlux Controller겉보기에는 단순히 Mono와 Flux로 wrapping 한 것처럼 보이지만 non-blocking을 지원하는 리액티브 핸들러애너테이션 기반의 프로그래밍 모델은 기존의 Spring MVC 구조와 거의 흡사하게 사용할 수 있음  Spring WebFlux 기반의 컨트롤러 사용 시 주의할 점 1. Repository/Service 계층..

[Spring WebFlux] Server Sent Event

서론SSE(Server-Sent Events)를 완벽히 이해하기 위해서는 먼저 Polling, Long Polling, 그리고 HTTP Streaming과 같은 기술적 개념들의 이해가 선행되어야 합니다.언급한 기술들은 서버와 클라이언트 간의 통신 방식에서 중요한 역할을 하며, 각기 다른 상황에서 적절하게 사용될 수 있습니다. Polling클라이언트가 일정한 시간 간격으로 서버에 요청을 보내어, 새로운 데이터가 있는지 확인하는 방식Polling의 장점은 구현이 비교적 간단하다는 점하지만, 서버에 새로운 데이터가 없더라도 반복적으로 요청을 보내기 때문에 불필요한 리소스 소모가 발생할 수 있음  Long PollingPolling의 단점을 보완하기 위한 방식클라이언트가 서버에 요청을 보내면, 서버는 즉시 응답..

[Reactor] 자주 사용되는 Operator

Operator리액티브 프로그래밍은 Operator로 시작해서 Operator로 끝난다고 해도 과언이 아님Operator는 데이터 스트림의 요소에 대해 변환, 필터링, 결합 등의 다양한 작업을 수행할 수 있는 함수형 프로그래밍 구성 요소Operator는 주어진 데이터 스트림(또는 Publisher)의 각 요소에 대해 특정 작업을 수행한 후, 그 결과를 새로운 데이터 스트림으로 반환하는 함수새로운 데이터 스트림 역시 다른 Operator의 입력으로 사용될 수 있으며, 이를 통해 복잡한 데이터 처리 파이프라인을 구축할 수 있음 Sequence 생성을 위한 Operator 1. justOrEmptyjust()의 확장 Operatorjust() Operator와 달리 emit 할 데이터가 null일 경우 NPE..

[Spring] Spring WebFlux 개요

Spring WebFlux 탄생 배경리액티브 웹 애플리케이션 구현을 위해 Spring 5.0부터 지원하는 리액티브 웹 프래임워크기술의 발달에 따른 대량의 요청 트래픽을 Spring MVC 방식이 처리하지 못하는 상황이 잦아짐에 따라 적은 수의 쓰레드로 대량의 요청을 안정적으로 처리할 수 있는 비동기 Non-Blocking I/O 방식의 Spring WebFlux가 탄생 Spring Reactive Stack주요 구성 요소설명Netty, Servlet 3.1+ ContainersNetty: 네트워크 애플리케이션 프레임워크로 고성능 non-blocking 서버를 구현하는데 사용Servlet 3.1+ Containers: Servlet API 3.1 이상을 지원하는 컨테이너로 non-blocking I/O를 ..

[Reactor] Reactor 테스트

서론Reactor에서는 reactor-test라는 테스트 전용 모듈을 통해 여러 가지 유형의 테스트를 지원합니다.reactor-test 모듈의 기능을 사용하기 위해서는 build.gradle 파일의 dependencies에 다음 의존성을 추가해야 합니다. testImplementation 'io.projectreactor:reactor-test' 1. StepVerifier를 사용한 테스트Reactor에서 가장 일반적인 테스트 방식은 Flux 혹은 Mono를 Reactor Sequence로 정의한 후 구독 시점에 해당 Operator 체인이 시나리오대로 동작하는지를 테스트하는 방식이며 이를 위해 StepVerifier라는 API를 제공합니다.ex) Reactor Sequence에서 다음에 발생할 시그널이..

[Reactor] Reactor Sequence 디버깅 방법

서론동기식 또는 명령형 프로그래밍 방식은 예외가 발생했을 때 Stacktrace를 확인하거나 예외 발생이 예상되는 코드에 브레이크 포인트를 걸어서 문제가 발생한 원인을 단계적으로 찾아가면 되기 때문에 상대적으로 디버깅 난이도가 쉽습니다.하지만 Reactor의 경우 코드 자체는 선언형 프로그래밍 방식으로 작성하지만 작업들이 대부분 비동기적으로 실행되기 때문에 디버깅 난이도가 상대적으로 어렵습니다.이번 게시글에서는 디버깅 난이도를 낮추기 위해 Reactor에서 제공하는 몇 가지 방법을 간단히 소개하겠습니다. 1. Debug 모드 사용Reactor에서의 디버그 모드 활성화는 Hooks.onOperatorDebug()를 통해 이루어집니다.우선 디버그 모드를 활성화하지 않을 경우 디버깅하기 어렵다는 것을 증명하기..

[Reactor] Context

Context프로그래밍 세계에서의 Context는 어떠한 상황을 처리하거나 해결하기 위해 필요한 정보를 제공하는 어떤 것ex) Spring Security에서 SecurityContextHolder는 SecurityContext를 관리하는 주체, 여기서의 SecurityContext는 애플리케이션 사용자의 인증 정보를 제공하는 인터페이스ex) Spring Framework에서 ApplicationContext는 애플리케이션의 정보를 제공하는 인터페이스로 ApplicationContext에서 제공하는 대표적인 정보가 Spring Bean Reactor에서 Context는 각 리액티브 시퀀스의 실행 시점에 관련된 데이터를 보관할 수 있는 불변 데이터 구조Map과 유사한 key-value 쌍의 형태로 데이터를..

[Reactor] Scheduler

SchedulerOS에서 사용되는 Scheduler와 의미가 비슷OS 레벨에서의 Scheduler는 실행되는 프로그램인 프로세스를 선택하고 실행하는 등 프로세스의 라이프 사이클을 관리해 주는 관리자 역할Reactor의 Scheduler는 비동기 프로그래밍을 위해 사용되는 쓰레드를 관리해 주는 역할Scheduler를 사용하여 어떤 쓰레드에서 무엇을 처리할지 제어Reactor Scheduler를 사용하면 코드 자체가 매우 간결해지고 Scheduler가 쓰레드의 제어를 대신해 주기 때문에 멀티 쓰레드 환경에서의 예상치 못한 오류가 발생할 확률을 최소화시킬 수 있음 Scheduler를 위한 전용 OperatorReactor에서 Scheduler는 Scheduler 전용 Operator를 통해 사용할 수 있음su..

[Reactor] Sinks

SinksReactor 3.4.0 버전부터 지원되기 시작했으며 리액티브 스트림즈의 구성 요소 중 하나로 Processor의 기능을 개선했음Sink는 Reactor에서 이벤트를 방출하는 엔터티를 의미  부연 설명Sink는 리액티브 스트림즈의 Signal을 프로그래밍 방식으로 푸시할 수 있는 구조이며 Flux 또는 Mono의 의미 체계를 가짐Sinks를 사용하면 프로그래밍 코드를 통해 명시적으로 Signal을 전송할 수 있음Sinks는 멀티 쓰레드 방식으로 Signal을 전송해도 thread-safe하기 때문에 예기치 않은 동작으로 이어지는 것을 방지해줌generate() Operator나 create() Operator는 싱글 쓰레드 기반에서 Signal을 전송하는 데 사용 1. create() Opera..