리액티브 시스템을 탐험하고 스프링 부트와 스프링 클라우드를 사용해 효율적인 마이크로 서비스를 만들어 보자!
오늘날 기업은 어떤 상황에도 높은 응답성을 유지할 수 있는 새로운 유형의 시스템이 필요합니다. 리액티브 프로그래밍을 이용하면 이를 달성할 수 있습니다. 이러한 시스템 개발은 복잡하며 도메인에 대한 깊은 이해를 필요로 합니다. 스프링 프레임워크 개발자들은 응답성 높은 시스템을 만들기 위해 리액터 프로젝트를 제안하고 출시했습니다.
이 책은 스프링을 이용한 리액티브 프로그래밍의 기본으로 시작합니다. 이 책을 통해 스프링 5 프레임워크와 함께 웹플럭스, 스프링 부트와 같은 도구를 활용해 효율적인 리액티브 시스템 구축의 무한한 가능성을 확인하게 될 것입니다. 아울러 다양한 리액티브 프로그래밍 기법을 배우고, 이를 데이터베이스 및 서버 간 통신에 적용해 볼 것입니다. 마지막으로 스프링 클라우드 스트림을 이용해 시스템을 확장하는 방법과 독립적인 고성능 리액티브 마이크로 서비스를 운영하는 방법까지 익힐 것입니다.
이 책의 마지막 페이지를 넘기고 나면 스프링 5.1에 포함된 리액티브 혁명에 동참할 수 있을 만큼 독자 여러분의 역량이 높아져 있음을 느끼게 될 것입니다!
★ 이 책에서 다루는 내용 ★
- 리액티브 시스템과 리액티브 프로그래밍 간의 차이점
- 리액티브 시스템이 주는 혜택과 그 응용 방법
- 스프링 5에서 리액티브 프로그래밍을 사용하는 방법
- 리액터 프로젝트에 대한 이해
- 스프링 5와 리액터 프로젝트를 사용해 리액티브 시스템을 만드는 방법
- 스프링 클라우드로 효율적인 리액티브 마이크로 서비스 제작
- 리액티브 애플리케이션을 테스트, 릴리스, 모니터링하는 방법
올레 도쿠카 (Oleh Dokuka)
올레 도쿠카는 경험 많은 소프트웨어 엔지니어이자 Pivotal사의 챔피언(Champion)이며 리액터 프로젝트 및 스프링 프레임워크의 주요 공헌자 중 한 사람이다. 그는 두 프레임워크의 내부 구조를 잘 알고 있으며, 리액터 프로젝트를 통한 리액티브 프로그래밍을 지지한다. 아울러 스프링 프레임워크와 리액터 프로젝트를 소프트웨어 개발에 적용하고 있으며, 이러한 기술을 사용해 리액티브 시스템을 구축하는 방법을 잘 알고 있다.
이호르 로진스키(Igor Lozynskyi)
이호르 로진스키는 시니어 자바 개발자로 안정적이고 확장 가능하며 매우 빠른 시스템을 개발하는 데 관심이 많다. 7년 이상의 자바 플랫폼 경험이 있다. 인생과 소프트웨어 개발 모두에서 여러 가지 프로젝트에 관심이 많아 역동적인 프로젝트에 열정적으로 참여하고 있다.
김시영
삼성SDS에서 공공기관 SI 프로젝트를 담당, 시스템 분석/설계, 프로그램 개발, 프로젝트 관리 등 다양한 업무를 수행했다. 자바를 기반으로 한 웹 및 백엔드 개발을 주로 하고 있으며, 현재는 스타트업의 CTO로 일하며 신규 서비스 런칭을 위한 시스템 개발을 책임지고 있다.
- ▣ 01장: 왜 리액티브 스프링인가?
- 왜 리액티브인가?
- 메시지 기반 통신
- 반응성에 대한 유스케이스
- 왜 리액티브 스프링인가?
- 서비스 레벨에서의 반응성
- 요약
- 왜 리액티브인가?
- ▣ 02장: 스프링을 이용한 리액티브 프로그래밍 - 기본 개념
- 리액티브를 위한 스프링 프레임워크의 초기 해법
- 관찰자(Observer) 패턴
- 관찰자 패턴 사용 예
- @EventListener를 사용한 발행-구독 패턴
- @EventListener 활용한 응용 프로그램 개발
- 리액티브 프레임워크 RxJava
- 관찰자 + 반복자 = 리액티브 스트림
- 스트림의 생산과 소비
- 비동기 시퀀스 생성하기
- 스트림 변환과 마블 다이어그램
- RxJava 사용의 전제 조건 및 이점
- RxJava를 이용해 애플리케이션 다시 만들기
- 리액티브 라이브러리의 간략한 역사
- 리액티브의 전망
- 요약
- 리액티브를 위한 스프링 프레임워크의 초기 해법
- ▣ 03장: 스트림의 새로운 표준 - 리액티브 스트림
- 모두를 위한 반응성
- API 불일치 문제
- 풀 방식과 푸시 방식
- 흐름 제어
- 해결책
- 리액티브 스트림의 기본 스펙
- 리액티브 스트림 동작해 보기
- 리액티브 스트림 기술 호환성 키트(TCK)
- JDK 9
- 리액티브 스트림을 활용한 비동기 및 병렬 처리
- 리액티브 전망의 변화
- RxJava의 변화
- Vert.x의 적응
- Ratpack의 개선
- 리액티브 스트림 기반의 MongoDB 드라이버
- 리액티브 기술 조합
- 요약
- 모두를 위한 반응성
- ▣ 04장: 리액터 프로젝트 - 리액티브 앱의 기초
- 리액터 프로젝트의 간략한 역사
- 리액터 프로젝트 버전 1.x
- 리액터 프로젝트 버전 2.x
- 리액터 프로젝트 필수 요소
- 프로젝트에 리액터 추가하기
- 리액티브 타입 - Flux와 Mono
- Flux와 Mono 시퀀스 만들기
- 리액티브 스트림 구독하기
- 연산자를 이용해 리액티브 시퀀스 변환하기
- 코드를 통해 스트림 만들기
- 에러 처리하기
- 배압 다루기
- Hot 스트림과 cold 스트림
- 시간 다루기
- 리액티브 스트림을 조합하고 변환하기
- Processor
- 리액터 프로젝트 테스트 및 디버깅하기
- 리액터 추가 기능
- 리액터 프로젝트 심화학습
- 리액티브 스트림의 수명 주기
- 리액터에서 스레드 스케줄링 모델
- 프로젝트 리액터의 내부 구조
- 요약
- 리액터 프로젝트의 간략한 역사
- ▣ 05장: 스프링 부트 2와 함께하는 리액티브
- 성공의 열쇠는 신속하게 출발하는 것
- Spring Roo를 사용해 애플리케이션 개발 속도 향상
- 빠르게 성장하는 애플리케이션에 대한 핵심 요소로서의 스프링 부트
- 스프링 부트 2.0에서의 리액티브
- 스프링 코어 패키지에서의 리액티브
- 웹에서의 리액티브
- 스프링 데이터에서의 리액티브
- 스프링 세션에서의 리액티브
- 스프링 시큐리티에서의 리액티브
- 스프링 클라우드에서의 리액티브
- 스프링 테스트에서의 리액티브
- 리액티브 모니터링하기
- 요약
- 성공의 열쇠는 신속하게 출발하는 것
- ▣ 06장: 웹플럭스 - 비동기 논블로킹 통신
- 리액티브 기반 서버 기술의 핵심: 웹플럭스
- 리액티브 웹의 핵심
- 리액티브 웹 MVC 프레임워크
- 웹플럭스로 구현하는 순수한 함수형 웹
- WebClient: 논블로킹을 지원하는 통신 클라이언트
- 리액티브 웹소켓 API
- 웹소켓 경량화를 위한 리액티브 SSE
- 리액티브 템플릿 엔진
- 리액티브 웹 보안
- 다른 리액티브 라이브러리와의 상호 작용
- 웹플럭스 vs. 웹 MVC
- 프레임워크를 비교할 때는 법칙이 중요하다
- 철저한 분석과 비교
- 웹플럭스 애플리케이션
- 마이크로서비스 기반 시스템
- 접속이 느린 클라이언트를 처리하는 시스템
- 스트리밍 또는 실시간 시스템
- 웹플럭스 실제 사용해 보기
- 요약
- 리액티브 기반 서버 기술의 핵심: 웹플럭스
- ▣ 07장: 리액티브 방식으로 데이터베이스 사용하기
- 최근 데이터 처리 패턴
- 도메인 기반 설계
- 마이크로서비스 시대의 데이터 저장소
- 다중 저장소 영속화
- 서비스로서의 데이터베이스
- 마이크로서비스 사이의 데이터 공유
- 데이터 조회를 위한 동기식 모델
- 데이터베이스 액세스를 위한 와이어 프로토콜
- 데이터베이스 드라이버
- JDBC
- 스프링 JDBC
- 스프링 데이터 JDBC
- JPA
- 스프링 데이터 JPA
- Spring Data NoSQL
- 동기 모델의 한계
- 동기 모델의 장점
- 스프링 데이터로 리액티브하게 데이터 접근하기
- MongoDB 리액티브 리포지토리
- 리포지토리 동작 조합하기
- 리액티브 리포지토리 동작 원리
- 리액티브 트랜잭션
- 스프링 데이터 리액티브 커넥터
- 제약 사항과 기대되는 개선 사항
- ADBA(Asynchronous Database Access)
- R2DBC(Reactive Relational Database Connectivity)
- 동기식 리포지토리를 리액티브 스타일로 변경하기
- rxjava2-jdbc 라이브러리 사용하기
- 동기식 CrudRepository 래핑하기
- 리액티브 스프링 데이터 실습하기
- 요약
- 최근 데이터 처리 패턴
- ▣ 08장: 클라우드 스트림으로 확장하기
- 메시지 브로커, 메시지 기반 시스템의 핵심
- 서버사이드 로드 밸런싱
- 스프링 클라우드와 Ribbon을 이용한 클라이언트 사이드 로드 밸런싱
- 탄력적이고 신뢰성 있는 메시지 전달 계층 역할의 메시지 브로커
- 메시지 브로커의 현황
- 스프링 생태계와 연결해주는 스프링 클라우드 스트림
- 클라우드 환경에서의 리액티브 프로그래밍
- 스프링 클라우드 데이터 플로
- 스프링 클라우드 펑션을 활용한 잘게 쪼개진 애플리케이션
- 스프링 클라우드 - 데이터 플로의 일부로서의 함수
- 리액티브 메시지 전달을 위한 낮은 지연 시간의 RSocket
- RSocket vs. 리액터-네티
- 자바에서 RSocket 사용
- RSocket vs. gRPC
- 스프링 프레임워크에서 RSocket 사용
- 다른 프레임워크에서의 RSocket
- RSocket 요약
- 요약
- 메시지 브로커, 메시지 기반 시스템의 핵심
- ▣ 09장: 리액티브 애플리케이션 테스트하기
- 리액티브 스트림을 테스트하기 어려운 이유
- StepVerifier를 이용한 리액티브 스트림 테스트
- StepVerifier의 핵심 요소
- StepVerifier를 이용한 고급 테스트
- 가상 시간 다루기
- 리액티브 컨텍스트 검증하기
- 웹플럭스 테스트
- WebTestClient를 이용해 컨트롤러 테스트하기
- 웹소켓 테스트
- 요약
- ▣ 10장: 자! 드디어 릴리즈다
- 데브옵스(DevOps) 친화적인 앱의 중요성
- 리액티브 스프링 애플리케이션 모니터링
- 스프링 부트 액추에이터(Spring Boot Actuator)
- 마이크로미터(Micrometer)
- 리액티브 스트림 모니터링하기
- 스프링 클라우드 슬루스를 사용한 분산 추적
- 미려한 UI를 지원하는 스프링 부트 어드민 2.x
- 클라우드에 배포하기
- 아마존 웹서비스에 배포하기
- 구글 쿠버네티스 엔진에 배포하기
- Pivotal Cloud Foundry에 배포하기
- 쿠버네티스와 Istio를 넘어 FaaS를 위한 Knative
- 성공적인 애플리케이션 배포를 위한 조언
- 요약
- GitHub 저장소: https://github.com/wikibook/spring5-reactive
- ZIP 형식으로 다운로드: https://github.com/wikibook/spring5-reactive/archive/master.zip
gradle dependency version을 찾을 수 없다는 오류가 발생할 경우
5장과 7장의 예제를 빌드할 때 'gradle dependency version'을 찾을 수 없다는 오류가 발생할 경우 다음과 같이 각 build.gradle 파일을 수정
chapter-05/build.gradle의 31번째 줄
springBootAdminVersion = '2.1.0-SNAPSHOT'
=>
springBootAdminVersion = '2.1.1'
chapter-07/section-06-r2dbc/build.gradle의 33번째 줄
springDataR2dbcVersion = 'r2dbc-SNAPSHOT'
=>
springDataR2dbcVersion = '1.0.0.RELEASE'
5쪽, 본문 3번째 줄
그러나 장애 발생과
무관하게
응답성을 유지하는 능력을 갖추지않고
확장 가능한 분산 시스템을 구축하는 것은 어려운 일입니다.==>
그러나 장애 발생과
상관없이
응답성을 유지하는 능력을 갖추지않은 채로
확장 가능한 분산 시스템을 구축하는 것은 어려운 일입니다.5쪽, 본문 5번째 줄
이것은 때에 따라서는 허용할 수 없는, 시스템의 응답성을 떨어뜨리는 상황입니다.
==>
이것은 시스템의 응답성이 나빠지는 상황이고, 대다수의 경우에 이는 발생해서는 안 되는 상황입니다.