Top

RxJava 시작하기 [RxJava로 시작하는 리액티브 프로그래밍]

  • 원서명Learning RxJava: Build concurrent, maintainable, and responsive Java in less time (ISBN 9781787120426)
  • 지은이토마스 닐드(Thomas Nield)
  • 옮긴이조승진
  • ISBN : 9791161753270
  • 33,000원
  • 2019년 07월 24일 펴냄 (절판)
  • 페이퍼백 | 496쪽 | 188*235mm
  • 시리즈 : acorn+PACKT, 프로그래밍 언어

판매처

  • 현재 이 도서는 구매할 수 없습니다.

책 소개

요약

리액티브 프로그래밍을 배워야 하는 이유와 RxJava의 필수적인 연산자들을 언제 어떻게 사용해야 하는지 알아본다. RxJava의 기본이 되는 옵저버블과 구독자와 함께 고급 주제인 동시성과 백프레셔를 다뤄보고 실제적으로 어떻게 복잡한 구현에 적용할 수 있는지 알려준다.

이 책에서 다루는 내용

■ Flowable, Single, Maybe, Completable을 포함해 핵심적인 변화를 가져올 RxJava2의 리액티브 타입에 대해 배운다.
■ 리액티브 프로그래밍의 동작방식과 반응형으로 사고하는 법을 배운다.
■ 옵저버블을 쉽게 설명하고 옵저버블을 어떻게 데이터와 이벤트 시퀸스로 표현하는지 알아본다.
■ 데이터와 이벤트 시퀸스를 변환, 필터링 및 조합하는 다양한 Rx연산자에 대해 알아본다.
■ 멀티캐스팅을 활용해 데이터를 다양한 지점으로 푸시하는 방법과 데이터를 전달하고 캐시하는 방법에 대해 알아본다.
■ RxJava에서 동시성과 병렬화가 작동하는 방식과 어떻게 기존의 복잡한 작업을 손쉽게 구현하는지 알아본다.
■ 안드로이드에서 RxJava와 Retrolambda를 사용해 더 나은 사용자 경험을 제공하는 반응형 안드로이드 앱을 만들어본다.
■ 코틀린의 확장 함수, 데이터 클래스 및 기타 기능을 사용해 RxJava의 사용을 더욱 자연스럽게 만들어본다.

이 책의 대상 독자

이 책은 자바의 핵심 기능과 객체지향 프로그래밍에 대한 기초 지식을 갖고 있는 자바 개발자를 대상으로 한다. 변수, 유형, 클래스, 속성, 메서드, 제네릭, 상속, 인터페이스, 정적 클래스/속성/메서드에 익숙해야 한다. 자바 표준 라이브러리가 제공하는 컬렉션(리스트, 세트, 맵)과 hashcode()/equals()를 사용한 객체의 동등성에 대해서도 잘 알아야 한다. 위에서 언급한 주제 중 하나라도 모르는 내용이 있다면 허버트 쉴트(Herbert Schildt)의 『Java: A Beginner's Guide, Sixth Edition』(McGraw-Hill Education, 2014)을 통해 자바의 기초를 공부할 수 있다. 또한 조슈아 블로크(Joshua Bloch)의 『이펙티브 자바 2판』(인사이트, 2014) 역시 대부분의 자바 개발자의 책장에서 찾아볼 수 있는 고전이다. 이 책은 블로크가 인용하는 베스트 프랙티스를 지키기 위해서 노력할 것이다.
동시성에서 대해서 미리 알 필요는 없으며 RxJava 관점에서 다룰 것이다.

이 책의 구성

1장, ‘반응형으로 사고하기’에서는 RxJava에 대해 소개한다.
2장, ‘옵저버블과 구독자’에서는 옵저버블과 옵저버를 포함하는 RxJava의 핵심 유형에 대해 설명한다.
3장, ‘기본 연산자’에서는 신속하게 로직을 표현하고 생산성을 높여주는 핵심 연산자에 대해 철저하게 알아본다.
4장, ‘연산자 결합’에서는 다양한 방법으로 여러 개의 옵저버블 소스를 결합하는 방법을 배워본다.
5장, ‘멀티캐스팅, 전달 및 캐싱’에서는 여러 옵저버의 중복 작업을 방지하기 위한 스트림 통합과 전달 및 캐싱에 대해 알아본다.
6장, ‘동시성과 병렬처리’에서는 RxJava가 애플리케이션에서 유연하고 강력하게 동시성을 제공하는 방법에 대해 알아본다.
7장, ‘스위칭, 스로틀링, 윈도잉 및 버퍼링’에서는 빠르게 배출하는 옵저버블을 백프레셔 없이도 처리하는 방법에 대해 알아본다.
8장, ‘플로어블과 백프레셔’에서는 플로어블을 바탕으로 백프레셔를 활용하고 생산자가 컨슈머의 처리 속도보다 빠르게 배출하는 것을 막는다.
9장, ‘트랜스포머와 커스텀 연산자’에서는 리액티브 로직을 재활용하는 방법과 자신만의 RxJava 연산자를 생성하는 법에 대해 배운다.
10장, ‘테스트와 디버깅’에서는 효과적인 도구를 통해 RxJava 애플리케이션을 테스트하고 디버깅하는 방법에 대해 배운다.
11장, ‘안드로이드에서의 RxJava’에서는 지식을 안드로이드에 적용하는 방법과 RxAndroid 확장을 통해 안드로이드 앱을 최적화한다.
12장, ‘새로운 코틀린에 RxJava 사용하기’에서는 코틀린의 기능을 활용해 RxJava의 표현력을 향상시킨다.

저자/역자 소개

지은이의 말

리액티브 프로그래밍은 신기술 또는 라이브러리 그 이상이며, 문제를 해결하기 위한 완전히 새로운 사고 방식이다. 리액티브 프로그래밍이 효과적이고 혁신적인 이유는 우리의 세계를 일련의 상태 대신 끊임없이 움직이는 것으로 구성하기 때문이다. 상태보다 쉽게 동작의 복잡성과 동적인 특성을 신속하게 포착할 수 있기 때문에 코드를 사용해 사물을 표현하는 방식에 새로운 가능성이 열린다. 자바와 객체지향 프로그래밍을 처음 배웠을 때는 유용하다고 생각했지만 충분히 효과적이라고 느끼지는 못했다. OOP는 유용하지만, 더 높은 생산성을 위해서는 다른 무언가와 짝을 지을 필요가 있다고 생각했기 때문에 C#와 스칼라를 유심히 지켜봤다. 불과 몇 년 뒤 자바 8이 출시됐는데, 그때 처음으로 함수형 프로그래밍을 사용해 볼 수 있었다. 그러나 여전히 뭔가가 빠진 느낌이 들었다. 나는 도미노 효과처럼 어떤 값의 변경값을 전달하는 데이터와 이벤트를 발생시키는 이벤트의 개념에 매료됐다. 그리고 자바 8의 스트림과 같이 유창하고 함수형 방식으로 이벤트를 모델링할 수 있는 방법이 없을까 하고 고민했다. 언젠가 이런 생각을 밝혔을 때 누군가가 리액티브 프로그래밍을 소개해줬다. 그 당시 살펴봤던 것은 RxJava 옵저버블이었는데, 언뜻 보기에는 자바 8의 스트림과 매우 흡사해 보였다. 두 가지는 비슷하게 보였지만 옵저버블은 데이터뿐만 아니라 이벤트도 푸시한다. 그 순간, 나는 찾고 있던 것을 정확히 발견할 수 있었다. 나뿐만 아니라 많은 사람에게 RxJava 습득의 장애물이 되는 것은 문서가 부족하다는 것이다. 나는 종종 실험적인 질문을 스택 오버플로에 남겼으며, 깃허브(GitHub)에서 모르는 이슈에 대해 철저히 살펴봤다. 회사에서 마주치는 문제에 RxJava를 사용해보면서 병렬화 및 동시성과 같은 주제에 대한 생각을 공유하는 여러 블로그 글을 작성했다. 놀랍게도 이런 글은 트래픽을 폭발적으로 증가시켰다. 이러한 주제에 대해 다루는 곳이 드물었기 때문에 이런 반응은 놀랄 만한 일이 아니었다. 나의 두 번째 저서 출간과 관련해 Packt에서 연락이 왔을 때, 다른 많은 업무가 있었음에도 그 기회를 받아들였다. 어쩌면 RxJava의 문서화 문제를 이 책으로 한 번에 해결할 수 있을지도 모른다. 이 책은 모든 기본 개념과 유스 케이스, 유용한 트릭 및 ‘깨달음’을 제공할 것이며, 이를 통해 RxJava가 더 이상 고급 주제에만 머물러 있지 않게 한다. 나는 RxJava가 어려운 문제든 쉬운 문제든 효과적으로 쉽게 해결할 수 있게 해주기 때문에 모든 기술 수준의 전문 개발자가 접근할 수 있어야 한다고 생각한다. 조금 더 추상적인 이해를 필요로 할 수도 있지만, 즉각적인 생산성 향상은 이 작은 장애물을 가치 있게 해준다. 내가 아는 한 이 책은 최초로 RxJava 2.0을 다루고 있으며, 2.0은 RxJava 1.0과 많은 차이점이 있다. 지금 여러분이 읽고 있는 이 책은 내가 원했던 포괄적이고 단계적인 가이드를 제공한다. 핵심을 생략하거나 충분한 설명 없이 코드를 제시하지 않으려고 노력했다. 여러분이 RxJava의 가치를 빨리 발견하고 그것을 적용하기 위한 시도가 성공적이기를 빈다.

지은이 소개

토마스 닐드(Thomas Nield)

사우스웨스트항공 스케줄 이니셔티브의 비즈니스 컨설턴트이자 RxJavaFX 및 RxKotlin의 메인테이너이다. 경력 초창기부터 기술과 비즈니스 분석에 대한 관심이 많았다. 자바, 코틀린, 파이썬, SQL 및 리액티브 프로그래밍에 익숙해진 뒤 O’Reilly의 저자이자 연사가 됐으며, 오픈소스의 컨트리뷰터도 겸하고 있다. 배운 것을 공유하고 새로운 기술을 다른 사람에게 전파하는 데 열정을 쏟는다. 그리고 일반적으로 친숙하지 않거나 두려워하는 것에 한결 더 쉽게 다가가도록 만드는 일을 즐긴다. 현재 가장 관심 있는 분야는 데이터 과학, 리액티브 프로그래밍, 코틀린 언어 등이다. 또한 O’Reilly에서 SQL 입문서를 출간하기도 했다.

옮긴이의 말

자바 개발자에게 널리 알려진 『리팩토링』(한빛미디어, 2012)을 저술한 마틴 파울러가 수석 과학자로 근무하고 있는 ThoughtWorks에서는 새로운 기술이 IT 업계에 미칠 영향을 매년 분석하고 있다. RxJava의 근간이 되는 ReactiveX는 2017년 ‘Adopt’ 판정을 받았는데, 이는 업계에서 사용을 권장하며 프로젝트에서 사용하고 있다는 뜻으로 ‘적극 권장’ 정도로 볼 수 있다(https://www.thoughtworks.com/radar/languages-and-frameworks/reactivex). 이 책에서 다루는 RxJava가 아니더라도 리액티브 프로그래밍은 분명히 배워둘 가치가 있는 영역이며, 더 많은 서비스나 라이브러리 등에서 사용될 것임이 분명하다. 하지만 프로젝트에 도입하려 해도 역시 리액티브 프로그래밍은 쉽지 않은 주제이다.
개인적으로는 리액티브 스타일의 프로그래밍에 익숙해지는 데 1년 정도가 소요됐다. 이제는 대략 에러 로그만 봐도 어디가 문제이고 무엇이 빠졌는지 신속히 판단할 수 있다. 하지만 리액티브 프로그래밍은 프로그래밍에 대한 접근 방식 자체의 변화가 필요하기 때문에 여전히 쉽지 않다. 초기에는 기존과 동일한 방법으로 문제를 처리하다가 여러 가지 크고 작은 실수가 있었다. 아마 여러분도 도입 결정 후 실제로 프로젝트를 진행하다가 많은 문제와 마주칠 것이다. 이때 옆에 든든한 멘토가 있다면 얼마나 다행일까? 하지만 소프트웨어 영역에서의 일반적인 멘토십은 스스로 깨우침(self-taught)을 얻을 수 있도록 도와주는 방식이 대부분이다. 그렇기 때문에 독자들이 문제에 직면했을 때 이 책이 많은 도움이 될 것이다. 공식 문서는 초보자가 쉽게 이해할 수 있도록 작성되지 않았다. 이 책은 RxJava를 좀 더 쉽게 시작하는 데 도움을 줄 것이다.
대부분의 역서는 번역이 끝나기가 무섭게 기억에서 빠르게 잊혀져 아쉬웠다. 그러던 참에 2019년 한 해에만 두 개의 리액티브 프로그래밍 책을 번역하게 되어 내심 반가웠다. 개인적으로 공부하던 주제이고, 때마침 새로운 증권 서비스에 도입하려고 하던 시점이어서 더욱 반가웠다.
더 많은 개발자가 리액티브 프로그래밍의 장점을 이해하고 사용자가 늘어나, 보다 개선됐으면 하는 기대를 담아 본다.

옮긴이 소개

조승진

라인에서 새로운 파이낸셜 서비스를 개발 중인 소프트웨어 엔지니어이다. 자바, 스프링, 자바스크립트, 웹, 객체지향, TDD, DDD, 소프트웨어 아키텍처 등에 관심이 많다. 개발자 문화를 사랑하고 세상에 영향을 줄 수 있는 무언가를 만들어내기 위해 노력하고 있다.

목차

목차
  • 1장. 반응형 사고
    • RxJava와 리액티브 익스텐션의 간략한 역사
    • 반응형으로 사고
    • RxJava를 배워야 하는 이유
      • 책에서 배우게 될 내용
    • 설정
      • 중앙 저장소 탐색
    • RxJava 간단히 알아보기
    • RxJava 1.0과 RxJava 2.0? 어떤 것을 사용해야 할까?
    • 언제 RxJava를 사용할 것인가?
    • 요약

  • 2장. 옵저버블과 구독자
    • 옵저버블
      • 옵저버블은 어떻게 작동하는가?
      • Observable.create() 사용
      • Observable.just() 사용
    • Observer 인터페이스
      • 옵저버 구현과 구독
      • 람다를 사용해 간결히 표현하는 옵저버
    • 콜드 옵저버블과 핫 옵저버블
      • 콜드 옵저버블
      • 핫 옵저버블
      • ConnectableOvservable
    • 다른 옵저버블 소스
      • Observable.range()
      • Observable.interval()
      • Observable.future()
      • Observable.emtpy()
      • Observable.never()
      • Observable.error()
      • Observable.defer()
      • Observable.fromCallable()
    • Single, Completable 그리고 Maybe
      • Single
      • Maybe
      • Completable
    • 해지처리
      • 옵저버 내부에서 디스포저블 다루기
      • CompositeDisposable 사용
      • Observable.create()를 통한 해지처리
    • 요약

  • 3장 기본 연산자
    • 억제 연산자
      • filter()
      • take()
      • skip()
      • takeWhile()과 skipWhile()
      • distinct()
      • distinctUntilChanged()
      • elementAt()
    • 변환 연산자
      • map()
      • cast()
      • startWith()
      • defaultIfEmpty()
      • switchIfEmpty()
      • sorted()
      • delay()
      • repeat()
      • scan()
    • 감축 연산자
      • count()
      • reduce()
      • all()
      • any()
      • contains()
    • 컬렉션 연산자
      • toList()
      • toSortedList()
      • toMap()과 toMultiMap()
      • collect()
    • 복구 연산자
      • onErrorReturn()과 onErrorReturnItem()
      • onErrorResumeNext()
      • retry()
    • 액션 연산자
      • doOnNext(), doOnComplete() 그리고 doOnError()
      • doOnSubscribe()와 doOnDispose()
      • doOnSuccess()
    • 요약

  • 4장. 연산자 결합
    • 병합 연산자
      • Observable.merge()와 mergeWith()
      • flatMap()
    • 연결 연산자
      • Observable.concat()과 concatWith()
      • concatMap()
    • Ambigous 연산자
    • 지핑 연산자
    • 최근 배출 결합 연산자
      • withLatestFrom()
    • 그루핑 연산자
    • 요약

  • 5장. 멀티캐스팅, 전달 및 캐싱
    • 멀티캐스팅의 이해
      • 연산자를 이용한 멀티캐스팅
      • 멀티캐스팅의 사용 시점
    • 자동 연결
      • autoConnect()
      • refCount()와 share()
    • 재전송 및 캐싱
      • 재전송
      • 캐싱
    • 서브젝트
      • PublishSubject
      • 서브젝트를 사용할 때
      • 서브젝트를 잘못 사용할 때
      • 서브젝트 직렬화
      • BehaviorSubject
      • ReplaySubject
      • AsyncSubject
      • UnicastSubject
    • 요약

  • 6장. 동시성과 병렬처리
    • 동시성이 필요한 이유
    • 동시성 요약
      • 병렬처리 이해
    • RxJava의 동시성 소개
      • 애플리케이션의 활성 상태 유지
    • 스케줄러에 대한 이해
      • 계산 스케줄러
      • IO 스케줄러
      • 새로운 스레드
      • 싱글 스케줄러
      • 트램펄린
      • ExecutorService
      • 스케줄러 시작과 종료
    • subscribeOn() 이해
      • subscribeOn()의 뉘앙스
    • observeOn() 이해
      • UI 이벤트 스레드에 대해 observeOn() 사용
      • observeOn()의 주의 사항
    • 병렬처리
    • unsubscribeOn()
    • 요약

  • 7장. 스위칭, 스로틀링, 윈도잉 및 버퍼링
    • 버퍼링
      • 고정 크기 버퍼링
      • 시간 기반 버퍼링
      • 경계 기반 버퍼링
    • 윈도잉
      • 고정 크기 윈도잉
      • 시간 기반 윈도잉
      • 경계 기반 윈도잉
    • 스로틀링
      • throttleLast()/sample()
      • throttleFirst()
      • throttleWithTimeout()/debounce()
    • 스위칭
    • 키 입력 그루핑
    • 요약

  • 8장. 플로어블과 백프레셔
    • 백프레셔에 대한 이해
      • 백프레셔가 필요한 예제
      • 플로어블 소개
      • 플로어블과 백프레셔를 사용해야 하는 경우
    • 플로어블과 구독자의 이해
      • 구독자
    • 플로어블 생성하기
      • Flowable.create()와 BackpressureStrategy 사용
      • Observable을 Flowable으로 변환(또는 그 반대)
      • onBackpressureXXX() 연산자 사용
      • onBackPressureBuffer()
      • onBackPressureLatest()
      • onBackPressureDrop()
    • Flowable.generate()의 사용
    • 요약

  • 9장. 트랜스포머와 커스텀 연산자
    • 트랜스포머
      • ObservableTransformer
      • FlowableTransformer
      • 트랜스포머에서 상태공유 피하기
    • to()를 사용해 이해하기 쉽게 전환하기
    • 연산자
      • ObservableOperator 구현
      • FlowableOperator
    • Single, Maybe 및 Completable을 위한
    • 커스텀 트랜스포머 및 연산자
    • RxJava2-Extras와 RxJava2Extensions 사용하기
    • 요약

  • 10장. 테스트와 디버깅
    • JUnit 설정
    • 블로킹 구독자
    • 블로킹 연산자
      • blockingFirst()
      • blockingGet()
      • blockingLast()
      • blockingIterable()
      • blockingForEach()
      • blockingNext()
      • blockingLatest()
      • blockingMostRecent()
    • TestObserver와 TestSubscriber 사용
    • TestScheduler를 통한 시간 조작
    • RxJava 코드 디버깅
    • 요약

  • 11장. 안드로이드에서의 RxJava
    • 안드로이드 프로젝트 만들기
      • Retrolambda 설정
      • RxJava 및 기타 라이브러리의 구성
    • RxJava와 RxAndroid 사용
      • RxBinding의 사용
    • 다른 RxAndroid 바인딩 라이브러리
    • 안드로이드에서 RxJava의 라이프 사이클과 주의 사항
    • 요약

  • 12장. 새로운 코틀린에 RxJava 사용
    • 코틀린 사용 이유
    • 코틀린의 구성
      • 그레이들에서 코틀린의 구성
      • 메이븐에서 코틀린의 구성
      • RxJava 및 RxKotlin의 구성
    • 코틀린의 기초
      • 코틀린 파일 만들기
      • 속성과 변수 할당
      • 확장 함수
      • 코틀린 람다
    • 확장 연산자
    • RxKotlin의 사용
    • SAM
    • let()과 apply()
      • let() 사용
      • apply() 사용
    • 튜플과 데이터 클래스
    • ReactiveX와 코틀린의 미래

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

정오표는 여기에서 다운로드 받아주세요.