본문 바로가기

Spring

(35)
멀티 모듈 환경에서 WebTestClient 이용 시 주의 사항 객체 내 java docs 설명에 대한 번역을 chatGPT의 도움을 받았습니다. 예를 들면 아래와 같은 주석을 번역기 돌렸다는 말입니다. 이 문제를 해결하면서 배운 내용도 정리한 글이라 생각보다 장황할 수 있습니다. 문제의 원인/해결을 들어가기 전에 간단하게 요약하겠습니다. 원인 한 프로젝트 내 모듈 A / 모듈 B가 존재합니다. 모듈 A spring-web 의존 모듈 B srping-webflux 의존 한 프로젝트 내 spring-web/spring-webflux 모두 의존하게 되는 상황 해결책 Spring docs - Detecting Web Application Type 를 참고하시면 됩니다. WebTestClient 리액티브 환경에서 컨트롤러 레이어의 테스트를 원활하게 수행하기 위해서는 WebT..
Blocking I/O, Non-Blocking I/O 목차 1. Blocking I/O - 컨텍스트 스위칭의 오버헤드 2. Non-Blocking I/O Blocking I/O 우리가 흔히 볼 수 있는 I/O작업으로는 프로그램을 실행하는 것입니다. 실행 과정에서 디스크에 저장되어 있는 프로그램을 메모리에 올리게 됩니다. 디스크와 상호작용을 하는 과정에서 I/O가 발생합니다. 이외에도 우리가 Spring Boot를 통해 개발할 때, 데이터베이스 I/O, google, kakao와 같은 다른 서버와의 네트워크 통신 과정에서 네트워크 I/O 가 발생합니다. Blocking I/O 환경에서 네트워크 I/O 예를 살펴보도록 하겠습니다. 사용자가 브라우저를 통해 매장을 등록하는 매장 명, 사업자를 보낸다고 해봅시다. 그리고 그 과정에서 매장 명을 입력하면 구글 맵스 ..
Spring Webflux (9) WebClient WebClient는 Spring Reactive 프로젝트에서 제공하는 외부 API를 쉽게 호출할 수 있도록 도와주는 인터페이스입니다. WebClient 등장 이전에는 외부 API 호출을 위해서 RestTemplate을 사용했다고 합니다. synchronous/blocking 하게 동작하는 RestTemplate과 다르게 Webclient는 기본적으로 asynchronous/non-blocking 하게 동작하는 것이 주요 차이점입니다. 이외에도 스프링 6에서 HTTP interface 를 통해서도 외부 API를 호출할 수 있습니다. 토비님의 영상을 참고하시면 좋을 것 같습니다. 정말 마지막으로 이외에도... NetFlix의 OpenFeign을 이용하면 외부 API를 쉽게 사용할 수 있다고 합니다. 망나니 ..
Spring Webflux (8) - 예외 처리 Operator 웹 애플리케이션을 만듬에 있어 예외를 처리하는 것은 재밋기도하고 매우 중요한 작업이라고 생각하는데요. 그러다보니 관련 오퍼레이터 대부분이 중요하다고 생각되더라구요. 이번 포스팅에서는 5개의 예외 처리 오퍼레이터를 정리합니다. 목차와 함께 해당 오퍼레이터의 특징을 요약하였습니다. 목차 1. error : 예외 전파 2. onErrorReturn : 예외 전파 X -> 다른 값으로 대체하여 emit 3. onErrorResume : 예외 전파 X -> 새로운 Publisher로 대체 4. onErrorContinue : 예외 전파 X -> 후속 작업을 진행 5. retry : 예외 발생 시 재시도, 설정한 재시도 횟수 안에 작업을 마치지 못할 경우 예외 전파 error error() 오퍼레이터가 시그널을 받..
Spring Webflux (7) Sequence 변환 Operator - map, flatMap, zip API를 개발할 때 클라이언트에게 적절한 응답을 내려주기 위해서 여러 엔티티를 적절하게 조합하여 변환하는 과정을 거치곤합니다. 변환 Operator를 사용하면 이를 쉽게 구현할 수 있다. 사실 stream API를 사용해봤다면 매우 친근한 오퍼레이터도 존재할 것입니다. 목차 1. map 2. flatMap 3. zip map 마블 다이어그램와 표현되어 있듯이 map() 오퍼레이터는 업스트림에서 emit된 데이터를 Function 인터페이스를 통해 다른 객체로 변환합니다. stream API의 map() 과 기능이 동일합니다. 아래 예제는 String 타입을 Store 타입으로 변경하고 로그를 찍는 예제입니다. public static void main(String[] args) { Flux.just("스..
Spring Webflux (6) Sequence 생성 Operator - justOrEmpty, defer, fromIterable Reactor API에서 제공하는 오퍼레이터의 종류는 매우 다양합니다. 현재 읽고있는 책에서도 오퍼레이터를 8종류로 분류해서 설명하는데요. 저의 상상력 부족 혹은 현재 구상하고 있는 프로젝트를 고려했을 때 8종류를 모두 정리하는 것은 비효율적이라고 생각했어요. 무엇보다 활용처가 딱히 떠오르지 않는 것들도 많았습니다. 개인적으로 범용성이 높다고 생각하는 오퍼레이터 위주로 설명하도록 하겠습니다. Sequence 생성 Operator는 쉽게 말해 Publisher를 만드는 기능을 담당하고 있습니다. 목차 1. justOrEmpty 2. defer 3. fromIterable justOrEmpty justOrEmpty()는 just()를 확장한 오퍼레이터입니다. 만약 null, 다르게 말하면 Optional.e..
Spring Webflux (5) Scheduler 2 목차 1. publishOn(), subscribeOn() 동작 이해 2. Scheduler 종류 publishOn()과 subscribeOn() 동작 이해 앞서 Spring Webflux (4) Scheduler 1에서 Scheduler Operator 에 대해 소개했는데요. 중요한 포인트를 다시 한 번 간략히 정리하고 넘어가겠습니다. publishOn() downstream으로 signal을 전송할 때 실행되는 스레드를 제어합니다. 쉽게 말하면 publishOn() 아래 선언된 operator 의 스레드를 제어합니다. 따라서 처음 fromArray 를 통해 데이터를 가져오는 부분은 Main 메서드에서 수행합니다. 실제 코드를 통해 결과를 확인해봅시다. Flux.fromArray(new Integer[..
Spring Webflux (4) Scheduler 1 목차 1. 물리적인 스레드 vs 논리적인 스레드 2. Reactor 의 Scheduler 3. Schduler 대표 operator - subscribeOn(), publishOn(), parallel() 물리적인 스레드 VS 논리적인 스레드 Reactor에서 사용되는 Scheduler는 Reactor Sequence에서 사용되는 스레드를 관리해 주는 관리자 역할을 합니다. 이를 위해 물리적인 스레드/논리적인 스레드가 무엇인지 정리하고 갑시다. 물리적인 스레드(논리적인 코어) 아래 그림은 CPU 사양이 듀얼코어 4 스레드를 도식화한 그림이다. 코어를 보면 2개의 스레드를 포함하고 있다. 이는 한 개의 물리적인 코어를 논리적으로 나눈 것을 의미하고 이를 물리적인 스레드라고 부른다. 그리고 다른 말로는 논리..