실전! 스프링 5를 활용한 리액티브 프로그래밍

리액티브 애플리케이션 개발부터 클라우드 배포와 모니터링까지

리액티브 시스템을 탐험하고 스프링 부트와 스프링 클라우드를 사용해 효율적인 마이크로 서비스를 만들어 보자!

오늘날 기업은 어떤 상황에도 높은 응답성을 유지할 수 있는 새로운 유형의 시스템이 필요합니다. 리액티브 프로그래밍을 이용하면 이를 달성할 수 있습니다. 이러한 시스템 개발은 복잡하며 도메인에 대한 깊은 이해를 필요로 합니다. 스프링 프레임워크 개발자들은 응답성 높은 시스템을 만들기 위해 리액터 프로젝트를 제안하고 출시했습니다.

이 책은 스프링을 이용한 리액티브 프로그래밍의 기본으로 시작합니다. 이 책을 통해 스프링 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
      • 성공적인 애플리케이션 배포를 위한 조언
    • 요약

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번째 줄

    이것은 때에 따라서는 허용할 수 없는, 시스템의 응답성을 떨어뜨리는 상황입니다.

    ==>

    이것은 시스템의 응답성이 나빠지는 상황이고, 대다수의 경우에 이는 발생해서는 안 되는 상황입니다.