분류 전체보기 2526

[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 쌍의 형태로 데이터를..

[SpringBoot] RDS 자격 증명 AWS Secrets Manager 적용

서론고객의 보안 정책에 따라 주기적으로 데이터베이스(DB) 계정 비밀번호를 변경해야 합니다.그러나 현재 시스템에서는 비밀번호를 변경할 때마다 서버를 재기동해야 하며, MSA 서비스 특성상 관리해야 하는 DB가 여러 개입니다.이러한 불편함을 해결하기 위해 모든 DB의 자격 증명을 AWS Secrets Manager로 관리하고, 서버 재기동 없이 적용하고자 하는 요구사항이 생겼습니다. 프로젝트 환경SpringBoot 2.6.3 + MavenRDS (MariaDB 10.11.0 버전)Secrets ManagerIAMAWS CLI 1. RDS 생성 및 설정연동 테스트를 위해 프리티어 RDS를 생성하고 자격 증명 관리를 AWS Secrets Manager로 관리하도록 설정하겠습니다.단순 테스트 용도이기 때문에 외..

[DEV] 기록 2024.07.30

[Netty] Netty 개요 및 간단한 예제

Netty비동기 이벤트 기반의 네트워크 애플리케이션 프레임워크HTTP뿐만 아니라 FTP, SMTP, Telnet 등 다양한 네트워크 프로토콜을 지원Java IO, NIO, Selector 기반으로 적은 리소스로 높은 성능 보장NIO는 비동기 I/O를 지원하여, 블로킹 방식의 IO에 비해 더 나은 성능을 제공NIO의 Selector는 여러 채널에서 발생하는 I/O 이벤트를 감지하고 처리불필요한 메모리 복사를 최소화하여 메모리 사용을 최적화 이벤트 모델은 매우 유연하고 확장 가능하며 필요에 따라 커스텀 이벤트 핸들러를 추가하거나 제거할 수 있음서버와 클라이언트 모두 지원하며 이를 통해 양방향 통신이 필요한 애플리케이션을 쉽게 개발할 수 있음  NIOEventLoopNetty 프레임워크에서 비동기 I/O 작업..