Skip to content

Latest commit

ย 

History

History
290 lines (209 loc) ยท 11.6 KB

RxJava.md

File metadata and controls

290 lines (209 loc) ยท 11.6 KB

๋ถ€์ƒํ•˜๊ณ  ์žˆ๋Š” Rx Java

๋ชฉ์ฐจ

  1. Rx Java ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ 1.1. ๋™๊ธฐ/๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ 1.2. ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ 1.3. ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ 1.4. ์˜ˆ์ œ
  2. Rx Java์˜ ํŠน์ง• 2.1. ์žฅ์  2.2. ๋‹จ์  2.3. ์˜ˆ์ œ ์ฝ”๋“œ, ์ฝ”๋“œ ๋น„๊ต
  3. ์‚ฌ์šฉ๋˜๋Š” ๊ณณ
  4. ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ!! 4.1. ์ดํ•ด๋ฅผ ๋•๊ธฐ์œ„ํ•ด ์•Œ์•„ ๋‘˜ ๊ฒƒ 4.1.1. observer pattern 4.1.2. Iterator pattern 4.1.3. Functional programming (1.3. ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) 4.1.4. MVVM model 4.1.5. Dataflow programming 4.2. ๊ธฐ๋ณธ์ ์ธ ๋นŒ๋”ฉ ๋ธ”๋ก 4.2.1. Observable 4.2.2. Subscriber 4.3. ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
  5. ์ฝ”๋“œ ์ฝ์–ด๋ณด๊ธฐ 5.1 ๊ตฌ๊ตฌ๋‹จ ์ฝ”๋“œ
  6. ๋ ˆํผ๋Ÿฐ์Šค
  7. ๋” ๋‚˜์•„๊ฐ€ ๋ณด๊ธฐ

1. Rx Java์˜ ๋“ฑ์žฅ๋ฐฐ๊ฒฝ

Rx Java๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๊ทผ 2๋…„๊ฐ„ ๊ธ‰ ๋ถ€์ƒ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•ž์œผ๋กœ๋Š” ์–ด๋–ป๊ฒŒ Rx Java๊ฐ€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๊ฒฐํ•ด ์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ ๊ธฐ์กด์— ์‚ฌ์šฉํ–ˆ๋˜ ์–ธ์–ด๋Š” Java์ž…๋‹ˆ๋‹ค. Java, C#, C++ ๋“ฑ์˜ ๊ฐœ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋Œ€๋ถ€๋ถ„ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋””์ž์ธ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ ๊ณต๋ถ€ํ•˜๋ ค๋Š” Rx Java๋Š” ํ•จ์ˆ˜์  ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฐฉ๋ฒ•์ด๋ฉฐ ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Reactive Programming)์œผ๋กœ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๊ธฐ๋ฐ˜์„ ๋‘” ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค.

1.1. ๋™๊ธฐ/๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ : ์ž‘์—…์„ ํ•˜๋‚˜ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๊ทธ ์ž‘์—…์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ : ์ž‘์—…์„ ์š”์ฒญ ํ•œ ํ›„์—, ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

1.2. ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ํ•˜๋‚˜์”ฉ ํ•˜๋‚˜์”ฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๊ตฌ์ฒด์ ์ด๊ณ  ์ž์„ธํ•˜๊ณ  ๋™์ž‘ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” '์–ด๋–ค ๋ฐฉ๋ฒ•'์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ• ์ง€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ž…๋‹ˆ๋‹ค.

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ ๊ทธ๋ ‡๋‹ค๋ฉด ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฌธ์ด ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•˜์ง€๋งŒ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฝ์šฐ์—๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ์ค‘์š”๋„๊ฐ€ ๋†’๊ณ  ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์ˆœ์„œ์˜ ์ค‘์š”๋„ ์—ญ์‹œ๋„ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋น„๋™์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ผ ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

1.3. ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ช…๋ นํ˜•์ด ์•„๋‹Œ ์„ ์–ธํ˜•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ์ค‘์š”๋„์™€ ์‹คํ–‰ ์ˆœ์„œ์˜ ์ค‘์š”๋„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ์ฐจ์ ์œผ๋กœ ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์ˆ˜์›”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.4. ์˜ˆ์ œ

  • ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ <์–‘์˜ ์ •์ˆ˜์™€ ์ง์ˆ˜์™€ ์†Œ์ˆ˜ ์ถœ๋ ฅ>

    Using System;
    using System.Collections.Generic;
    namespace _01_Even_and_Prime
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
                Print("All:", numbers);
                Print("Evens:", GetEvens(numbers));
                Print("Primes:", GetPrimes(numbers));
            }
            public static void Print(string label, int[] source)
            {
                Console.WriteLine(label);
                foreach (int item in source)
                    Console.Write(" {0}", item);
                Console.WriteLine("");
            }
            static int[] GetEvens(int[] numbers)
            {
                List result = new List();
                if (numbers != null)
                {
                    foreach (int number in numbers)
                    {
                        if ((number % 2) == 0)
                            result.Add(number);
                    }
                }
                return result.ToArray();
            }
        }
    }

    Console Result All : 1 2 3 4 5 6 7 8 9 10 Evens : 2 4 6 8 10


    ์ง์ˆ˜๋Š” GetEvens ํ•จ์ˆ˜์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๊ณ  ์žฌ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค. ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ• ์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ธฐ์ˆ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ <์ง์ˆ˜ ๊ตฌํ•˜๊ธฐ>

    [1 .. 15]
    |> List.sortBy(fun x -> -x)
    |> List.filter(fun x -> x % 2 = 0)
    |> List.iter(printfn "%d")

    โ€˜|>โ€™๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ์ž์ด๋ฉฐ List์˜ sortBy, filter, iter ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ด๋‹ค. ์ธ์ž๋กœ ์ „๋‹ฌํ•  ํ•จ์ˆ˜๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” fun์„ ์ด์šฉํ•ด โ€˜x -> -xโ€™์™€ โ€˜x -> x % 2โ€™๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋†’์€ ์ถ”์ƒํ™” ์ œ๊ณต

2. Rx Java์˜ ํŠน์ง•

2.1. ์žฅ์ 

์šฐ์„  ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋” ์ด์ƒ ๊ฐœ์„ ํ•˜๊ธฐ ํž˜๋“  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ˜„์ƒ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ Rx Java๋ฅผ ๋ˆˆ์—ฌ๊ฒจ ๋ณด์•„์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด, ๋ชจ๋ฐ”์ผ ์‚ฌ์šฉ์ž๋“ค์ด ์›ํ•˜๋Š” ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ˆ๋“œ๋กœ์ด๋“œ ๋‚ด๋ถ€์—์„œ๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์˜ฎ๊ฒจ ๋‹ค๋‹ˆ๋ฉด์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์ด ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Rx Java์˜ ๊ฒฝ์šฐ์—๋Š” ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ ์ „ํ™˜์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ์ข‹์€ ๋Œ€์ฒด ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, Operator๋“ค์˜ ์กฐํ•ฉ์œผ๋กœ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‡„์ ์ธ API ํ˜ธ์ถœ์—์„œ Rx Java์˜ ์œ ์—ฐํ•จ์„ ๋ณด์—ฌ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽธํ•˜๊ฒŒ ํ๋ฆ„์„ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ตฌํ˜„ ์—ญ์‹œ๋„ Java์—์„œ Async Task์™€ ๋น„๊ตํ•œ๋‹ค๋ฉด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.2. ๋‹จ์ 

Rx Java๋Š” ์šฐ์„  ์ง„์ž…์žฅ๋ฒฝ์ด ๋†’์€ ํŽธ์ž…๋‹ˆ๋‹ค. Rx Java ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ, Java๋‚˜ C++๋“ฑ์˜ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ต์ˆ™ํ•ด์ ธ์žˆ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž์ฒด๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ํ•™์Šต๋น„์šฉ์ด ๋งŽ์ด ๋“ค์–ด ํฐ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์ด ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— Rx Java๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์—…์—์„œ ์ผํ•˜์‹œ๋Š” ๊ฐœ๋ฐœ์ž ๋‹˜๋“ค๋„ ๊ฐœ๋…์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜์‹œ๋Š”๋ฐ 6๊ฐœ์›”์ด ๊ฑธ๋ฆฌ์…จ๋‹ค๋Š” ์†Œ๋ฆฌ๊ฐ€...

2.3. ์˜ˆ์ œ (์ฝ”๋“œ ๋น„๊ต)

๊ฐ€์ •๋œ ์ƒํ™ฉ : ๊ฐ€์ƒ์˜ ์„œ๋ฒ„์— User API๋ฅผ ํ˜ธ์ถœํ•œ ๋’ค์—, ๊ทธ ์‚ฌ์šฉ์ž์˜ ID๊ฐ’์„ ๋‹ค์‹œ ์„œ๋ฒˆ์— ๋ณด๋‚ด์„œ ์œ ํšจํ•œ ์‚ฌ์šฉ์ž์ธ์ง€ ์•„๋‹Œ์ง€ ์•Œ์•„์•ผํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

<Async Task๋ฅผ ์‚ฌ์šฉํ•œ ์—ฐ์‡„๋œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ >

public class GetUserAsyncTask extends AsyncTask {
      doInBackground() {
          //โ€ฆ network logic
          return user;
      }
 
      onPostExecute(User user) {
           new ValidUserAsyncTask(user).execute();
      }
}
 
public class ValidUserAsyncTask extends AsyncTask {
      public ValidUserAsyncTask(User user) { }
 
      doInBackground() {
           //โ€ฆ more network logic
           return isUserValid; 
      }
 
      onPostExecute(boolean isUserValid) {
        isUserValid ? doSomething : doSomethingElse
      }
}

<Rx Java๋ฅผ ์‚ฌ์šฉํ•œ ์—ฐ์‡„๋œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ >

UserAPI.getUser()
    .subscribeOn(Schedulers.io())
    .flatMap(user ->  VerifyAPI.checkValid(user))
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(isUserValid -> isUserValid ? doSomething : doSomethingElse);

3. ์‚ฌ์šฉ๋˜๋Š” ๊ณณ

  • ์—ฐ์‡„ API ํ˜ธ์ถœ
  • ํ‰ํ–‰ API ํ˜ธ์ถœ
  • ํ…Œ์ŠคํŒ…
  • UI ๋กœ์ง ํ•ธ๋“ค๋ง
  • ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด๋‚ด๊ณ  ์‹ถ์„๋•Œ (A์ž‘์—…์ด ๋๋‚˜๊ณ  B๊ฐ€ ์‹œ์ž‘๋์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.)
  • ์ฝœ๋ฐฑ์„ ๋ฐ›์•˜๋Š”๋ฐ ๋ฐ›๋Š” ํ™”๋ฉด์ด ์‚ฌ๋ผ์ ธ์„œ null์—๋Ÿฌ๋ฅผ ๋ฟœ์œผ๋ฉด์„œ ์ฃฝ์„ ๋•Œ
  • ํ•ธ๋“ค๋Ÿฌ๋ž‘ ์ฝœ๋ฐฑ ์ง€์˜ฅ์— ๋น ์ ธ์„œ ๋””๋ฒ„๊น…๋„ ํž˜๋“ค๊ณ  ํ–‡๊น”๋ฆด ๋•Œ
  • ๋‘๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— ๊ฒฐ๊ณผ ๊ฐ’์„ ํ•ฉ์ณ์„œ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ
  • ๋ฒ„ํŠผ์„ ์—ฐํƒ€๋กœ ๋ˆŒ๋Ÿฌ์„œ ์ด๋ฒคํŠธ๊ฐ€ ์ค‘๋ณต์‹คํ–‰ ๋  ๋•Œ
  • ์“ฐ๋ ˆ๋“œ ๊ด€๋ฆฌ๊ฐ€ ํž˜๋“ค ๋•Œ

4. ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ!!

4.1. ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์•Œ์•„๋‘˜ ๊ฒƒ

4.1.1. observer pattern

์˜ต์ €๋ฒ„ ํŒจํ„ด์€ ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ทธ ๊ฐ์ฒด์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์—๊ฒŒ ์—ฐ๋ฝ์ด ๊ฐ€๊ณ  ์ž๋™์œผ๋กœ ์ •๋ณด๊ฐ€ ๊ฐฑ์‹ ๋˜๋Š” 1:N ์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

4.1.2. Iterator pattern 4.1.3. Functional programming (1.3. ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ ํ”„๋กœ๊ทธ๋ž˜๋ฐ) 4.1.4. MVVM model 4.1.5. Dataflow programming

####4.2. ๊ธฐ๋ณธ์ ์ธ ๋นŒ๋”ฉ ๋ธ”๋ก

๋ฐ˜์‘์ ์ธ ์ฝ”๋“œ์˜ ๊ธฐ๋ณธ์ ์ธ ๋นŒ๋”ฉ ๋ธ”๋ก์€ Observable๋“ค๊ณผ Subscriber๋“ค์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๊ฐ€์žฅ ์ž‘์€ ๋นŒ๋”ฉ ๋ธ”๋ก์€ Observer์ด์ง€๋งŒ ์‹ค์ œ๋กœ Subscriber๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ Observable์€ ์•„์ดํ…œ์„ ๋ฐœํ–‰ํ•˜๋Š” ๊ณณ์— ์‚ฌ์šฉ๋˜๊ณ  Subscriber์€ ์ด ์•„์ดํ…œ๋“ค์„ ์†Œ๋น„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

4.2.1. Observable

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์‹คํ–‰(์‹œ์ž‘?)ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

4.2.2. Subscriber

Observable์— ์†ํ•ด์žˆ๋Š” Subcrber๋งˆ๋‹ค Subcirber.onNext( ), Subscriber.onComplete( ), ๋˜๋Š” Subscriber.onError( )๊ฐ€ ๋’ค๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

Observable์€ ์•„๊นŒ ๋งํ–ˆ๋“ฏ์ด์ด๋Š” ์„ฑ๊ณต์ ์ธ ์™„๋ฃŒ(Subscriber. onComplete( )) ๋˜๋Š” ์—๋Ÿฌ(Subscriber.onEror( ))์— ์ธํ•ด์„œ ์ข…๋ฃŒ๊ฐ€ ๋˜๋Š”๋ฐ ๊ทธ ๊ฐ๊ฐ์˜ ์ƒํƒœ๊ฐ€ ์œ„์˜ ๋ฉ”์„œ๋“œ์— ์†ํ•ด์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์Šค๋กœ ์ดํ•ดํ•ด๋ณธ ๋ฐ”๋กœ๋Š” ์ด ๋ถ€๋ถ„์ด ๋ฉ”์„œ๋“œ ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์—ฐ์‡„์ ์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Observable์ด๋ž‘ Subscriber์ด๋ž‘ ํ—ท๊ฐˆ๋ฆด ํ•„์š”๊ฐ€ ์—†๋Š”๊ฒŒ Observable ์•ˆ์— Subscriber์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ ๊ฒฐ๊ณผ๋“ค์„ ์ˆ˜์‹ ๋ฐ›๋Š” ๋ถ€๋ถ„์ด Observer์ด๋‹ค.

Observable์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  Subscriber์€ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ํ™”๋ฉด์— ๋ณด์—ฌ์ค€๋‹ค๊ณ  ์ƒ๊ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ๋Š” Observable์€ ํ™”๋ฉด์˜ ํด๋ฆญ์ด๊ณ  Subscriber์€ ๊ทธ์— ๋Œ€ํ•œ ๋ฐ˜์‘์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

4.3. ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜

  • map( )
  • flatMap( )
  • just( )
  • merge( )
  • filter( )
  • action( )

http://pluu.github.io/blog/rx/2015/04/29/rxjava/

http://rxmarbles.com/#map

5. ์ฝ”๋“œ ์ฝ์–ด๋ณด๊ธฐ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ

Observable<String> myObservable = Observable.create(
  new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> sub) {
      sub.onNext(โ€œHello, world!โ€);
      sub.onCompleted();
    }
  }
);

Observable

Subscriber<String> mySubscriber = new Subscriber<String>() {
  @Override
    public void onNext(String s) { System.out.println(s); }
  @Override
    public void onCompleted() { }
  @Override
    public void onError(Throwable e) { }
};

Subscriber

myObservable.subscribe(mySubscriber);
// Outputs โ€œHello, world!โ€

ํ•ฉ์ทŒ!!!โ™ฅโ™ชโ™ฅโ™ฉโ™ฅโ™ช

6. ๋ ˆํผ๋Ÿฐ์Šค

https://academy.realm.io/kr/posts/kau-felipe-lima-adopting-rxjava-airbnb-android/

http://kimjihyok.info/2017/06/02/asynctask%EC%99%80-%EB%B9%84%EA%B5%90%ED%95%B4%EC%84%9C-%EB%8B%B9%EC%8B%A0%EC%9D%B4-rxjava%EB%A5%BC-%EB%8B%B9%EC%9E%A5-%EC%8D%A8%EC%95%BC%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0/

http://alltogetherwe.tistory.com/16

https://medium.com/@LIP/rxjava-29cfb3ceb4ca

https://poqw.github.io/RxJava2_1/

http://flowarc.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%98%B5%EC%A0%80%EB%B2%84-%ED%8C%A8%ED%84%B4Observer-Pattern