[RxJava] 1. RxJava์ ๊ธฐ๋ณธ - Observable
์ง๋ ํฌ์คํธ์์ Observable์ ๋ํด ๊ฐ๋จํ ๋ค๋ค๋ดค๊ณ , ์ด์ ๋ฐ๋ฅธ ๋ฆฌ์กํธ ํจ์์ ๋ํด ์์๋ณด๋ฉฐ ๊ฐ ์ฐจ์ด๋ฅผ ์์๋ดค์ต๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ Observable์ ์ข ๋ ์ฌ์คํ๊ฒ ๋ค๋ค๋ณด๊ณ , ์ด์ ์ํ๋ Single, Maybe ๋ฑ ๋ค์ํ ํด๋์ค ๋ฑ์ ๊ณต๋ถํ๋ฉด์ RxJava์ ์ข ๋ ์น์ํด์ง๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Observer Design Pattern
RxJava์ ๊ทผ๊ฐ์ด ๋๋ Observable ํด๋์ค๋ ์ํํธ์จ์ด ๋์์ธ ํจํด์ธ Observer Pattern์ ๊ทผ๊ฐ์ผ๋ก ๋์ด ์์ต๋๋ค.
์ํค์ ๋์ ์๋ ๊ฒ์ฒ๋ผ ์ต์ ๋ฒ ํจํด์ Listener ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค. Listener์ ๊ฒฝ์ฐ, ์ธํฐํ์ด์ค ๋ฑ์ ์ถ์์ ์ธ Object๋ก ๋ง๋ ํ ์ด๋ฅผ ์ํ๋ Object์ ์ธ์๋ก ๋ฃ์ด ์ฌ์ฉํ๊ณ , ์ด๋ฅผ ์ํ๋ ํจ์์ ๋ฃ์ผ๋ฉด ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ด ์์ฑ๋๋ ๊ฒ์ด์ฃ .
ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ์์ ์ ๋ ฅ ํน์ ์ด๋ฒคํธ์ ์ํ์ฌ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ Listener(Observer)๋ ์ด ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ์ ํด์ง ๋ก์ง์ ์ํํ๋ฉฐ ํ๋ก๊ทธ๋จ์ ์ด๋ฒคํธ๋ฅผ ๋ํ๋ ๋ฐฉ์์ ๋๋ค.
Hot Observable / Cold Observable
์ด๋ฌํ ์ต์ ๋ฒ ํจํด์ ์ด์ฉํ์ฌ ๋ง๋ค์ด์ง Observable์๋ ๋ ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋๋ฐ, ๊ฐ๋ น ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ๊ณ ๋ฐ๋ก ๊ทธ ๋ก๋ฉ๋ ๋ด์ฉ์ ๋ฐ์ํ ๊ฒ์ด๋, ์๋๋ฉด ์ฌ์ฉ์์ ์์ฒญ์ด ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ด๋๋ผ๋ ์๋ฏธ์ ๋ ๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
์ค์ ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ด ์์ฃผ ์๊ตฌ๋๋ ๊ณณ์ ๋ฐ๋ก ๋ฐ์ดํฐ ํต์ ์ด ์ฆ์ ์ํํธ์จ์ด์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฐ์ดํฐ ํต์ ์ด๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ด๋ผ๊ณ ๋ง ํ ์๋ ์์ต๋๋ค. ๊ฐ์ฒด ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ฃผ ์๋ํ๋ ์ํํธ์จ์ด๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ด ์๊ตฌ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ง์ฐ์ค ํด๋ฆญ์ ์ด๋ฒคํธ๊ฐ ์ฆ์ ERP ๋ฑ์ ์ํํธ์จ์ด๊ฐ ์์ต๋๋ค.
- Hot Observable
๊ตฌ๋ ํจ์ ํธ์ถ ์ฌ๋ถ(๊ตฌ๋ ์์ ์กด์ฌ ์ฌ๋ถ)์ ๊ด๊ณ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ฉฐ ์ฌ๋ฌ ๊ตฌ๋ ์๊ฐ ์ด ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐํ ์ ์์ง๋ง ๋ชจ๋ ๊ตฌ๋ ์์ ๋ํ ๋ฐ์ดํฐ์ ๊ตฌ๋ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
๊ตฌ๋ ํ ์์ ๋ถํฐ ๋ฐํํ ๊ฐ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์์ ์ ์ ํฉํ ์ด๋ฒคํธ๋ค์ ๋ง์ฐ์ค ์ด๋ฒคํธ์ ์ผ์ ์ด๋ฒคํธ ๋ฑ ํ๋์จ์ด ์ด๋ฒคํธ๊ฐ ๋๋ถ๋ถ์ด๋ค.
์ฌ๋ฌ ๊ตฌ๋ ์๊ฐ ๊ตฌ๋ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ๋๋์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ์ ๋์ ๋ฐฐ์์ ๊ณ ๋ คํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ๋ฐฐ์์ด๋, ๋ฐํํ๋ ๋ฐ์ดํฐ๋ณด๋ค ๊ตฌ๋ ํ๋ ์๋๊ฐ ๋๋ ค์ง๋ ๊ฒฝ์ฐ ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ์ด์ผ๊ธฐ ํ๋ค. ์ด๋ฅผ ๋์ฒดํ๋ ๊ฒ์ผ๋ก Flowable์ด ์๋ค. - Cold Observable
๊ตฌ๋ ํจ์๊ฐ ํธ์ถ๋์ด ์์ง ์๋ค๋ฉด ์ผ์ ๋ฉ์์ง ๋ฐํ์ ํ์ง ์๋ Observable์ด๋ค. ๋น์ทํ ๋จ์ด๋ก Lazy Loading ๊ธฐ๋ฒ์ด๋ผ๊ณ ๋ ์ด์ผ๊ธฐ ํ๋ค. ORM์์๋ RelationShip์ด ์์ชฝ์ผ๋ก ์ฑ๋ฆฝ๋์ด ์๋ Entity์ผ ๊ฒฝ์ฐ ์ด Lazy Loading์ ๋ง์ด ์ฌ์ฉํ๋๋ฐ, RxJava์์ Cold Observable์ REST API์ ํต์ ์ ๋ง์ด ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋์์ ๋๋ ์๋ฒ์ ํธ์ถํ์ง ์๋ค๊ฐ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋์์ ๋ ์๋ฒ์ ์ฐ๊ฒฐ์ ์์ํจ์ผ๋ก์จ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ๋ํ์ ์ธ Observable์ด๊ธฐ๋ ํ๋ค.
์ค๋ช ์ด ์กฐ๊ธ ์ด๋ ค์ธ ์๋ ์์ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด Hot Observable์ ๊ตฌ๋ ๊ณผ ๊ด๊ณ ์์ด ๋ฉ์์ง๋ฅผ ๊ณ์ ๋ฐ๋ ํํ๋ก์จ ๊ฐ์ฅ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ํํ๋ฅผ ๋งํฉ๋๋ค. ๊ฐ๋ น ๋ง์ฐ์ค ์ด๋ฒคํธ๋ ํค๋ณด๋ ์ด๋ฒคํธ ๋ฑ ์ฌ์ฉ์์ ๋ฌดํํ ์ ๋ ฅ์ ๊ณ์ ๋ฐ์์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ฉฐ ๋น๊ต์ ์ด๋ฒคํธ ์์ฒด๊ฐ ๋ฌด๊ฑฐ์ด ์๋ฒ์์ ํต์ ์๋ ์ ํฉํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ์ผ์ผํค๋ ์์ธ์ด ๋๊ธฐ ๋๋ฌธ์ด์ฃ .
REST API์ ํน์ฑ์ ํ์ํ ๋ ํ ๋ฒ ํธ์ถํ๊ณ ์ฐ๊ฒฐ์ ๋๋ ํํ์ธ Cold Observable์ด ์ ํฉํ ๊ฒ์ ๋๋ค. ๋ด๊ฐ ํ์ํ ๋ ๊ตฌ๋ ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ด ๋ ๋ฉ์์ง ๋ฐํ์ ๊ตฌ๋ ํจ์์์ ๋ฐ์ํ๋ฉด ์ ํฉํ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง๊ณ ์ํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ฒ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ์ ์ธ Observable๋ก Connectable์ด ์์ต๋๋ค. Connectable์ connect ๋ฉ์๋๊ฐ ํธ์ถ๋์์ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
Single
Observable์ ๋ํ ๊ฐ๋ ์ดํด๊ฐ ๋์๋ค๋ฉด ์ด์ ํ๋์ฉ Observable์ ์ฌ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ง๋ ํฌ์คํธ์์๋ Observable์ด๋ผ๋ ์์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์๋๋ฐ, ์ด๋ฒ ํฌ์คํธ์์๋ Single์ด๋ผ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ฒ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
Single ํด๋์ค๋ RxJava 1.x์ ์ฒ์ ๋ฑ์ฅํ Observable ํด๋์ค์ ํน์ํ ํํ๋ก ์ค์ง ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์ ์๋ Observable ํด๋์ค์ ๋๋ค. ์ง๋ ํฌ์คํธ์์ ์ฌ์ฉํ๋ Observable ํด๋์ค๋ ์ต๋ 10๊ฐ์ ๋ฐ์ดํฐ๊น์ง๋ฅผ ์ธ์๋ก ๋ฐ์ ์ ์๊ณ , ์ธ์๊ฐ ์๋์ด๋ ๋ฌด์ ํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์ ์์์ง๋ง Single์ ์ค์ง ํ ๊ฐ์ ๋ฐ์ดํฐ๋ง์ ๋ฐ์ ์ ์์ต๋๋ค.
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) {
Single<String> single = Single.just("Hello");
Disposable disposable = single.subscribe(System.out::println, Throwable::printStackTrace);
disposable.dispose();
}
}
Single ํด๋์ค ์ญ์ Observable๊ณผ ๋์ผํ๊ฒ ๋ฆฌ์กํธ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ , ๊ตฌ๋ ํ๋ ๋ฐฉ๋ฒ๋ ๋ชจ๋ ๊ฐ์ต๋๋ค. ๋ค๋ง ๋จ์ผ์ ๋ฐ์ดํฐ๋ง์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ง ํ๋์ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ REST API์ ํน์ ์๋ํฌ์ธํธ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ๋ ์ ์ฉํฉ๋๋ค. okhttp3 ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ Callback ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ํน์ URI์ ์ฃผ์๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ ํ๋ก๊ทธ๋จ์ ์ด๋ป๊ฒ ์ ์ด๋ฅผ ํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์์ฃผ ๊ฐ๋จํ๊ณ ์ข์ต๋๋ค.
import io.reactivex.rxjava3.core.*;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
/**
* Created by Neon K.I.D on 1/4/21
* Blog : https://blog.neonkid.xyz
* Github : https://github.com/NEONKID
*/
public class Main {
interface API {
@GET(value = "/")
Call<String> hello();
}
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(chain -> null).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://127.0.0.1")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
API api = retrofit.create(API.class);
Single<String> single = Single.create(emitter -> {
api.hello().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
});
Disposable disposable = single.subscribe(System.out::println, Throwable::printStackTrace);
disposable.dispose();
}
}
REST API ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Retrofit2๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด ์์ ๊ฐ์ด ์ฝ๋ฉํ์ค ์ ์์ต๋๋ค. Single ํด๋์ค๋ฅผ ํ๋๋ง๋ค๊ณ , create ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์์ต๋๋ค.
๋จ, Single ํด๋์ค์ ๊ฒฝ์ฐ Observable๊ณผ๋ ๋ฌ๋ฆฌ onSuccess์ onError ํจ์๋ง์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฐธ๊ณ ํ์๊ณ ์ ์ฌ์ฉํ์๋ ๊ฒ ์ข๊ฒ ์ต๋๋ค.
Maybe
๋ค์์ Maybe ํด๋์ค์ ๋๋ค. Maybe ํด๋์ค๋ RxJava 2.x์์ ๋์จ ํด๋์ค๋ก Single ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ง ํ๋์ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ง ์ ์์ง๋ง ๊ตฌ๋ ํจ์๊ฐ ํธ์ถ๋์ง ์์๋ ๋ฐ์ดํฐ ๋ฐํ์ ์งํํ ์ ์๋ Hot Observable ํด๋์ค์ ๋๋ค.
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) {
Maybe<String> maybe = Maybe.just("HELLO");
Disposable disposable = maybe.subscribe(System.out::println, Throwable::printStackTrace);
disposable.dispose();
}
}
Single ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
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.just("SINGLE");
Maybe<String> maybe = Maybe.fromObservable(observable);
Disposable disposable = maybe.subscribe(System.out::println, Throwable::printStackTrace);
disposable.dispose();
}
}
๊ทธ๋ฌ๋ ๋ณดํต์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด Observable๋ก ์ฌ์ฉํ๋ค๊ฐ Maybe๋ก ์ค๋ ์ผ์ด์ค๊ฐ ๊ฝค ์๋๋ฐ์. ์ฌ์ค ๋จ์ผ ๋ฐ์ดํฐ๋ก๋ง ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฐ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๊ฒ ์ง๋ง ๋ณต์์ ๋ฐ์ดํฐ(Map, Set, List)๋ค์ด ์กด์ฌํ๋ Collections์ ๊ฒฝ์ฐ์์ ํน์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ง์ด ์์ฉํฉ๋๋ค.
์ด ์ธ์๋ reduce์ ๊ฐ์ ๋ฆฌ์กํฐ๋ธ ์ฐ์ฐ ํจ์์ ๊ฐ์ด ์์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋๋ฐ, ์์ง ๋ฆฌ์กํฐ๋ธ ์ฐ์ฐ ํจ์๋ฅผ ๋ค์ด๊ฐ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด ๋ด์ฉ์ ์ ์ ๋ฏธ๋ค๋๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ง์น๋ฉฐ...
Observable์ ์ข ๋ ์ฌ์ธต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ดค์ต๋๋ค. ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ ๋๋ select์ ๊ฐ์ ๋น๋๊ธฐ์ ์ธ ๋ถ๋ถ๋ค์ด ๋ง์ด ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค์ ๊ฐ๋ ์ ์๊ณ ์จ์ผ ํ ํ์๊ฐ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ค์ํ๊ฒ ์๊ฐํ๋ ๋ถ๋ถ์ ๋์์ฑ ์ฒ๋ฆฌ์ ๋ํ ์ด์์ ๋๋ค. ํ์ฌ ์ฐ๋ฆฌ๊ฐ RxJava๋ฅผ ๊ณ์ ๋ค๋ฃจ๋ฉด์ ๋จ์ผ ๋ฐ์ดํฐ์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃจ๊ณ ์๋๋ฐ์. ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ ๋ถ๋ค์ด๋ผ๋ฉด ๊ณต๊ฐํ์๊ฒ ์ง๋ง ์๋ธ ์ค๋ ๋์์ ์ฌ์ฉํ๊ณ ์๋ ๋ณ์๋ฅผ ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ฝ ๊ทธ๋ ๊ฒ ํ๋ก๊ทธ๋๋ฐ ํ๋๋ก ํ์๋ค๋ฉด ์ธ๋งํฌ์ด๋ ๋ฎคํ ์ค์ ๊ฐ์ ์ด์์ฒด์ ๋ฆฌ์์ค๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ข๊ณ , ์ด์ฉํ์ง ์์๋ค๋ฉด ์ด์์ฒด์ ์์ Critical Error์ ๋ด๋ฟ์ผ๋ ์ฃผ์ํด์ผ ํ๋ ๋ถ๋ถ์ผ ๊ฒ์ ๋๋ค.
RxJava๋ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์์๋ฅผ ๊ฐ๋ฐํ ๋๋ง๋ค ์ ๊ฒฝ์ฐ์ง ์๋๋ก ๋์์ค๋๋ค. ํ์ง๋ง ๊ทธ๋ ๋ค๊ณ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์์์ ๋ชฐ๋ผ๋ ๋๋ ์ด์ผ๊ธฐ๋ ์๋๋๋ค. ๊ธฐ๋ณธ๋ ์์์ ๊ฐ์ง๊ณ ์ ๋, ๊ฐ๋ฐํ ๋๋ง๋ค ์ด๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ์์ฐ์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ ์ผ์ ์ค์ด๊ธฐ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํ๋ค๋ ์ ์ ์์ ์ผ ํ ๊ฒ์ ๋๋ค.
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[RxJava] 3. Reactive ์ฐ์ฐ์ ํํค์ณ๋ณด๊ธฐ 1ํธ (์์ฑ, ๋ณํ ์ฐ์ฐ์) (0) | 2021.02.07 |
---|---|
[RxJava] 2. Reactive ๊ธฐ๋ณธ ์ฐ์ฐ์(Operator) - map, filter, reduce (0) | 2021.01.23 |
[RxJava] RxJava๋ก ์์ํ๋ Java Reactive ํ๋ก๊ทธ๋๋ฐ (5) | 2021.01.09 |
[Java] - Java Stream API (0) | 2020.01.11 |
[GP] Junit5๋ฅผ ์ฌ์ฉํ Java ํ ์คํธ ์ฝ๋ ์์ฑ (0) | 2019.09.29 |