[RxJava] 1. RxJava์˜ ๊ธฐ๋ณธ - Observable

๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ Observable์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ๋‹ค๋ค„๋ดค๊ณ , ์ด์— ๋”ฐ๋ฅธ ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ฉฐ ๊ฐ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Observable์„ ์ข€ ๋” ์‹ฌ์˜คํ•˜๊ฒŒ ๋‹ค๋ค„๋ณด๊ณ , ์ด์— ์‘ํ•˜๋Š” Single, Maybe ๋“ฑ ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค ๋“ฑ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ RxJava์™€ ์ข€ ๋” ์นœ์ˆ™ํ•ด์ง€๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

Observer Design Pattern

RxJava์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” Observable ํด๋ž˜์Šค๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์ธ Observer Pattern์„ ๊ทผ๊ฐ„์œผ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์˜ต์„œ๋ฒ„ ํŒจํ„ด - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ์˜ต์„œ๋ฒ„ ํŒจํ„ด(observer pattern)์€ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๊ด€์ฐฐ์ž๋“ค, ์ฆ‰ ์˜ต์ €๋ฒ„๋“ค์˜ ๋ชฉ๋ก์„ ๊ฐ์ฒด์— ๋“ฑ๋กํ•˜์—ฌ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ฉ”์„œ๋“œ ๋“ฑ์„ ํ†ตํ•ด ๊ฐ์ฒด

ko.wikipedia.org

์œ„ํ‚ค์— ๋‚˜์™€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜ต์ €๋ฒ„ ํŒจํ„ด์€ 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๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์š”์†Œ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋งˆ๋‹ค ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์†Œ์–‘์„ ๋ชฐ๋ผ๋„ ๋˜๋Š” ์ด์•ผ๊ธฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๋œ ์†Œ์–‘์€ ๊ฐ€์ง€๊ณ  ์žˆ ๋˜, ๊ฐœ๋ฐœํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์ƒ์‚ฐ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๋Š” ์ผ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ์ ์„ ์•„์…”์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments