Mithril Stream์ ๊ฐ๋ ฅํจ๊ณผ ๋จ์ํจ์ ํ์ํด ๋ณด์ธ์. ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์ ํธ๋ฆฌํฐ๋ฅผ ํ์ฉํ์ฌ ํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ์ธ์. ์ฝ๋ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Mithril Stream ๋ง์คํฐํ๊ธฐ: ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์ ํธ๋ฆฌํฐ ์ข ํฉ ๊ฐ์ด๋
Mithril Stream์ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ์ ์ด๋ฒคํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ณ๊ณ ๋ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์์น์ ๊ตฌํํ๋ ๊ฐ๋จํ๊ณ ์ฐ์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ํธ์์ฉ์ฑ์ด ๋๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ ์ ์๋๋ก ํฉ๋๋ค. ๋๊ท๋ชจ ๋ฐ์ํ ํ๋ ์์ํฌ์ ๋ฌ๋ฆฌ, Mithril Stream์ ํต์ฌ ์คํธ๋ฆผ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ค์ ์ ๋์ด ๊ฐ๋ฐ์๊ฐ ๊ธฐ์กด ํ๋ก์ ํธ์ ์ํํ๊ฒ ํตํฉํ๊ฑฐ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐํฉํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ฐ์ด๋๋ Mithril Stream์ ๊ธฐ๋ณธ ๊ฐ๋ , ์ค์ ์ ์ฉ ์ฌ๋ก, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ ๋ฌด์์ธ๊ฐ?
๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐ์ดํฐ ์คํธ๋ฆผ๊ณผ ๋ณํ์ ์ ํ์ ์ด์ ์ ๋ง์ถ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ ์ด๋ฒคํธ์ ๋ณํ์ ์์ธก ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ์ค์ฌ์ผ๋ก ํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก, ์ด๋ ๋ฐ์ดํฐ ์์ค์ ์๋น์ ์ฌ์ด์ ์์กด ๊ด๊ณ๋ฅผ ์ค์ ํ์ฌ ์์ค๊ฐ ๋ณ๊ฒฝ๋ ๋ ์๋น์๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋น๋๊ธฐ ์์ ์ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์๋ต์ฑ์ ๊ฐ์ ํ๋ฉฐ, ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์คํธ๋ฆผ(Streams): ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ๋๋ ์ด๋ฒคํธ์ ์ฐ์. ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์์ค์์ ๋ชฉ์ ์ง๋ก ์ด๋ฐํ๋ ๊ฐ๋ฌผ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
- ์๊ทธ๋(Signals): ํ ๋ฒ์ ๋จ์ผ ๊ฐ๋ง ๋ณด์ ํ๋ ํน๋ณํ ์ ํ์ ์คํธ๋ฆผ. ๋ฐ์ดํฐ ์์ค์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ ๋๋ค.
- ์ต์ ๋ฒ(Observers): ์คํธ๋ฆผ์ด๋ ์๊ทธ๋์ ๋ณํ์ ๋ฐ์ํ๋ ํจ์. ๋ฐ์ดํฐ์ ์๋น์์ ๋๋ค.
- ์ฐ์ฐ์(Operators): ์คํธ๋ฆผ์ ๋ณํํ๊ฑฐ๋ ๊ฒฐํฉํ์ฌ ๋ฐ์ดํฐ ํ๋ฆ์ ์กฐ์ํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์.
๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ฑ๋ฅ ํฅ์: ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ์ ์์กดํ๋ ์ปดํฌ๋ํธ๋ง ์ ๋ฐ์ดํธํจ์ผ๋ก์จ ๋ถํ์ํ ์ฌ๋ ๋๋ง๊ณผ ๊ณ์ฐ์ ์ต์ํํฉ๋๋ค.
- ๋จ์ํ๋ ์ํ ๊ด๋ฆฌ: ์ํ๋ฅผ ์ค์ ์ง์คํํ๊ณ ์คํธ๋ฆผ์ ํตํด ๋ฐ์ดํฐ ํ๋ฆ์ ๊ด๋ฆฌํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ๋จ์ํํ๊ณ ๋ฒ๊ทธ์ ์ํ์ ์ค์ ๋๋ค.
- ํฅ์๋ ์ฝ๋ ์ ์ง๋ณด์์ฑ: ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ถ๋ก ํ ์ ์๊ฒ ํ์ฌ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
- ๋ ๋์ ์๋ต์ฑ: ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ฌ์ฉ์ ์ํธ์์ฉ ๋ฐ ์ธ๋ถ ์ด๋ฒคํธ์ ์๋ตํ ์ ์์ต๋๋ค.
Mithril Stream ์๊ฐ
Mithril Stream์ ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ๊ธฐ๋ฐ์ ์ ๊ณตํ๋ ์๊ณ ์์กด์ฑ์ด ์๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์คํธ๋ฆผ์ ์์ฑํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ๊ฐ๋จํ API๋ฅผ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ ์์กด์ฑ์ ์ ์ํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ํจ์จ์ ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. Mithril Stream์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฒฝ๋์ฑ: ์ต์ํ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ผ๋ก ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
- ์์กด์ฑ ์์: ์ธ๋ถ ์์กด์ฑ์ด ์์ด ๊ธฐ์กด ํ๋ก์ ํธ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
- ๊ฐ๋จํ API: ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๋ ๊ฐ๋ฐ์๋ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
- ์กฐํฉ ๊ฐ๋ฅ์ฑ: ์คํธ๋ฆผ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๊ฒฐํฉํ๊ณ ๋ณํํ ์ ์์ต๋๋ค.
- ํจ์จ์ฑ: ์ฑ๋ฅ์ ์ต์ ํ๋์ด ์ค๋ฒํค๋๋ฅผ ์ต์ํํฉ๋๋ค.
Mithril Stream์ ๋จ์ํจ๊ณผ Mithril.js ์ปดํฌ๋ํธ ํ๋ ์์ํฌ์์ ๊ธด๋ฐํ ํตํฉ์ ์ค์ ์ ๋๋ค๋ ์ ์์ ๋ค๋ฅธ ๋ฐ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฐจ๋ณํ๋ฉ๋๋ค. ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง, Mithril๊ณผ ๊ฒฐํฉํ์ฌ ๋ฐ์ํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ๋ ๊ทธ ์ง๊ฐ๋ฅผ ๋ฐํํฉ๋๋ค.
Mithril Stream์ ํต์ฌ ๊ฐ๋
Mithril Stream์ ํต์ฌ ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์คํธ๋ฆผ (Streams)
์คํธ๋ฆผ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณํ๋ ๊ฐ์ ์ฐ์์
๋๋ค. Mithril Stream์์ ์คํธ๋ฆผ์ ํ์ฌ ๊ฐ์ ์ป๊ฑฐ๋ ์ ๊ฐ์ ์ค์ ํ๊ธฐ ์ํด ํธ์ถํ ์ ์๋ ํจ์์
๋๋ค. ์ ๊ฐ์ด ์ค์ ๋๋ฉด ๋ชจ๋ ์ข
์ ์คํธ๋ฆผ์ด ์๋์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค. stream()
์ ์ฌ์ฉํ์ฌ ์คํธ๋ฆผ์ ์์ฑํฉ๋๋ค:
const myStream = stream();
// Get the current value
console.log(myStream()); // undefined
// Set a new value
myStream("Hello, world!");
// Get the updated value
console.log(myStream()); // "Hello, world!"
์คํธ๋ฆผ์ ์ซ์, ๋ฌธ์์ด, ๊ฐ์ฒด, ์ฌ์ง์ด ๋ค๋ฅธ ์คํธ๋ฆผ์ ํฌํจํ ๋ชจ๋ ์ ํ์ ๊ฐ์ ๋ณด์ ํ ์ ์์ต๋๋ค.
์๊ทธ๋ (Signals)
Mithril Stream์ "์๊ทธ๋" ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ํ์ง๋ ์์ง๋ง, ์คํธ๋ฆผ์ด ์ฌ์ค์ ์๊ทธ๋ ์ญํ ์ ํฉ๋๋ค. ์๊ทธ๋์ ์คํธ๋ฆผ์ ํ์ฌ ๊ฐ์ ๋ํ๋ ๋๋ค. ์คํธ๋ฆผ์ด ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์๊ทธ๋์ด ๋ณ๊ฒฝ๋์ด ๋ชจ๋ ์ข ์ ์คํธ๋ฆผ์ ์ ๋ฐ์ดํธ๋ฅผ ์ ํํฉ๋๋ค. "์คํธ๋ฆผ"๊ณผ "์๊ทธ๋"์ด๋ผ๋ ์ฉ์ด๋ Mithril Stream์ ๋งฅ๋ฝ์์ ์ข ์ข ํผ์ฉ๋ฉ๋๋ค.
์์กด์ฑ (Dependencies)
Mithril Stream์ ๊ฐ๋ ฅํจ์ ์คํธ๋ฆผ ๊ฐ์ ์์กด์ฑ์ ์์ฑํ๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค. ํ ์คํธ๋ฆผ์ด ๋ค๋ฅธ ์คํธ๋ฆผ์ ์์กดํ ๋, ์์ค ์คํธ๋ฆผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ์ข ์ ์คํธ๋ฆผ์ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์์กด์ฑ์ ํ ์คํธ๋ฆผ์ ๊ฐ์ด ๋ค๋ฅธ ์คํธ๋ฆผ์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ ๋ ์ค์ ๋ฉ๋๋ค.
const name = stream("Alice");
const greeting = stream(() => "Hello, " + name() + "!");
console.log(greeting()); // "Hello, Alice!"
name("Bob");
console.log(greeting()); // "Hello, Bob!"
์ด ์์ ์์ greeting
์ name
์ ์์กดํฉ๋๋ค. name
์ด ๋ณ๊ฒฝ๋๋ฉด greeting
์ ์๋์ผ๋ก ๋ค์ ๊ณ์ฐ๋๊ณ ๊ทธ ๊ฐ์ด ์
๋ฐ์ดํธ๋ฉ๋๋ค.
์ฐ์ฐ์ (Operators)
Mithril Stream์ ์คํธ๋ฆผ์ ๋ณํํ๊ณ ๊ฒฐํฉํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ด์ฅ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ํ๋ฆ์ ์กฐ์ํ๊ณ ๋ณต์กํ ๋ฐ์ํ ํ์ดํ๋ผ์ธ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฐ์ฐ์ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
map(stream, fn)
: ์ ๊ณต๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ค ์คํธ๋ฆผ์ ๊ฐ์ ๋ณํํ๋ ์ ์คํธ๋ฆผ์ ๋ง๋ญ๋๋ค.scan(stream, fn, initialValue)
: ์ ๊ณต๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ค ์คํธ๋ฆผ์ ๊ฐ์ ๋์ ํ๋ ์ ์คํธ๋ฆผ์ ๋ง๋ญ๋๋ค.merge(stream1, stream2, ...)
: ๋ชจ๋ ์์ค ์คํธ๋ฆผ์ ๊ฐ์ ๋ฐฉ์ถํ๋ ์ ์คํธ๋ฆผ์ ๋ง๋ญ๋๋ค.combine(fn, streams)
: ์ ๊ณต๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์คํธ๋ฆผ์ ๊ฐ์ ๊ฒฐํฉํ๋ ์ ์คํธ๋ฆผ์ ๋ง๋ญ๋๋ค.
์ด๋ฌํ ์ฐ์ฐ์๋ค์ ํจ๊ป ์ฐ๊ฒฐํ์ฌ ์ ๊ตํ ๋ฐ์ดํฐ ๋ณํ์ ๋ง๋ค ์ ์์ต๋๋ค.
Mithril Stream์ ์ค์ ์์
Mithril Stream์ ๊ฐ๋ ฅํจ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์์ 1: ๊ฐ๋จํ ์นด์ดํฐ
์ด ์์ ๋ Mithril Stream์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์นด์ดํฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:
const count = stream(0);
const increment = () => count(count() + 1);
const decrement = () => count(count() - 1);
// Mithril Component
const Counter = {
view: () => {
return m("div", [
m("button", { onclick: decrement }, "-"),
m("span", count()),
m("button", { onclick: increment }, "+"),
]);
},
};
mithril.mount(document.body, Counter);
์ด ์์ ์์ count
๋ ํ์ฌ ์นด์ดํฐ ๊ฐ์ ๋ณด์ ํ๋ ์คํธ๋ฆผ์
๋๋ค. increment
๋ฐ decrement
ํจ์๋ ์คํธ๋ฆผ์ ๊ฐ์ ์
๋ฐ์ดํธํ์ฌ Mithril ์ปดํฌ๋ํธ์ ์ฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
์์ 2: ์ค์๊ฐ ์ ๋ฐ์ดํธ ์ ๋ ฅ ํ๋
์ด ์์ ๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ๋๋ก ์ค์๊ฐ์ผ๋ก ๋์คํ๋ ์ด๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ ๋ ฅ ํ๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:
const text = stream("");
// Mithril Component
const InputField = {
view: () => {
return m("div", [
m("input", {
type: "text",
value: text(),
oninput: (e) => text(e.target.value),
}),
m("p", "You typed: " + text()),
]);
},
};
mithril.mount(document.body, InputField);
์ฌ๊ธฐ์ text
๋ ์
๋ ฅ ํ๋์ ํ์ฌ ๊ฐ์ ๋ณด์ ํ๋ ์คํธ๋ฆผ์
๋๋ค. oninput
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์คํธ๋ฆผ์ ๊ฐ์ ์
๋ฐ์ดํธํ์ฌ ๋์คํ๋ ์ด๊ฐ ์๋์ผ๋ก ์
๋ฐ์ดํธ๋๋๋ก ํฉ๋๋ค.
์์ 3: ๋น๋๊ธฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
์ด ์์ ๋ Mithril Stream์ ์ฌ์ฉํ์ฌ API์์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:
const data = stream();
const loading = stream(false);
const error = stream(null);
const fetchData = () => {
loading(true);
error(null);
fetch("https://api.example.com/data")
.then((response) => response.json())
.then((json) => {
data(json);
loading(false);
})
.catch((err) => {
error(err);
loading(false);
});
};
// Initial data fetch
fetchData();
// Mithril Component
const DataDisplay = {
view: () => {
if (loading()) {
return m("p", "Loading...");
} else if (error()) {
return m("p", "Error: " + error().message);
} else if (data()) {
return m("pre", JSON.stringify(data(), null, 2));
} else {
return m("p", "No data available.");
}
},
};
mithril.mount(document.body, DataDisplay);
์ด ์์ ์์ data
, loading
, error
๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์คํธ๋ฆผ์
๋๋ค. fetchData
ํจ์๋ API ์๋ต์ ๋ฐ๋ผ ์ด๋ฌํ ์คํธ๋ฆผ์ ์
๋ฐ์ดํธํ์ฌ Mithril ์ปดํฌ๋ํธ์ ์
๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
Mithril Stream ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Mithril Stream์ ์ด์ ์ ๊ทน๋ํํ๊ณ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํผํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์คํธ๋ฆผ์ ์ด์ ์ ๋ช ํํ ํ์ธ์: ๊ฐ ์คํธ๋ฆผ์ ๋จ์ผํ๊ณ ์ ์ ์๋ ์ํ ์กฐ๊ฐ์ ๋ํ๋ด์ผ ํฉ๋๋ค. ํ๋์ ์คํธ๋ฆผ์ ์ฌ๋ฌ ์ฑ ์์ ๊ณผ๋ํ๊ฒ ๋ถ์ฌํ์ง ๋ง์ธ์.
- ์ฐ์ฐ์๋ฅผ ํ๋ช ํ๊ฒ ์ฌ์ฉํ์ธ์: ๋ด์ฅ ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ์ ์ธ์ ์ธ ๋ฐฉ์์ผ๋ก ์คํธ๋ฆผ์ ๋ณํํ๊ณ ๊ฒฐํฉํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์์ง๋๋ค.
- ์คํธ๋ฆผ ๊ณ์ฐ์์ ๋ถ์ ํจ๊ณผ๋ฅผ ํผํ์ธ์: ์คํธ๋ฆผ ๊ณ์ฐ์ ์ ๋ ฅ ์คํธ๋ฆผ์๋ง ์์กดํ๋ ์์ ํจ์์ฌ์ผ ํฉ๋๋ค. ์คํธ๋ฆผ ๊ณ์ฐ ๋ด์์ DOM ์กฐ์์ด๋ ๋คํธ์ํฌ ์์ฒญ๊ณผ ๊ฐ์ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ์ง ๋ง์ธ์.
- ๋น๋๊ธฐ ์์ ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ธ์: ์คํธ๋ฆผ์ ์ฌ์ฉํ์ฌ API ํธ์ถ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ก๋ฉ ์ํ, ์ค๋ฅ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ฅผ ์ผ๊ด๋๊ณ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ฑ๋ฅ์ ์ต์ ํํ์ธ์: ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํธ๋ฆผ ์์ ์์กด์ฑ์ ์ ์ํ์ธ์. ๊ณผ๋ํ ์คํธ๋ฆผ ์์ฑ์ด๋ ๋ณต์กํ ์์กด์ฑ ๊ทธ๋ํ๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ์ธ์.
- ํ ์คํธ๋ฅผ ๊ณ ๋ คํ์ธ์: ์คํธ๋ฆผ์ด ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ์ด๋ฅผ ํตํด ๋ฒ๊ทธ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ ๋ขฐ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ฌธ์ํ: ์คํธ๋ฆผ๊ณผ ๊ทธ ์์กด์ฑ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์(๊ทธ๋ฆฌ๊ณ ๋ฏธ๋์ ์์ )๊ฐ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ ์ ์์ต๋๋ค.
Mithril Stream๊ณผ ๋ค๋ฅธ ๋ฐ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต
JavaScript ์ํ๊ณ์๋ ์ฌ๋ฌ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ ๊ณ ์ ํ ์ฅ๋จ์ ์ด ์์ต๋๋ค. Mithril Stream์ ์ธ๊ธฐ ์๋ ๋์์ผ๋ก๋ ๋ค์์ด ์์ต๋๋ค:
- RxJS: ๋ฐฉ๋ํ ์ฐ์ฐ์ ๋ฐฐ์ด๊ณผ ๊ธฐ๋ฅ์ ๊ฐ์ถ ํฌ๊ด์ ์ธ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. RxJS๋ ๋ณต์กํ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ์ง ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ์ง๋ง, ํฐ ํฌ๊ธฐ์ ๊ฐํ๋ฅธ ํ์ต ๊ณก์ ์ ์ด๋ณด์์๊ฒ ๋ถ๋ด์ค๋ฌ์ธ ์ ์์ต๋๋ค.
- Bacon.js: ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์์น์ ์ค์ ์ ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Bacon.js๋ ํ๋ถํ ์ฐ์ฐ์ ์งํฉ๊ณผ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ API๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๊ณผํ ์ ์์ต๋๋ค.
- Most.js: ๊น๋ค๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์ค๊ณ๋ ๊ณ ์ฑ๋ฅ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Most.js๋ ๋๋์ ๋ฐ์ดํฐ์ ๋ณต์กํ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ฐ์ด๋์ง๋ง, API๋ Mithril Stream๋ณด๋ค ๋ฐฐ์ฐ๊ธฐ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
Mithril Stream์ ๋จ์์ฑ, ๊ฒฝ๋์ฑ, ๊ทธ๋ฆฌ๊ณ Mithril.js์์ ๊ธด๋ฐํ ํตํฉ์ผ๋ก ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ์ฐจ๋ณํ๋ฉ๋๋ค. ๊ฐ๋จํ๊ณ ํจ์จ์ ์ด๋ฉฐ ๋ฐฐ์ฐ๊ธฐ ์ฌ์ด ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์๋ฃจ์ ์ด ํ์ํ ํ๋ก์ ํธ์ ํ์ํ ์ ํ์ ๋๋ค.
์ฃผ์ ์ฐจ์ด์ ์ ์์ฝํ ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๊ธฐ๋ฅ | Mithril Stream | RxJS | Bacon.js | Most.js |
---|---|---|---|---|
ํฌ๊ธฐ | ์์ | ํผ | ์ค๊ฐ | ์ค๊ฐ |
์์กด์ฑ | ์์ | ์์ | ์์ | ์์ |
ํ์ต ๊ณก์ | ์ฌ์ | ๊ฐํ๋ฆ | ๋ณดํต | ๋ณดํต |
๊ธฐ๋ฅ | ๊ธฐ๋ณธ | ํฌ๊ด์ | ํ๋ถํจ | ๊ณ ๊ธ |
์ฑ๋ฅ | ์ข์ | ์ข์ | ์ข์ | ์ฐ์ํจ |
๊ฒฐ๋ก
Mithril Stream์ ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋จ์ํํ ์ ์๋ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๊ฒฝ๋์ฑ, ๊ฐ๋จํ API, ๊ทธ๋ฆฌ๊ณ Mithril.js์์ ๊ธด๋ฐํ ํตํฉ ๋๋ถ์ ๊ฐ๋จํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ถํฐ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ํ๋ก์ ํธ์ ํ์ํ ์ ํ์ด ๋ ์ ์์ต๋๋ค. Mithril Stream์ ํต์ฌ ๊ฐ๋ ์ ๋ง์คํฐํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ๊ทธ ์ด์ ์ ํ์ฉํ์ฌ ๋ ํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์๋ต์ฑ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํ์ ๋ฐ์๋ค์ด๊ณ Mithril Stream์ผ๋ก ์๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด๋ณด์ธ์.
๋ ์์๋ณด๊ธฐ
Mithril Stream๊ณผ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๋ ๊น์ด ํ๊ณ ๋ค๋ ค๋ฉด ๋ค์ ๋ฆฌ์์ค๋ฅผ ํ์ํด ๋ณด์ธ์:
- Mithril Stream ๋ฌธ์: ๊ณต์ ๋ฌธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ API์ ๊ธฐ๋ฅ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค: https://github.com/MithrilJS/stream
- Mithril.js ๋ฌธ์: Mithril Stream์ด ์ปดํฌ๋ํธ ๊ธฐ๋ฐ UI ๊ฐ๋ฐ๊ณผ ์ด๋ป๊ฒ ํตํฉ๋๋์ง ์ดํดํ๋ ค๋ฉด Mithril.js ํ๋ ์์ํฌ๋ฅผ ํ์ํด ๋ณด์ธ์: https://mithril.js.org/
- ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฆฌ์์ค: ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์จ๋ผ์ธ ๊ฐ์ข, ํํ ๋ฆฌ์ผ, ๊ธฐ์ฌ. Coursera, Udemy, Medium๊ณผ ๊ฐ์ ํ๋ซํผ์์ "๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ"์ ๊ฒ์ํด ๋ณด์ธ์.
- ์คํ์์ค ํ๋ก์ ํธ: Mithril Stream์ ํ์ฉํ๋ ์คํ์์ค ํ๋ก์ ํธ๋ฅผ ๊ฒํ ํ์ฌ ์ค์ ๊ตฌํ ์ฌ๋ก๋ก๋ถํฐ ๋ฐฐ์ฐ์ธ์.
์ด๋ก ์ ์ง์๊ณผ ์ค์ ๊ฒฝํ์ ๊ฒฐํฉํจ์ผ๋ก์จ, ๋น์ ์ ๋ฅ์ํ Mithril Stream ๊ฐ๋ฐ์๊ฐ ๋์ด ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ ์ ์์ต๋๋ค.