You, I, And ReactiveUI ๊ตฌ๋งค ํ›„๊ธฐ

Reactive Extension(Rx)์€ .NET์„ ํ˜„๋Œ€์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, ์ด๋ฅผ ์ด์šฉํ•œ ์˜คํ”ˆ ์†Œ์Šค UI ํ”„๋ ˆ์ž„์›Œํฌ์ธ ReativeUI(RxUI)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

RxUI๋Š” ๋ฉ‹์ ธ๋ณด์ด์ง€๋งŒ, ๋‹ค๊ฐ€๊ฐ€๊ธฐ ์–ด๋ ต๊ณ  ํ•œ๊ตญ์–ด ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์ „๋ฌดํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.
์ €๋Š” AvaloniaUI๋ฅผ ํ†ตํ•ด RxUI๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ๋Š”๋ฐ, ํ† ์ดํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ํ•ด๋ณด๊ณ  ๋งค๋ ฅ์„ ๋Š๋ผ๋˜ ์ค‘ ๋” ์ž˜ ์•Œ๊ณ  ์‹ถ์–ด์„œ ์ฑ… ๊ตฌ๋งคํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

https://kent-boogaart.com/you-i-and-reactiveui/

์œ„ ๋ฌธ์„œ์˜ ๊ตฌ๋งค๋งํฌ์—์„œ blurb ๋กœ ์ด๋™ํ•˜์—ฌ ์—์„œ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฑ… ์ž์ฒด๋Š” 73๋‹ฌ๋Ÿฌ์ง€๋งŒ, ๋ฐฐ์†ก๋ฃŒ๊ฐ€ ๋ถ™์–ด์„œ 108๋‹ฌ๋Ÿฌ์— ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ์ฃผ ํ™”์š”์ผ(1์›” 24์ผ)์— ๊ตฌ๋งคํ•ด์„œ ์˜ค๋Š˜(1์›” 30์ผ) ์ˆ˜๋ นํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋งคํ•˜๋ฉด ์ด๋ฉ”์ผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜์ˆ˜์ฆ์ด ์˜ต๋‹ˆ๋‹ค

image

๊ทธ๋ฆฌ๊ณ  ์ฃผ๋ฌธ๋ฒˆํ˜ธ๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์†ก์ถ”์ ์ด ๋ฉ๋‹ˆ๋‹ค.

image

UPS๋Š” ํ•ด์™ธ์ง๊ตฌํ•  ๋•Œ ๊ฝค ์œ ๋ช…ํ•œ ์—…์ฒด๋ผ๊ณ  ํ•˜๋„ค์š”. DHL๊ธ‰์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ธ€์— ์ด์–ด, ์‹ค์ œ ๊ตฌ๋งค๋ฅผ ํ•˜๊ณ  ์ˆ˜๋ นํ•˜๊ฒŒ ๋˜๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒโ€ฆ์–‘์žฅ๋ณธ์ด๋ผ์„œ ๋งŽ์ด ํŽด๋ณด๋ฉด ์ฑ…์ด ๋ถ€์…”์งˆ๊ฑฐ๊ฐ™์€๋ฐโ€ฆ์Šคํ”„๋ง์ฒ ์„ ์œ„ํ•ด 2๊ถŒ ์‚ด ๊ป„ ํ•˜๋Š” ์•„์‰ฌ์›€์€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฑ…์ด ์–‡๋„ค์š”.

์˜์–ด์ฑ…์ด๋ผ ์ด๋ฏธ ๋ถ€๋‹ด์ด์ง€๋งŒ ์–‘์ด ์ ์–ด์„œ ๋ถ€๋‹ด์ด ์ข€ ์ ์–ด์ง„ ๊ฒƒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (์‚ฌ์‹ค ๋งŽ์œผ๋ฉด ๋” ์ข‹๊ฒ ์ง€๋งŒ ์•ˆ๋ณผ๊นŒ๋ด)

KakaoTalk_20230130_105747334_01
KakaoTalk_20230130_105747334_02

์—ด์‹ฌํžˆ ๋ณด๊ณ  ๋…ํ›„๊ฐ ํ›„๊ธฐ๋„ ์ž‘์„ฑํ•˜๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

8๊ฐœ์˜ ์ข‹์•„์š”

ReativeUI์— ๊ด€์‹ฌ์ด ์žˆ์–ด ์‚ด์ง ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ Observer์˜ ๊ฐœ๋…์ด ๋‚ซ์„ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜์ค€์œผ๋กœ ์ดํ•ดํ•˜๋Š”๋ฐ ์‹คํŒจํ–ˆ๋Š”๋ฐ ๊ด€๋ จ ๊ฒฝํ—˜์„ ์ด๊ณณ์— ๋‚˜๋ˆ  ์ฃผ์‹ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋งŽ์ด ๋  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

Reactive Extensions ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€
Observer ํŒจํ„ด + LINQ + Scheduler ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ

  • Observer : ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ์˜ต์ €๋ฒ„ ํŒจํ„ด. ์ด๋ฅผ ์œ„ํ•œ ๊ฐœ์ฒด์™€ ์ถ”์ƒํ™”๋ฅผ IObservable๊ณผ ์นœ๊ตฌ๋“ค๋กœ ์ œ๊ณต
    (C#์—์„œ ์ด๋ฏธ ์ต์ˆ™ํ•œ ์˜ต์ €๋ฒ„ ํŒจํ„ด์€ event ํ‚ค์›Œ๋“œ)
    (IObservable: ๊ตฌ๋…์„ ์ˆ˜๋ฝํ•ด์ฃผ๋Š” ๋…€์„)
    (IObserver: ๊ตฌ๋…ํ•˜๋Š” ๋…€์„)
    (์ด ํƒ‘ ๋ ˆ๋ฒจ ์ถ”์ƒํ™”๋“ค ์™ธ์— ๋ถ€๊ฐ€์ ์ธ ์นœ๊ตฌ๋“ค ์กด์žฌ)

  • LINQ: ์•Œ๊ณ  ๊ณ„์‹  .NET์˜ ์งˆ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • Scheduler: ์Šค๋ ˆ๋”ฉ

์˜ต์ €๋ฒ„๋Š” ์ง„์งœ c#์˜ event ํ‚ค์›Œ๋“œ ๋งˆ๋ƒฅ, ์˜ต์ €๋ฒ„ ํŒจํ„ด์˜ ๋˜๋‹ค๋ฅธ ๋ฌผ๋ฆฌ์  ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค.


์ถ”๊ฐ€์ ์œผ๋กœ RX๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ๋Š”โ€ฆ

LINQ๋Š” ์ปฌ๋ ‰์…˜์„ ์งˆ์˜ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
RX๋Š” ์ปฌ๋ ‰์…˜์ด ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ๋ฅผ ์งˆ์˜ (ํ•„ํ„ฐ๋ง)ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์— ์Šค๋ ˆ๋”ฉ์„ ์กฐ์ž‘ํ•˜๋Š” Scheduler๋ฅผ ๋ถ™์—ฌ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.

Application์˜ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๋Š” ํŠน์ • ์ƒํƒœ์˜ ์ตœ์ดˆ ์ด๋ฒคํŠธ์— ์˜ํ•ด ํŒŒ์ƒ์ ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋น„ํšจ๊ณผ?)
์ด ์ตœ์ดˆ ์ด๋ฒคํŠธ์—์„œ ๋ถ€ํ„ฐ ์ข…๋‹จ(endpoint)๊นŒ์ง€ ์ด๋ฒคํŠธ๋ฅผ ์งˆ์˜ํ•˜๊ฑฐ๋‚˜ ๋ณ€์‹ ์‹œ์ผœ์„œ ํผ๋‹ค ๋‚˜๋ฆ…๋‹ˆ๋‹ค.

9๊ฐœ์˜ ์ข‹์•„์š”