본문 바로가기

9. 자원 관리와 RxKotlin 확장 자원관리 프로그램을 개발할때 자원은 사용하고 반드시 종료시켜줘야 한다. RxKotlin에서는 일회성 자원은 손십게 사용하기 위해 using 연산자를 사용한다. using 연산자의 정의는 다음과 같다. 리소스를 생성하고 반환하는 Callable 인스턴스를 입력받는다. 리소스 인스턴스를 만들기 앞서 첫번째 람다를 호출한다. 그런다음 구독할 수 있는 Observable을 반환하기 위해 리소스 인스턴스를 두번째 람다로 전달한다. 마지막으로 Observable이 onComplete 이벤트를 호출하면 세번째 람다를 호출해 리소스를 종료 시킨다. fun using( resourceSupplier: Callable , sourceSupplier: Function , disposer: Consumer): Observab.. 더보기
8. RxKotlin 애플리케이션 테스트 코틀린에서 JUnit 테스트 작성하기 gradle 의존성 추가 testCompile 'junit:junit:4.12' testCompile 'org.mockito:mokito-core:1.9.5' testCompile 'org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version' assertEquals() 는 두 매개 변수가 같으면 성공한다. 세번째 매개변수는 실패할 경우 출력하는 메시지 이다. package com.rivuchk.packtpub.reactivekotlin import org.junit.Test import kotlin.test.assertEquals class TestClass { @Test // 1 fun `my first test`() { //.. 더보기
7. RxKotlin의 스케줄러를 사용한 동시성과 병렬 처리 리액티브 프로그래밍은 기본적으로 멀티 스레드로 동작한다. RxKotlin은 기본적으로 단일 스레드로 동작하지만 비즈니스 로직과 요구사항에 따라 멀티 스레드를 쉽게 구현할 수 있는 다양한 연산자를 제공하고 있다. 동시성 소개 동시성을 예로 들어보면 집에서 요리를 한다고 가정하자. 양념을 가져오고, 야채를 자르고, 양념장을 재우는 세가지 작업이 있다면 혼자서 한가지씩 해야 하지만 가족구성원으로 있을 경우 동시에 한사람은 양념을 가져오고, 또 한사람은 야채를 자르고, 둘 중에 일을 먼저 마치는 사람이 양념장에 재우기를 할수 있다. 즉 메인스레드(자신), 워커스레드(가족구성원) 독립적으로 할 수 있는 일을 분배처리 하여 전체 프로그램이 더 빨리 실행될 수 있다. 병렬 실행과 동시성 병렬 실행과 동시성의 차이점 .. 더보기
6. 연산자 및 오류처리 프로듀서(옵저버블/플로어블) 결합 데이터를 사용하기에 앞서 여러 원천의 데이터를 결합하는 일은 일반적이다. 예를 들면 오프라인 우선방식에 따라 오프라인 애플리케이션을 구축하고 HTTP 호출에서 가져온 결과를 로컬 데이터베이스의 데이터와 결합하려는 상황이다. 기본적으로 프로듀서(옵저버블/플로어블)를 결합하는 몇 가지 메커니즘이 있는데 다음과 같다. 프로듀서 병합(Merging) 프로듀서 이어붙이기(Concattenation) 프로듀서 사이의 임의 결합 집핑 가장 최근 항목 결합 startWith 연산자 startWith는 다른 원천이 되는 옵저버블이나 Interator 인스턴스를 전달해 연산자가 구독하기 시작한 원천 옵저버블이 배출하기 전에 추가 할 수 있다. 주석 1 에서 startWith 연산자를 사용.. 더보기
5. 비동기 데이터 연산자와 변환 애플리케이션에서 비즈니스 로직과 동작을 구현하려면 블로킹 코드를 작성하거나 명령형 프로그래밍과 리액티브 프로그래밍을 혼합하는 대신 연산자를 사용해야 한다. 연산자를 사용하여 순수하게 반응형으로 유지하면 낮은 메모리 사용, 유연한 동시성 및 일회성(disposablility)들을 쉽게 얻을 수 있는데 명령형 프로그래밍과 섞어서 사용할 경우 효과가 줄어들거나 사라지게 된다. 필터링 연산자 프로듀서의 원하는 배출만 받고 나머지는 필터링 할 경우 사용한다. debounce 예를 들면 텍스트 입력 구현시 모든 키눌림에 대해서 연산을 원하지 않을 때 사용하는 연산자이다. 사용자가 실제로 원하는 키워드와 일치하는 쿼리를 얻을 수 있을 때까지 입력을 중단하기를 잠시 기다렸다가 다운스트림 연산자에게 전달한다. 주석 2 .. 더보기
4. 백프레셔와 플로어블 소개 옵져버블이 옵저버가 소비할 수 있는 처리량 보다 더 빨리 아이템이 배출된다면 어떨까? 이 문제가 언제 어떻게 발생할 수 있는지 알아보고 해결 방법도 알아본다. 백프레셔(Backpressure) 이해하기 플로어블(Flowables) 및 가입자 Flowable.create()로 플로어블 생성하기 옵저버블과 플로어블 동시에 사용하기 백프레셔 연산자 Flowable.generate() 연산자 백프레셔 이해 이 프로그램은 사실 두 옵저버에게 한번만 배출하는 subject인 핫 옵저버블로서의 행동을 멈춘 것은 아니다. 그러나 첫 번째 옵저버에서 각 계산이 오래 걸렸기 때문에 각 배출들은 대기열로 들어가게 된 것이다. 이것은 OutOfMemoryError 예외를 포함해 많은 문제를 일으킬 수 있으므로 분명히 좋은 행.. 더보기
3. 옵저버블과 옵저버 구독자 옵저버블 일련의 연산자를 거친 아이템을 최종 옵저버로 내보내는 푸시 기반의 조합 가능한 이터레이터이다. 여기서 옵저버는 아이템들을 소비한다. 옵저버는 옵저버블을 구독한다. 옵저버블이 그 내부의 아이템들을 내보내기 시작한다. 옵저버는 옵저버블에서 내보내는 모든 아이템에 반응한다. 옵저버블이 동작하는 방법 onNext : 옵저버블은 모든 아이템을 하나씩 이 메서드에 전달한다. onComplete : 모든 아이템이 onNext 메서드를 통과하면 옵저버블은 onComplete 메서드를 호출한다. onError : 옵저버블에서 에러가 발생하면 onError 메서드가 호출돼 정의된 대로 에러를 처리한다. onError와 onComplete는 터미널 이벤트이다. onError가 호출됬을 경우 onComplete가 호.. 더보기
2. 코틀린과 RxKotlin을 사용한 함수형 프로그래밍 함수형 프로그래밍 소개 함수형 프로그래밍의 정의 : 불변의 데이터를 사용한 수학적인 함수의 평가를 통해 프로그램을 구조화 하는 동시에 상태의 변화를 방지한다. 언어의 인터페이스와 지원을 필요로 한다. 함수형 프로그래밍을 지원하는 언어 리스프 클로저 울프램 얼랭 오캐멀 헤스켈 스칼라 F# 자바8 버전 이상 부터 지원 코틀린은 객체지향, 함수형프로그래밍 모두를 지원한다. 함수형 리액티브 프로그래밍(Functional Reactive Programming)은 두가지를 혼합한 개념 함수형 프로그래밍 : 쉽게 모듈화 가능한 프로그램을 구현 리액티브 프로그래밍 : 모듈화된 프로그래밍(함수형 프로그래밍)은 반응형 또는 리액티브 선언문의 네가지 원칙을 구현하는데 필요하다. 함수형 프로그래밍의 기초 람다 표현식 일반적으.. 더보기