JavaScript ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ, ํ๋ ฅ์ ์ค์ผ์ค๋ง, ์คํธ๋ฆผ ์กฐ์ ์ ํ๊ตฌํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ํจ์จ์ ์ด๊ณ ๋ฐ์์ฑ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ธ์. ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ์ ์ ๋ง์คํฐํ์ญ์์ค.
JavaScript ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ํ๋ ฅ์ ์ค์ผ์ค๋ง: ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์คํธ๋ฆผ ์กฐ์
ํ๋ JavaScript ๊ฐ๋ฐ ์ธ๊ณ์์ ๋น๋๊ธฐ ์์ ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ํ๋ ฅ์ ์ค์ผ์ค๋ง๊ณผ ๊ฒฐํฉํ์ฌ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๊ณ ๋์ ์์ ์ ์กฐ์ ํ๋ ๊ฐ๋ ฅํ ํจ๋ฌ๋ค์์ ์ ๊ณตํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ, ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋ ๋๋ ๋ฉ์ธ ์ค๋ ๋ ์ฐจ๋จ์ด ํ์ฉ๋์ง ์๋ ๋ชจ๋ ์ํฉ์์ ํนํ ์ ์ฉํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ JavaScript ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ, ํ๋ ฅ์ ์ค์ผ์ค๋ง ๊ฐ๋ ๋ฐ ์คํธ๋ฆผ ์กฐ์ ๊ธฐ์ ์ ๋ํ ํฌ๊ด์ ์ธ ํ๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ค์ ์ ์ฉ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ์ค์ ์ ๋ก๋๋ค.
JavaScript์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ์ดํด
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ์ ๋ฐ์ด๋ค๊ธฐ ์ ์ JavaScript์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ ํต์ ์ธ ๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์์ ์ ์์ฐจ์ ์ผ๋ก ํ๋์ฉ ์คํํฉ๋๋ค. ์ด๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ํ์ผ์ ์ฝ๋ ๊ฒ๊ณผ ๊ฐ์ I/O ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์์ ์ ๋์์ ์คํํ ์ ์๋๋ก ํจ์ผ๋ก์จ ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค. JavaScript๋ ๋น๋๊ธฐ ์์ ์ ์ํ ๋ช ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค:
- ์ฝ๋ฐฑ(Callbacks): ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ๋ ์คํ๋ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฐ์ฅ ์ด๊ธฐ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๊ธฐ๋ฅ์ ์ด์ง๋ง, ์ฝ๋ฐฑ์ "์ฝ๋ฐฑ ์ง์ฅ" ๋๋ ๊น๊ฒ ์ค์ฒฉ๋ ์ฝ๋๋ก ์ด์ด์ ธ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- Promise: ES6์ ๋์ ๋ Promise๋ ๋น๋๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ณด๋ค ๊ตฌ์กฐํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ์์ ์ ์๋ ๊ฐ์ ๋ํ๋ด๋ฉฐ, ์ฝ๋ฐฑ์ ๋นํด ๋ ๊น๋ํ ๊ตฌ๋ฌธ๊ณผ ํฅ์๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. Promise๋ ๋ณด๋ฅ(pending), ์ดํ(fulfilled), ๊ฑฐ๋ถ(rejected)์ ์ธ ๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง๋๋ค.
- Async/Await: Promise๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ async/await๋ ๋น๋๊ธฐ ์ฝ๋๊ฐ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ๋ณด์ด๊ฒ ํ๊ณ ๋์ํ๊ฒ ํ๋ ๊ตฌ๋ฌธ์ ์คํ์ ์ ๊ณตํฉ๋๋ค.
async
ํค์๋๋ ํจ์๋ฅผ ๋น๋๊ธฐ๋ก ์ ์ธํ๊ณ ,await
ํค์๋๋ Promise๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ์คํ์ ์ผ์ ์ค์งํฉ๋๋ค.
์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ๋ฐ์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํจ์จ์ ์ธ Node.js ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ค๋ฃฐ ๋, ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ํจ์ฌ ๋ ์ฐ์ํ๊ณ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ์๊ฐ
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ๋น๋๊ธฐ ์์ ์ ํ๊ณผ ์ต์ํ ์ ๋๋ ์ดํฐ ๊ตฌ๋ฌธ์ ๊ฒฐํฉํ ํน๋ณํ ์ ํ์ JavaScript ํจ์์ ๋๋ค. ํ์์ ๋ฐ๋ผ ์คํ์ ์ผ์ ์ค์งํ๊ณ ์ฌ๊ฐํ๋ฉด์ ๊ฐ์ ์ํ์ค๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ค๋ฃจ๊ฑฐ๋, ์ฃผ๋ฌธํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฌ์ฉ์ ์ง์ ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ์ฃผ์ ๊ธฐ๋ฅ
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ async function*
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค. ๋จ์ผ ๊ฐ์ ๋ฐํํ๋ ๋์ , yield
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ จ์ ๊ฐ์ ์์ฑํฉ๋๋ค. await
ํค์๋๋ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ด๋ถ์์ Promise๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ์คํ์ ์ผ์ ์ค์งํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋น๋๊ธฐ ์์
์ ์์ฑ ํ๋ก์ธ์ค์ ์ํํ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
async function* myAsyncGenerator() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
// Consuming the async generator
(async () => {
for await (const value of myAsyncGenerator()) {
console.log(value); // Output: 1, 2, 3
}
})();
๋ค์์ ์ฃผ์ ์์์ ๋ํ ๋ถ์์ ๋๋ค:
async function*
: ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ์ ์ธํฉ๋๋ค.yield
: ์คํ์ ์ผ์ ์ค์งํ๊ณ ๊ฐ์ ๋ฐํํฉ๋๋ค.await
: Promise๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ์คํ์ ์ผ์ ์ค์งํฉ๋๋ค.for await...of
: ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๊ฐ ์์ฑํ๋ ๊ฐ์ ๋ฐ๋ณตํฉ๋๋ค.
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ์ฌ์ฉ์ ์ด์
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์ ํต์ ์ธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ๋นํด ๋ช ๊ฐ์ง ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค:
- ํฅ์๋ ๊ฐ๋
์ฑ: ์ ๋๋ ์ดํฐ ๊ตฌ๋ฌธ์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
await
ํค์๋๋ Promise ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํํ์ฌ ์ฝ๋๊ฐ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค. - ๊ฒ์ผ๋ฅธ ํ๊ฐ(Lazy Evaluation): ๊ฐ์ด ํ์ํ ๋๋ง ์์ฑ๋๋ฏ๋ก ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํ์ํ ๊ฐ๋ง ๊ณ์ฐ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ ์ฝํฉ๋๋ค.
- ์ญ์(Backpressure) ์ฒ๋ฆฌ: ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์ญ์์ ์ฒ๋ฆฌํ๋ ์์ฐ์ค๋ฌ์ด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ์๋น์๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ ์๋๋ฅผ ์ ์ดํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๋์ฉ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ์์คํ ์์ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ(Composability): ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ๊ณ ์ฐ๊ฒฐํ์ฌ ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ชจ๋์ ๋ฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
ํ๋ ฅ์ ์ค์ผ์ค๋ง: ์ฌ์ธต ๋ถ์
ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ํ์คํฌ๊ฐ ์๋ฐ์ ์ผ๋ก ์ ์ด๊ถ์ ์๋ํ์ฌ ๋ค๋ฅธ ํ์คํฌ๊ฐ ์คํ๋๋๋ก ํ์ฉํ๋ ๋์์ฑ ๋ชจ๋ธ์ ๋๋ค. ์ด์ ์ฒด์ ๊ฐ ํ์คํฌ๋ฅผ ์ค๋จ์ํค๋ ์ ์ ํ ์ค์ผ์ค๋ง๊ณผ ๋ฌ๋ฆฌ, ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ํ์คํฌ๊ฐ ๋ช ์์ ์ผ๋ก ์ ์ด๊ถ์ ํฌ๊ธฐํ๋ ๊ฒ์ ์์กดํฉ๋๋ค. ๋จ์ผ ์ค๋ ๋์ธ JavaScript์ ๋งฅ๋ฝ์์, ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ๋์์ฑ์ ๋ฌ์ฑํ๊ณ ์ด๋ฒคํธ ๋ฃจํ์ ์ฐจ๋จ์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
JavaScript์์ ํ๋ ฅ์ ์ค์ผ์ค๋ง ์๋ ๋ฐฉ์
JavaScript์ ์ด๋ฒคํธ ๋ฃจํ๋ ๋์์ฑ ๋ชจ๋ธ์ ํต์ฌ์
๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ํธ์ถ ์คํ๊ณผ ํ์คํฌ ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํฉ๋๋ค. ํธ์ถ ์คํ์ด ๋น์ด ์์ ๋, ์ด๋ฒคํธ ๋ฃจํ๋ ํ์คํฌ ํ์์ ํ์คํฌ๋ฅผ ๊ฐ์ ธ์ ์คํ์ ์ํด ํธ์ถ ์คํ์ ํธ์ํฉ๋๋ค. async/await ๋ฐ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ await
๋๋ yield
๋ฌธ์ ๋ง๋ฌ์ ๋ ์ด๋ฒคํธ ๋ฃจํ์ ์ ์ด๊ถ์ ๋ค์ ๋๊ฒจ์ค์ผ๋ก์จ ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ์๋ฌต์ ์ผ๋ก ์ฐธ์ฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์คํฌ ํ์ ๋ค๋ฅธ ํ์คํฌ๊ฐ ์คํ๋ ์ ์์ผ๋ฉฐ, ๋จ์ผ ํ์คํฌ๊ฐ CPU๋ฅผ ๋
์ ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋ค์ ์์๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์:
async function task1() {
console.log("Task 1 started");
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate an asynchronous operation
console.log("Task 1 finished");
}
async function task2() {
console.log("Task 2 started");
console.log("Task 2 finished");
}
async function main() {
task1();
task2();
}
main();
// Output:
// Task 1 started
// Task 2 started
// Task 2 finished
// Task 1 finished
task1
์ด task2
๋ณด๋ค ๋จผ์ ํธ์ถ๋์์์๋ ๋ถ๊ตฌํ๊ณ , task2
๋ task1
์ด ๋๋๊ธฐ ์ ์ ์คํ์ ์์ํฉ๋๋ค. ์ด๋ task1
์ await
๋ฌธ์ด ์ด๋ฒคํธ ๋ฃจํ์ ์ ์ด๊ถ์ ๋ค์ ๋๊ฒจ์ฃผ์ด task2
๊ฐ ์คํ๋ ์ ์๋๋ก ํ๊ธฐ ๋๋ฌธ์
๋๋ค. task1
์ ํ์์์์ด ๋ง๋ฃ๋๋ฉด, task1
์ ๋๋จธ์ง ๋ถ๋ถ์ด ํ์คํฌ ํ์ ์ถ๊ฐ๋์ด ๋์ค์ ์คํ๋ฉ๋๋ค.
JavaScript์์ ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ์ด์
- ๋น์ฐจ๋จ ์์ : ์ ์ด๊ถ์ ์ ๊ธฐ์ ์ผ๋ก ์๋ํจ์ผ๋ก์จ ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ์ด๋ค ๋จ์ผ ํ์คํฌ๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์์ฑ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ํฅ์๋ ๋์์ฑ: JavaScript๊ฐ ๋จ์ผ ์ค๋ ๋์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ๋ฌ ํ์คํฌ๊ฐ ๋์์ ์งํ๋ ์ ์๋๋ก ํฉ๋๋ค.
- ๊ฐ์ํ๋ ๋์์ฑ ๊ด๋ฆฌ: ๋ค๋ฅธ ๋์์ฑ ๋ชจ๋ธ์ ๋นํด ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ๋ณต์กํ ์ ๊ธ ๋ฉ์ปค๋์ฆ ๋์ ๋ช ์์ ์ธ ์๋ ์ง์ ์ ์์กดํ์ฌ ๋์์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์คํธ๋ฆผ ์กฐ์
์คํธ๋ฆผ ์กฐ์ ์ ํน์ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ฌ๋ฌ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๊ณ ์กฐ์ ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์คํธ๋ฆผ ์กฐ์ ์ ์ํ ํ๋ฅญํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ณํํ ์ ์๋๋ก ํฉ๋๋ค.
์คํธ๋ฆผ ๊ฒฐํฉ ๋ฐ ๋ณํ
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์ฌ๋ฌ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ฒฐํฉํ๊ณ ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ณํฉํ๊ฑฐ๋, ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํ๋ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๋ค์์ ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ณํฉํ๋ ์์์ ๋๋ค:
async function* mergeStreams(stream1, stream2) {
const iterator1 = stream1[Symbol.asyncIterator]();
const iterator2 = stream2[Symbol.asyncIterator]();
let next1 = iterator1.next();
let next2 = iterator2.next();
while (true) {
const [result1, result2] = await Promise.all([
next1,
next2,
]);
if (result1.done && result2.done) {
break;
}
if (!result1.done) {
yield result1.value;
next1 = iterator1.next();
}
if (!result2.done) {
yield result2.value;
next2 = iterator2.next();
}
}
}
// Example usage (assuming stream1 and stream2 are async generators)
(async () => {
for await (const value of mergeStreams(stream1, stream2)) {
console.log(value);
}
})();
์ด mergeStreams
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ๋ ๊ฐ์ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ(async generator ์์ฒด์ผ ์ ์์)์ ์
๋ ฅ์ผ๋ก ๋ฐ์ ๋ ์คํธ๋ฆผ์์ ๋์์ ๊ฐ์ ์์ฑํฉ๋๋ค. Promise.all
์ ์ฌ์ฉํ์ฌ ๊ฐ ์คํธ๋ฆผ์์ ๋ค์ ๊ฐ์ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์จ ๋ค์, ์ฌ์ฉ ๊ฐ๋ฅํด์ง ๋ ๊ฐ์ ์์ฑํฉ๋๋ค.
์ญ์ ์ฒ๋ฆฌ
์ญ์์ ๋ฐ์ดํฐ ์์ฐ์๊ฐ ์๋น์๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ์๋๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋ ๋ฐ์ํฉ๋๋ค. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์๋น์๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ ์๋๋ฅผ ์ ์ดํ ์ ์๋๋ก ํจ์ผ๋ก์จ ์ญ์์ ์ฒ๋ฆฌํ๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋น์๋ ํ์ฌ ๋ฐฐ์น๋ฅผ ์ฒ๋ฆฌํ ๋๊น์ง ๋ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ง ์์ ์ ์์ต๋๋ค.
๋ค์์ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ก ์ญ์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธฐ๋ณธ ์์์ ๋๋ค:
async function* slowDataProducer() {
for (let i = 0; i < 10; i++) {
await new Promise(resolve => setTimeout(resolve, 500)); // Simulate slow data production
yield i;
}
}
async function consumeData(stream) {
for await (const value of stream) {
console.log("Processing value:", value);
await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate slow processing
}
}
(async () => {
await consumeData(slowDataProducer());
})();
์ด ์์์์ slowDataProducer
๋ 500๋ฐ๋ฆฌ์ด๋ง๋ค ํ๋์ ํญ๋ชฉ์ ์์ฑํ๊ณ , consumeData
ํจ์๋ 1000๋ฐ๋ฆฌ์ด๋ง๋ค ํ๋์ ํญ๋ชฉ์ ์ฒ๋ฆฌํฉ๋๋ค. consumeData
ํจ์์ await
๋ฌธ์ ํ์ฌ ํญ๋ชฉ์ด ์ฒ๋ฆฌ๋ ๋๊น์ง ์๋น ํ๋ก์ธ์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ผ์ ์ค์งํ์ฌ ์์ฐ์์๊ฒ ์ญ์์ ์ ๊ณตํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ
๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ ํ ๋๋ ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์์ ์ ๋๋ค. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์ ๋๋ ์ดํฐ ํจ์ ๋ด์์ try/catch ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋น๋๊ธฐ ์์ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ ํฌ์ฐฉ๋์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์์ผ๋ฏ๋ก ์ ์ฒด ์คํธ๋ฆผ์ด ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
async function* dataStreamWithErrors() {
try {
yield await fetchData1();
yield await fetchData2();
// Simulate an error
throw new Error("Something went wrong");
yield await fetchData3(); // This will not be executed
} catch (error) {
console.error("Error in data stream:", error);
// Optionally, yield a special error value or re-throw the error
yield { error: error.message };
}
}
async function fetchData1() {
return new Promise(resolve => setTimeout(() => resolve("Data 1"), 200));
}
async function fetchData2() {
return new Promise(resolve => setTimeout(() => resolve("Data 2"), 300));
}
async function fetchData3() {
return new Promise(resolve => setTimeout(() => resolve("Data 3"), 400));
}
(async () => {
for await (const item of dataStreamWithErrors()) {
if (item.error) {
console.log("Handled error value:", item.error);
} else {
console.log("Received data:", item);
}
}
})();
์ด ์์์์ dataStreamWithErrors
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค. try/catch ๋ธ๋ก์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ฌ ์ฝ์์ ๊ธฐ๋กํฉ๋๋ค. ๋ํ ์๋น์์๊ฒ ์ค๋ฅ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค. ์๋น์๋ ์์
์ ์ฌ์๋ํ๊ฑฐ๋, ๋ฌธ์ ๊ฐ ์๋ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๊ฑด๋๋ฐ๊ฑฐ๋, ์คํธ๋ฆผ์ ์ ์์ ์ผ๋ก ์ข
๋ฃํ ์ ์์ต๋๋ค.
์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ฐ ์คํธ๋ฆผ ์กฐ์ ์ ๊ด๋ฒ์ํ ์๋๋ฆฌ์ค์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ค์ ์์์ ๋๋ค:
- ๋๊ท๋ชจ ๋ก๊ทธ ํ์ผ ์ฒ๋ฆฌ: ์ ์ฒด ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ ๋๊ท๋ชจ ๋ก๊ทธ ํ์ผ์ ํ ์ค์ฉ ์ฝ๊ณ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋: ์ฃผ์ ์์ธ๋ ์์ ๋ฏธ๋์ด ํผ๋์ ๊ฐ์ ์์ค์์ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์คํธ๋ฆฌ๋ฐ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒญํฌ ๋จ์๋ก ๊ฐ์ ธ์ ์ฆ๋ถ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: ๋๊ท๋ชจ ์ด๋ฏธ์ง ๋๋ ๋น๋์ค๋ฅผ ํ๋ ์๋ณ๋ก ์ฒ๋ฆฌํ๊ณ ๋ณํ ๋ฐ ํํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
- ์น์์ผ(WebSockets): ์น์์ผ์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์๋ฐฉํฅ ํต์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
์์: ๋๊ท๋ชจ ๋ก๊ทธ ํ์ผ ์ฒ๋ฆฌ
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ท๋ชจ ๋ก๊ทธ ํ์ผ์ ์ฒ๋ฆฌํ๋ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์๋ฐฑ๋ง ์ค์ ํฌํจํ๋ access.log
๋ผ๋ ๋ก๊ทธ ํ์ผ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ํ์ผ์ ํ ์ค์ฉ ์ฝ๊ณ ๊ฐ ์์ฒญ์ IP ์ฃผ์์ ํ์์คํฌํ์ ๊ฐ์ ํน์ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ค๊ณ ํฉ๋๋ค. ์ ์ฒด ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ฏ๋ก, ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฆ๋ถ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
const fs = require('fs');
const readline = require('readline');
async function* processLogFile(filePath) {
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
// Extract IP address and timestamp from the log line
const match = line.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*?\[(.*?)\].*$/);
if (match) {
const ipAddress = match[1];
const timestamp = match[2];
yield { ipAddress, timestamp };
}
}
}
// Example usage
(async () => {
for await (const logEntry of processLogFile('access.log')) {
console.log("IP Address:", logEntry.ipAddress, "Timestamp:", logEntry.timestamp);
}
})();
์ด ์์์์ processLogFile
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ readline
๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ ํ์ผ์ ํ ์ค์ฉ ์ฝ์ต๋๋ค. ๊ฐ ์ค์ ๋ํด ์ ๊ท ํํ์์ ์ฌ์ฉํ์ฌ IP ์ฃผ์์ ํ์์คํฌํ๋ฅผ ์ถ์ถํ๊ณ ์ด ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์๋น์๋ ๋ก๊ทธ ํญ๋ชฉ์ ๋ฐ๋ณตํ๊ณ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
์์: ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋ (์๋ฎฌ๋ ์ด์ )
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋๋ฅผ ์๋ฎฌ๋ ์ด์ ํด ๋ด ์๋ค. ์๋ฒ์์ ์ฃผ์ ๊ฐ๊ฒฉ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ๊ณ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ ๋ฐ์ดํธ๊ฐ ๋์ฐฉํ๋ ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
async function* stockPriceFeed() {
let price = 100;
while (true) {
// Simulate a random price change
const change = (Math.random() - 0.5) * 10;
price += change;
yield { symbol: 'AAPL', price: price.toFixed(2) };
await new Promise(resolve => setTimeout(resolve, 1000)); // Simulate a 1-second delay
}
}
// Example usage
(async () => {
for await (const update of stockPriceFeed()) {
console.log("Stock Price Update:", update);
// You could then update a chart or display the price in a UI.
}
})();
์ด stockPriceFeed
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ์ค์๊ฐ ์ฃผ์ ๊ฐ๊ฒฉ ํผ๋๋ฅผ ์๋ฎฌ๋ ์ด์
ํฉ๋๋ค. 1์ด๋ง๋ค ๋ฌด์์ ๊ฐ๊ฒฉ ์
๋ฐ์ดํธ๋ฅผ ์์ฑํ๊ณ ์ฃผ์ ๊ธฐํธ์ ํ์ฌ ๊ฐ๊ฒฉ์ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์๋น์๋ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ๋ณตํ๊ณ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ํ์ํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ฐ ํ๋ ฅ์ ์ค์ผ์ค๋ง ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ฐ ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ์ด์ ์ ๊ทน๋ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ํ์คํฌ๋ฅผ ์งง๊ฒ ์ ์ง: ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ด์์ ์ค๋ ์คํ๋๋ ๋๊ธฐ ์์ ์ ํผํ์ญ์์ค. ์ด๋ฒคํธ ๋ฃจํ ์ฐจ๋จ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํฐ ์์ ์ ๋ ์๊ณ ๋น๋๊ธฐ์ ์ธ ์ฒญํฌ๋ก ๋๋๋๋ค.
await
๋ฅผ ํ๋ช ํ๊ฒ ์ฌ์ฉ: ์คํ์ ์ผ์ ์ค์งํ๊ณ Promise๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ ๋๋งawait
๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๋ถํ์ํawait
ํธ์ถ์ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก ํผํ์ญ์์ค.- ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌ: ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ด์์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด try/catch ๋ธ๋ก์ ์ฌ์ฉํ์ญ์์ค. ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๊ณ ์คํจํ ์์ ์ ์ฌ์๋ํ๊ฑฐ๋ ๋ฌธ์ ๊ฐ ์๋ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๊ฑด๋๋ฐ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ญ์ ๊ตฌํ: ๋์ฉ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ, ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ญ์์ ๊ตฌํํ์ญ์์ค. ์๋น์๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๋ ์๋๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ์ค๋ฅ, ์ฃ์ง ์ผ์ด์ค ๋ฐ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ๋ฅํ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
๊ฒฐ๋ก
JavaScript ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ํ๋ ฅ์ ์ค์ผ์ค๋ง๊ณผ ๊ฒฐํฉํ์ฌ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ด๋ฆฌํ๊ณ ๋์ ์์ ์ ์กฐ์ ํ๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ํ์ฉํ๋ฉด ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ, ํ๋ ฅ์ ์ค์ผ์ค๋ง ๋ฐ ์คํธ๋ฆผ ์กฐ์ ์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋ชจ๋ ํ๋ JavaScript ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ๊ตฌ๋ฌธ, ์ด์ , ์ค์ ์์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ฉฐ ์ด๋ฌํ ๊ฐ๋ ์ ๋ํ ์์ธํ ํ๊ตฌ๋ฅผ ์ ๊ณตํ์ต๋๋ค. ์ด ๊ฐ์ด๋์์ ์ป์ ์ง์์ ์ ์ฉํจ์ผ๋ก์จ ๋ณต์กํ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ์์ ์๊ฒ ํด๊ฒฐํ๊ณ ์ค๋๋ ๋์งํธ ์ธ๊ณ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
JavaScript ์ฌ์ ์ ๊ณ์ํ๋ฉด์ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ฐ ํ๋ ฅ์ ์ค์ผ์ค๋ง์ ๋ณด์ํ๋ ๋ฐฉ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋๊ตฌ ์ํ๊ณ๋ฅผ ํ๊ตฌํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. RxJS์ ๊ฐ์ ํ๋ ์์ํฌ ๋ฐ Highland.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ๋์ฑ ํฅ์์ํฌ ์ ์๋ ๊ณ ๊ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.