[RxJava] RxJava๋ก ์์ํ๋ Java Reactive ํ๋ก๊ทธ๋๋ฐ
Java์์ ์ฌ๋ฌ ๊ฐ์ง์ ์ผ์ ๋์์ ์ํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Java์์๋ C++์ ๋ง์ฐฌ๊ฐ์ง๋ก select ํจ์๋ฅผ ์ ๊ณตํ๊ณ , Thread ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ด์ฉํด์ ๋์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ํฐ ๊ณ ๋ฏผ์ด ๋ ๋ฌธ์ ๋ ์๋๋๋ค.
๊ทธ๋ฌ๋ Java๋ก ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ํ๋ก๊ทธ๋๋ฐ์ Python์ด๋ Go์ ๊ฐ์ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋นํด ์ฌ์ฉํ๊ธฐ๊ฐ ๋ฌด์ฒ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฅ ๋จ์ํ๊ฒ Thread ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๋ ๊ฒ๋ง ๊ณ ๋ คํ๋ค๋ฉด ๊ทธ๋ฆฌ ํฐ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ์๋์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์์์ ๋์์ ์ฌ์ฉํ๋ ์ด์ ๋ฑ ์ฒ๋ฆฌํด์ค์ผ ํ ์ผ๋ค์ด ๊ต์ฅํ ๋ง์ ๋ฟ๋๋ฌ ์ฝ๋๋ฅผ ๊ฐ๋ตํ๊ฒ ์ง ๋คํ๋๋ผ๋ ๋ด๊ฐ ๋ง๋ ๋ฉ์๋๋ ํจ์๊ฐ ์ค๋ ๋ ์์์ ๋์ํ๋์ง ๊ทธ๋ ์ง ์์์ง๋ฅผ ํ๋ณํ๋ ๊ฒ๋ ์ฌํ ๊ณ ๋ คํด์ผ ๋ ๋งํ ๋ถ๋ถ๋ค์ ๋๋ค.
RxJava
์ด๋ฌํ ๋ถํธํ ์ ๋ค์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ง๋ ๊ฒ์ด ๋ฐ๋ก RxJava์ ๋๋ค. RxJava๋ Netflix์์ ๊ฐ๋ฐํ์ฌ 3.x ๋ฒ์ ๊น์ง ์ถ์๋ Java์ฉ Reactive Extension Library์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ Java์์ ๊ณต์์ ์ผ๋ก ์ง์๋๋ ๊ฒ์ ์๋์ง๋ง ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ค์ด ๋ ์ฌ์ด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด์ ์ฌ์ฉํ๋ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ๋ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฌํ ํ๋ก๊ทธ๋๋ฐ์ Reactive Programming์ด๋ผ๊ณ ์ด์ผ๊ธฐ ํฉ๋๋ค. ๊ธฐ์กด์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋ ๋ฐฉ์์ "์ด ๊ฐ์ฒด์ด์ฉํด ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์, ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฃ์์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋งํด์ค"๋ผ๋ ๋ช ๋ นํ ์ด์๋ค๋ฉด, ์ง๊ธ์ "ํ๋ก๊ทธ๋จ์ ์ํฉ์ ๋ฐ๋ผ์ ์ด๋ฌํ ๋ฐ์์ ๋ณด์ฌ์ค" ๋ผ๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋๋ค.
์ด ์ธ ๋ค๋ฅธ ๊ตฌํ์ฒด๋ก Akka์ ์ต๊ทผ Spring WebFlux์์ ์ฌ์ฉํ๊ณ ์๋ Reactor๊ฐ ์์ต๋๋ค.
RxJava๋ ๋ฌ๋ ์ปค๋ธ๊ฐ ๋๊ณ , ๋ด์ฉ์ด ๋ฐฉ๋ํ์ฌ ์ฌ๊ธฐ์ ๋ชจ๋ RxJava์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃจ๊ธฐ์ ๋ค์ ๋ฌด๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฃผ์ ๋ด์ฉ๋ง์ ์ค์ ์ ์ผ๋ก ๋ค๋ฃจ๊ณ , ๊ฐ๋จํ ์ฌ์ฉ๋ฒ์ ๋ํ ์ด์ผ๊ธฐ๋ง ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
RxJava์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณด๊ณ ์ถ๋ค๋ฉด, ์๋์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด๋ณด์ธ์.
Start for Gradle
RxJava๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด RxJava ํ๋ ์์ํฌ ๋ํ๋์๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. Java์์๋ ๋ํ๋์ ๊ด๋ฆฌ๋ก mvn๊ณผ gradle ์ค ํ๋๋ฅผ ์ ํํ ์ ์๋๋ฐ, ์ฌ๊ธฐ์๋ Gradle์ ๊ฐ์ง๊ณ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค.
plugins {
id 'java'
}
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation "io.reactivex.rxjava3:rxjava:3.0.9"
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
test {
useJUnitPlatform()
}
๊ฐ์ฅ ์ต๊ทผ ๋ฒ์ ์ 3.0.9์ด๊ธฐ ๋๋ฌธ์ 3.0.9๋ก ๊ธฐ์ฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Don't use "new"
RxJava์ ๋ค์ด๊ฐ๊ธฐ ์ ์, ํ ๊ฐ์ง ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค. RxJava์์๋ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. RxJava์ ๋ค์ด ์๋ ํด๋์ค๋ค์ ๋ชจ๋ Static factory ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉฐ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ RxJava์ ์๋ ๊ตฌํ๋์ด ์๋ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ต๊ฒ ๋ฉ๋๋ค.
/**
* Created by Neon K.I.D on 1/4/21
* Blog : https://blog.neonkid.xyz
* Github : https://github.com/NEONKID
*/
public class Main {
public static void main(String[] args) {
Observable<String> ob = new Observable<String>() {
@Override
protected void subscribeActual(@NonNull Observer<? super String> observer) {
}
}
}
}
์ฐ๋ฆฌ๊ฐ ๋ณดํต Java๋ฅผ ์ฌ์ฉํ ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง๋ง RxJava์์๋ ์์ ๊ฐ์ด ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
/**
* Created by Neon K.I.D on 1/4/21
* Blog : https://blog.neonkid.xyz
* Github : https://github.com/NEONKID
*/
public class Main {
public static void main(String[] args) {
Observable.just("Hello world").subscribe(System.out::println);
}
}
์์ฒ๋ผ Factory ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถํ๋ฉฐ ๊ฐ๊ธ์ RxJava๋ฅผ ์ฌ์ฉํ ๋๋ new์๋ ์ ์ ๋ฉ์ด์ง๋๋ก ํฉ์๋ค.
How to use
์ ๊ฐ ์ฒ์ RxJava๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ 2.x ๋ฒ์ ์ด๊ณ , ์๋๋ก์ด๋ ์ฑ์ MVVM ํจํด์ ์ด์ฉํด ๊ฐ๋ฐํ์ ๋์์ต๋๋ค. ๋น์์๋ ViewModel์ ์ด๋ค์์ผ๋ก View์ ๋ ๋๋ง ํ ๋๋ฅผ ์ ํ๋๋ก ํ ๊ฑด์ง๊ฐ ๊ฐ์ฅ ํฐ ๊ด๊ฑด์ด์๋๋ฐ์. RxJava์ ์๋ Observable์ด ๋์์ด ๋ง์ด ๋์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์ Observable์ RxJava์ ์์๊ณผ ๋์ด๋ผ๊ณ ํ ์ ๋๋ก ์ค์ํ ๊ฐ๋ ์ ๋๋ค. 1.x ๋ฒ์ ์์๋ Observable๊ณผ Single ํด๋์ค๋ฅผ ์ฃผ๋ฅ๋ก ์ฌ์ฉํ๋ค๋ฉด 2.x์์๋ Observable, Maybe, Flowable ํด๋์ค๋ฅผ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋์๊ฐ์๋๋ฐ์.
๊ทธ๋ ๋ค๋ฉด Observable์ ๋ฌด์์ผ๊น์? ์ฌ๊ธฐ์ Observe๋ผ๋ ๋จ์ด๋ฅผ ๋ณด์ค ์ ์๋๋ฐ, ์ด ๋จ์ด๋ ๊ด์ฐฐ์ด๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์์ฃ . ๋ฐ๋ผ์ ๊ด์ฐฐํ๋ ค๋ ๋ณ์ ๋์์ ๊ฐ๋ฆฌํค๊ณ ์ด ๋์์ ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ์ ๋ฐ๊ฟ๊ฐ๋ ํด๋์ค๋ฅผ Observable ํด๋์ค๋ผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Observable์ด ์๋๋ผ Observed๋ผ๋ ๋จ์ด๊ฐ ๋ ๋ง์ง ์์๊น์? ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ์ด ํด๋์ค๋ ํ ๋ฒ ๊ด์ฐฐํ๊ณ ๋ ์ดํ ๋ค์๋ถํด ์๋ผ ์ฒ๋ผ ์ผํ์ฉ์ด๊ฒ ์ง๋ง Observable์ ์ง๊ธ ๋น์ฅ ๊ด์ฐฐํ์ง ์์๋๋ผ๋ ์์ผ๋ก ๊ณ์ ๊ด์ฐฐํ ๊ฒ์ด๋ผ๋ ์๋ฏธ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋์์ ๊ด์ฐฐํ๊ธฐ ๋ณด๋จ ์์ผ๋ก ๊ณ์ ๋ณํ๋ฅผ ๋ณด๋ฉด์ ํ๋ก๊ทธ๋จ์ ์ด์ด๋๊ฐ ๊ฒ ์ด๋ผ๊ณ ๋ณด๋ ๊ฒ ๋ง์ ๊ฒ์ ๋๋ค.
์ด๋ฐ ์ด์ผ๊ธฐ๋ฅผ ํ๋ ์ด์ ๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๋ ์ฌ๋๋ค์ด ์ด๋ฌํ ๊ฐ๋ ์ ์ต์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฝ GUI ํ๋ก๊ทธ๋๋ฐ์ ์กฐ๊ธ ํด๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด ์ด๋ฐ ๊ฐ๋ ์ด ์ต์ํ์ค ์ ์์ต๋๋ค. ํน์ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์ด ๋ฒํผ์ด ํด๋ฆญ๋์๋์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์์ฃ . Java์์๋ Listener ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์กด์ฌํ๊ณ , ์ด๋ฅผ ์ํด์๋ Thread ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ, ์ฝ์ง๊ฐ ์์ฃ .
RxJava์์๋ Thread ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , Listener ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ๋ค ์์์ ํด์ค๋๋ค. ์ฐ๋ฆฌ๋ Observable์์ ์ ๊ณตํ๋ ์๋์ 3๊ฐ์ง ๋ฉ์๋๋ง์ ๊ธฐ์ตํฉ์๋ค.
- onNext: Observable ํด๋์ค๊ฐ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋์์์ ๊ฐ์งํ๋ ํจ์
- onComplete: ๋ฐ์ดํฐ ๋ฐํ์ ๋ ์ด์ ๋ฐ์ง ์์ ๋ ํด๋น ํจ์๋ฅผ ํธ์ถํฉ๋๋ค. (์ดํ onNext ํจ์๋ ๋์ํ์ง ์์ต๋๋ค.)
- onError: ๋ฐ์ดํฐ ๊ด์ฐฐ ์ค ์ค๋ฅ ๋ฐ์ (์ดํ ์ ๋ ๊ฐ์ ํจ์๋ ๋์ํ์ง ์์ผ๋ฉฐ Observable ์คํ ๋ํ ์ข ๋ฃ๋จ)
๊ทธ๋ผ Observable ์ฝ๋๋ฅผ ํ๋ ๋ง๋ค์ด์ ์จ๋ณด๋๋ก ํ์ฃ .
just()
/**
* Created by Neon K.I.D on 1/4/21
* Blog : https://blog.neonkid.xyz
* Github : https://github.com/NEONKID
*/
public class Main {
public static void main(String[] args) {
Observable.just("Hello World", "Different class").subscribe(System.out::println);
}
}
Observable ํด๋์ค์์ ์ ๊ณต๋๋ ํฉํ ๋ฆฌ ํจ์ ์ค์ just ํจ์๊ฐ ์์ต๋๋ค. ์ด just ํจ์๋ ์ธ์๋ก ๋ฃ์ ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋ก๋ก ๋ฐํํ๊ณ , Observable์ ์์ฑํ๋๋ฐ์. ์ต๋ 10๊ฐ๊น์ง ๋ฃ์ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ข์ ์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ onNext, onComplete, onError ํจ์๋ฅผ ๋ง๋ค์ง ์์๋ ์ฝ๊ฒ ์์ ๊ฐ์ด ๋์ํ๋ค๋ ์ ์ ๋๋ค.
๋ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ธ์๋ก ๋ฃ๊ณ , ์คํํ ๊ฒฐ๊ณผ๋ ์์ ๊ฐ์ต๋๋ค.
create()
create ํจ์๋ just์ ๊ทธ ๊ธฐ๋ฅ์ด ๊ฐ์ง๋ง onNext, onComplete, onError ๋ฑ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ง์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค. just๋ ์ 3๊ฐ์ง์ ์ฝ๋ฐฑ ํจ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ๋์ด ์๋ ๊ตฌํ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ฐ๋ฆฌ๋ subscribe ์ฒ๋ฆฌ๋ง ๋ฃ์ด์ฃผ๋ฉด ๋์์ต๋๋ค.
create ํจ์๋ RxJava์ ์ด๋ ์ ๋ ์ต์ํด์ง์ ๋ถ๋ค์๊ฒ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ ํจ์์ ๋๋ค.
import io.reactivex.rxjava3.core.*;
import io.reactivex.rxjava3.disposables.Disposable;
/**
* Created by Neon K.I.D on 1/4/21
* Blog : https://blog.neonkid.xyz
* Github : https://github.com/NEONKID
*/
public class Main {
public static void main(String[] args) {
Observable<String> observable = Observable.create(emitter -> {
try {
emitter.onNext("Hello");
} catch (Exception ex) {
emitter.onError(ex);
}
});
Disposable disposable = observable.subscribe(System.out::println, Throwable::printStackTrace);
disposable.dispose();
}
}
Observable ํด๋์ค๋ฅผ create ํฉํ ๋ฆฌ ํจ์๋ก ์์ฑํ๊ณ ๋ ๋ค์์๋ Lambda๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๊ฐ์งํ์ ๋ ์ด๋ค ์์ ์ ์ํํ ์ง๋ฅผ ์ ์ํฉ๋๋ค. onNext๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ๋ฐ๋๋ก ํ ์๋ ์๊ณ , ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ค๋ฉด ์ด๋ฒคํธ๋ฅผ ์ค๋จํ๋ onComplete๋ฅผ ์ ์ํ ์๋ ์์ต๋๋ค.
๋ด๊ฐ ๋์์ํค๋ ๋ก์ง์ ์ ์ํ๋ค๋ฉด ๊ทธ๊ฒ์ ์ธ์ ๋์์ํฌ์ง๋ฅผ ์ ํด์ผ ํ๋๋ฐ, ์ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด Disposable ํด๋์ค์ ๋๋ค. Disposable ๊ฐ์ฒด๋ Observable์ ์๋ subscribe ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ ์ํ๊ณ , ์ด๋ฅผ ๋ฐ์์ ๋ ์ฒ๋ฆฌํ ๋ถ๊ฐ์ ์ธ ๋์์ ๊ตฌ์ฑํ ๋ค์, dispose ํจ์๋ฅผ ์คํํ์ ๋ ๋์ํฉ๋๋ค.
์ด์ฒ๋ผ create๋ ์กฐ๊ธ ๋ณต์กํ๋ฐ์. RxJava์ ๋์ ๋ฐฉ์์ ์ฒ์ฒํ ์ดํดํ ๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Why RxJava ?
์ด์ฒ๋ผ RxJava ๋ํ ๋ฌ๋ ์ปค๋ธ๊ฐ ๋ฎ์ง๋ง์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ RxJava๋ฅผ ์จ์ผํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น์?
์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ํด์๋ ๋น๋๊ธฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ์งํํด์ผ ํฉ๋๋ค. Pure Java์์ ์ด๋ฌํ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ํด์๋ ์ค๋ ๋๋ฅผ ์ ์ฌ์ฉํ ์ค ์์์ผ ํจ๊ณผ ๋์์ ์ฝ๋๋ฅผ ๊นจ๋ํ๊ฒ ์์ฑํ ์ ์๋ ๋ฅ๋ ฅ๋ ํ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์๋์ 3๊ฐ์ง ์์๊ฐ ํ์ํฉ๋๋ค.
- Thread (์ค๋ ๋)
- Listener (์ธํฐํ์ด์ค)
- Flow (ํ๋ฆ)
์ฝ๋์ ์ธ ๋ถ๋ถ๋ง ๋ดค์ ๋๋ ์ค๋ ๋์ ๋ฆฌ์ค๋ ๋ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ด ๋งค๋๋ฝ์ง ๋ชปํฉ๋๋ค. ๋ณดํต์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉด ์ค๋ ๋ ํด๋์ค๊ฐ ์์ ๊ฐ๊ฑฐ๋ ๋ค๋ฅธ ํ์ผ์ ์์ฑ๋๋ ๋ฑ์ ํํ๊ฐ ๋๋๋ฐ, ์ด๋ฅผ ์ถ์ ํ๋ ๋ฐ ๋น์ฉ์ด ๋ง์ด ์๊ธฐ๋ฉด์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ฉด RxJava๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ณ๋๋ก ๊ตฌํํ๋ ๋ฑ์ ๋ถํธํจ์ ๋์ด์ฃผ๊ณ , ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํ ๋ก์ง์ ๋จ ํ ์ค์ ์์ฑํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ์ฐ๋ํ๋ ์ธํฐํ์ด์ค๋ ์ ๊ตฌํ๋์ด ์์ด, ์ด ์ธํฐํ์ด์ค ๋ํ ๊ฐ๋ฐ์๊ฐ ๊ตฌํํ๋ ์๊ณ ๋ฅผ ๋์ด์ค๋๋ค. ๊ฒ๋ค๊ฐ ์ฝ๋์ ํ๋ฆ๋ ์ผ์ ํ๊ฒ ์ ์ง์์ผ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฝ๋ ๊ฐ๋ ์ฑ์ ์ต๋ํ ์ด๋ ค์ฃผ์ง์.
์ค์ ๋ก Netflix๊ฐ RxJava๋ฅผ ๋ง๋ ์ด์ ๋ ์๋์ ๊ฐ์ต๋๋ค.
- Emberance Concurrency
์ฐ๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋ง์ด ํ์๋ก ํ๊ณ , ์ด๋ฅผ ์ ๊ทน์ ์ผ๋ก ์์ฉํด์ผ๋ง ํ๋ค. - Java Futures are Expensive to Compose
Java์์ ์ ๊ณตํ๋ Future๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ง์ ๋์์ด ๋๊ธด ํ์ง๋ง ์ด๋ฅผ ์กฐํฉํ๊ณ ํ๋ฆ์ ์ ์ดํ๋ ๊ฒ์ ์ฝ์ง ์๋ค. - Callbacks Have Their Own Problems
์ฝ๋ฐฑ ์ง์ฅ์ ๋ชจ๋ ์ธ์ด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ฌธ์ ์ , ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด๋ฅผ ํด๊ฒฐํด์ผ ํ ํ์๊ฐ ์๋ค.
๋น๋ก ๋์ค์ Java 8์์ CompletableFuture๋ผ๋ ๋น๋๊ธฐ ํ๋ฆ์ ๋งค๋๋ฝ๊ฒ ์ก์์ฃผ๋ ์ข์ ํด๋์ค๊ฐ ๋์ค๊ธด ํ์ง๋ง ๋น์ RxJava๊ฐ ๋์ฌ ๋ฌด๋ ต์๋ Java 8์ด ๋์ค๊ธฐ ์ด์ ์ด์๊ณ , ์ด ๋๋ฌธ์ Netflix์์๋ Reactive ์ฐ์ฐ์๊น์ง ๋ง๋ค์๋๋ฐ, ๊ทธ๊ฒ์ด ๋ฐ๋ก ํ์ฌ Java 8์ ์๋ map, stream ๋ฑ์ ํจ์๋ค์ ๋๋ค.
๋ง์น๋ฉฐ
RxJava์ ๋ํด ๊ฐ๋จํ ์ฌ์ฉ๋ฒ์ ์์๋ดค์ต๋๋ค. RxJava๋ ์ง๋ ๋ฌ 2.x์ ๋ํ ์ง์์ ๊ฑฐ์ ์ข ๋ฃํ๊ณ 3.x๊น์ง ๋๋ฌํ์ต๋๋ค. ๋น๋ก ์ ๋ 2.x์์ ์๋ค๊ฐ ์ต๊ทผ์์ ๋ค์ 3.x๋ฅผ ๋ณด๋ ์ค์ด๊ธด ํ๋ฐ๋ ์ ์ฌ์ฉํ์ง ์์ ํ์ธ์ง ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๋ค์ด ๋ง์์ต๋๋ค.
์ค์ ๋ก RxJava๋ฅผ ์ฒ์ํ์๋ ๋ถ๋ค์ ์ด๋ ค์ด ๋ถ๋ถ์ด ๋ง์ ๊ฒ์ ๋๋ค. ์์ํ ๋จ์ด๋ค, ์ถ์ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ก ์ธํด์ ์ด๋ค์์ผ๋ก ๋์ํ๋์ง ์ ๋ชจ๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์์ฃผ ์ฌ์ฉํ๋ ํด๋์ค์ Reactive ์ฐ์ฐ์๋ง ์ ์ตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ , ๊ทธ ๋ค์๋ถํฐ ์ปค์คํฐ๋ง์ด์ง์ ํ๋ฉด์ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์๋๊ฐ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxJava] 2. Reactive ๊ธฐ๋ณธ ์ฐ์ฐ์(Operator) - map, filter, reduce (0) | 2021.01.23 |
---|---|
[RxJava] 1. RxJava์ ๊ธฐ๋ณธ - Observable (0) | 2021.01.10 |
[Java] - Java Stream API (0) | 2020.01.11 |
[GP] Junit5๋ฅผ ์ฌ์ฉํ Java ํ ์คํธ ์ฝ๋ ์์ฑ (0) | 2019.09.29 |
Java Puzzlers - Scraping the Bottom of the Barrel (Google I/O 2011) (0) | 2013.08.07 |