ํจ์จ์ ์ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ๋ณํ ๋ฐ ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํจํด์ ์์๋ด ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์คํธ๋ฆผ ์ฒ๋ฆฌ: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํจํด ๋ง์คํฐํ๊ธฐ
ํ๋ ์น ๋ฐ ์๋ฒ์ฌ์ด๋ ๊ฐ๋ฐ์์ ๋์ฉ๋ ๋ฐ์ดํฐ์ ๊ณผ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ํํ ๊ณผ์ ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ(async iterators)๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ํ๋ฆ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ํต์ฌ ํจํด์ผ๋ก ๋ถ์ํ์ต๋๋ค. ์ด ๋ธ๋ก๊ทธ ํฌ์คํธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํจํด์ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ์ด์ , ๊ตฌํ ๋ฐฉ๋ฒ ๋ฐ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ํ๊ตฌํฉ๋๋ค.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ฌด์์ธ๊ฐ?
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์์ค์ ํจ๊ป ์๋ํ๋๋ก ์ค๊ณ๋ ํ์ค ์๋ฐ์คํฌ๋ฆฝํธ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ํ์ฅ์ ๋๋ค. ๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ๋ฐํํ๋ ์ผ๋ฐ ์ดํฐ๋ ์ดํฐ์ ๋ฌ๋ฆฌ, ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์ํ์ค์ ๋ค์ ๊ฐ์ผ๋ก ๊ท๊ฒฐ(resolve)๋๋ ํ๋ก๋ฏธ์ค(promise)๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฌํ ๋น๋๊ธฐ์ ํน์ฑ ๋๋ถ์ ๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ฝ๊ธฐ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ๊ฐ์ด ์๊ฐ์ ๋ฐ๋ผ ๋์ฐฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ด์์ ์ ๋๋ค.
ํต์ฌ ๊ฐ๋ :
- ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ(Async Iterable): ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ `Symbol.asyncIterator`๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ ๋๋ค.
- ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ(Async Iterator): ์ผ๋ฐ ์ดํฐ๋ ์ดํฐ์ ์ ์ฌํ๊ฒ `value`์ `done` ์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ก ๊ท๊ฒฐ๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ `next()` ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฐ์ฒด์ ๋๋ค.
- `for await...of` ๋ฃจํ: ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์ ์ํํ๋ ๊ณผ์ ์ ๋จ์ํํ๋ ์ธ์ด ๊ตฌ๋ฌธ์ ๋๋ค.
์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ํ ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ์ ์ฒด ๋ฐ์ดํฐ์ ์ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์๋ต์ฑ: ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ธ๋กํน๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ: ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ํจ๊ป ์ฐ๊ฒฐํ์ฌ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ์์ฑํ ์ ์์ต๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ๋น๋๊ธฐ ์์ ์ ์ํ ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์ญ์๋ ฅ(Backpressure) ๊ด๋ฆฌ: ๋ฐ์ดํฐ ์๋น ์๋๋ฅผ ์ ์ดํ์ฌ ์๋น์(consumer)๊ฐ ๊ณผ๋ถํ์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ์์ฑํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
1. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ ์๋ ๊ตฌํ
์ด๋ `next()` ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ `Symbol.asyncIterator` ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. `next()` ๋ฉ์๋๋ ์ํ์ค์ ๋ค์ ๊ฐ์ผ๋ก ๊ท๊ฒฐ๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๊ฑฐ๋, ์ํ์ค๊ฐ ์๋ฃ๋์์ ๋ `{ value: undefined, done: true }`๋ก ๊ท๊ฒฐ๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
class Counter {
constructor(limit) {
this.limit = limit;
this.count = 0;
}
async *[Symbol.asyncIterator]() {
while (this.count < this.limit) {
await new Promise(resolve => setTimeout(resolve, 500)); // ๋น๋๊ธฐ ์ง์ฐ ์๋ฎฌ๋ ์ด์
yield this.count++;
}
}
}
async function main() {
const counter = new Counter(5);
for await (const value of counter) {
console.log(value); // ์ถ๋ ฅ: 0, 1, 2, 3, 4 (๊ฐ ๊ฐ ์ฌ์ด์ 500ms ์ง์ฐ)
}
console.log("Done!");
}
main();
2. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ํจ์ ์ฌ์ฉํ๊ธฐ
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ํจ์๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค. ์ด ํจ์๋ค์ `async function*` ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์๋๋ฉฐ, `yield` ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ์์ฑํฉ๋๋ค.
async function* generateSequence(start, end) {
for (let i = start; i <= end; i++) {
await new Promise(resolve => setTimeout(resolve, 500)); // ๋น๋๊ธฐ ์ง์ฐ ์๋ฎฌ๋ ์ด์
yield i;
}
}
async function main() {
const sequence = generateSequence(1, 3);
for await (const value of sequence) {
console.log(value); // ์ถ๋ ฅ: 1, 2, 3 (๊ฐ ๊ฐ ์ฌ์ด์ 500ms ์ง์ฐ)
}
console.log("Done!");
}
main();
3. ๊ธฐ์กด ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ ๋ณํํ๊ธฐ
`map`, `filter`, `reduce`์ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์ ๋ณํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจ์๋ค์ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ์ ์์ผ๋ฉฐ, ์๋ณธ ์ดํฐ๋ฌ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋ก์ด ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์ ์์ฑํฉ๋๋ค.
async function* map(iterable, transform) {
for await (const value of iterable) {
yield await transform(value);
}
}
async function* filter(iterable, predicate) {
for await (const value of iterable) {
if (await predicate(value)) {
yield value;
}
}
}
async function main() {
async function* numbers() {
yield 1;
yield 2;
yield 3;
}
const doubled = map(numbers(), async (x) => x * 2);
const even = filter(doubled, async (x) => x % 2 === 0);
for await (const value of even) {
console.log(value); // ์ถ๋ ฅ: 2, 4, 6
}
console.log("Done!");
}
main();
์ผ๋ฐ์ ์ธ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํจํด
ํจ์จ์ ์ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจํด์ด ์์ต๋๋ค:
1. ๋ฒํผ๋ง (Buffering)
๋ฒํผ๋ง์ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์์ ์ฌ๋ฌ ๊ฐ์ ๋ฒํผ์ ์์งํ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๋น๋๊ธฐ ์์ ์ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
async function* buffer(iterable, bufferSize) {
let buffer = [];
for await (const value of iterable) {
buffer.push(value);
if (buffer.length === bufferSize) {
yield buffer;
buffer = [];
}
}
if (buffer.length > 0) {
yield buffer;
}
}
async function main() {
async function* numbers() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
const buffered = buffer(numbers(), 2);
for await (const value of buffered) {
console.log(value); // ์ถ๋ ฅ: [1, 2], [3, 4], [5]
}
console.log("Done!");
}
main();
2. ์ฐ๋กํ๋ง (Throttling)
์ฐ๋กํ๋ง์ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ์์ ๊ฐ์ด ์ฒ๋ฆฌ๋๋ ์๋๋ฅผ ์ ํํฉ๋๋ค. ์ด๋ ์๋น์๊ฐ ๊ณผ๋ถํ์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ ๋ฐ์ ์ธ ์์คํ ์์ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
async function* throttle(iterable, delay) {
for await (const value of iterable) {
yield value;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
async function main() {
async function* numbers() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
const throttled = throttle(numbers(), 1000); // 1์ด ์ง์ฐ
for await (const value of throttled) {
console.log(value); // ์ถ๋ ฅ: 1, 2, 3, 4, 5 (๊ฐ ๊ฐ ์ฌ์ด์ 1์ด ์ง์ฐ)
}
console.log("Done!");
}
main();
3. ๋๋ฐ์ด์ฑ (Debouncing)
๋๋ฐ์ด์ฑ์ ํน์ ๋นํ์ฑ ๊ธฐ๊ฐ์ด ์ง๋ ํ์๋ง ๊ฐ์ด ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ฒ์์ฐฝ์์ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ค๊ฐ ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํผํ๊ณ ์ถ์ ๋ ์ ์ฉํฉ๋๋ค.
async function* debounce(iterable, delay) {
let timeoutId;
let lastValue;
for await (const value of iterable) {
lastValue = value;
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
yield lastValue;
}, delay);
}
if (timeoutId) {
clearTimeout(timeoutId);
yield lastValue; // ๋ง์ง๋ง ๊ฐ ์ฒ๋ฆฌ
}
}
async function main() {
async function* input() {
yield 'a';
await new Promise(resolve => setTimeout(resolve, 200));
yield 'ab';
await new Promise(resolve => setTimeout(resolve, 100));
yield 'abc';
await new Promise(resolve => setTimeout(resolve, 500));
yield 'abcd';
}
const debounced = debounce(input(), 300);
for await (const value of debounced) {
console.log(value); // ์ถ๋ ฅ: abcd
}
console.log("Done!");
}
main();
4. ์ค๋ฅ ์ฒ๋ฆฌ
๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ์์ ํ์์ ์ ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
async function* processData(iterable) {
for await (const value of iterable) {
try {
// ์ฒ๋ฆฌ ์ค ์ ์ฌ์ ์ค๋ฅ ์๋ฎฌ๋ ์ด์
if (value === 3) {
throw new Error("Processing error!");
}
yield value * 2;
} catch (error) {
console.error("Error processing value:", value, error);
yield null; // ๋๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ
}
}
}
async function main() {
async function* numbers() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}
const processed = processData(numbers());
for await (const value of processed) {
console.log(value); // ์ถ๋ ฅ: 2, 4, null, 8, 10
}
console.log("Done!");
}
main();
์ค์ ์ ์ฉ ์ฌ๋ก
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํจํด์ ๋ค์ํ ์ค์ ์๋๋ฆฌ์ค์์ ์ ์ฉํฉ๋๋ค:
- ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋: ์ฃผ์ ์์ฅ ๋ฐ์ดํฐ, ์ผ์ ํ๋ ๊ฐ ๋๋ ์์ ๋ฏธ๋์ด ์คํธ๋ฆผ ์ฒ๋ฆฌ.
- ๋์ฉ๋ ํ์ผ ์ฒ๋ฆฌ: ์ ์ฒด ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ ๋์ฉ๋ ํ์ผ์ ์ฒญํฌ ๋จ์๋ก ์ฝ๊ณ ์ฒ๋ฆฌ. ์๋ฅผ ๋ค์ด, ๋ ์ผ ํ๋ํฌํธ๋ฅดํธ์ ์์นํ ์น ์๋ฒ์ ๋ก๊ทธ ํ์ผ ๋ถ์.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์คํธ๋ฆฌ๋ฐ. ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ด๋ ์ค๋ ์คํ๋๋ ์ฟผ๋ฆฌ์ ์ ์ฉ. ์๋ฅผ ๋ค์ด, ์ผ๋ณธ ๋์ฟ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ธ์ต ๊ฑฐ๋ ๋ด์ญ ์คํธ๋ฆฌ๋ฐ.
- API ํตํฉ: ์ฒญํฌ๋ ์คํธ๋ฆผ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ API์ ๋ฐ์ดํฐ ์๋น. ์๋ฅผ ๋ค์ด, ์๋ฅดํจํฐ๋ ๋ถ์๋ ธ์ค์์ด๋ ์ค์ ์๊ฐ๋ณ ๋ ์จ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ API.
- ์๋ฒ ์ ์ก ์ด๋ฒคํธ(SSE): ๋ธ๋ผ์ฐ์ ๋ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฒ ์ ์ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์๋ฒ๋ก๋ถํฐ ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ vs. ์ต์ ๋ฒ๋ธ (RxJS)
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ๋น๋๊ธฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๋ค์ดํฐ๋ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, RxJS(Reactive Extensions for JavaScript)์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ๋น๊ตํ์ ๋๋ค:
๊ธฐ๋ฅ | ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ | RxJS ์ต์ ๋ฒ๋ธ |
---|---|---|
๋ค์ดํฐ๋ธ ์ง์ | ์ (ES2018+) | ์๋์ (RxJS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์) |
์ฐ์ฐ์ | ์ ํ์ (์ฌ์ฉ์ ์ ์ ๊ตฌํ ํ์) | ๊ด๋ฒ์ํจ (ํํฐ๋ง, ๋งคํ, ๋ณํฉ ๋ฑ์ ์ํ ๋ด์ฅ ์ฐ์ฐ์) |
์ญ์๋ ฅ(Backpressure) | ๊ธฐ๋ณธ์ (์๋์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ) | ๊ณ ๊ธ (๋ฒํผ๋ง, ๋๋กญ, ์ฐ๋กํ๋ง๊ณผ ๊ฐ์ ์ญ์๋ ฅ ์ฒ๋ฆฌ ์ ๋ต) |
์ค๋ฅ ์ฒ๋ฆฌ | ์๋ (Try/catch ๋ธ๋ก) | ๋ด์ฅ (์ค๋ฅ ์ฒ๋ฆฌ ์ฐ์ฐ์) |
์ทจ์ | ์๋ (์ฌ์ฉ์ ์ ์ ๋ก์ง ํ์) | ๋ด์ฅ (๊ตฌ๋ ๊ด๋ฆฌ ๋ฐ ์ทจ์) |
ํ์ต ๊ณก์ | ๋ฎ์ (๋ ๊ฐ๋จํ ๊ฐ๋ ) | ๋์ (๋ ๋ณต์กํ ๊ฐ๋ ๋ฐ API) |
๋ ๊ฐ๋จํ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์๋๋ฆฌ์ค๋ ์ธ๋ถ ์ข ์์ฑ์ ํผํ๊ณ ์ถ์ ๋๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ ํํ์ญ์์ค. ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ, ์ญ์๋ ฅ ๊ด๋ฆฌ, ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฃฐ ๋, ํนํ ๋ ๋ณต์กํ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์๊ตฌ์ฌํญ์๋ RxJS๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๋ชจ๋ฒ ์ฌ๋ก
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ก ์์ ํ ๋ ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์ฐ์ํ ์ค๋ฅ ์ฒ๋ฆฌ: ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๋ก ์ธํด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ญ์์ค.
- ๋ฆฌ์์ค ๊ด๋ฆฌ: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ํ์ผ ํธ๋ค์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์ ์ ํ ํด์ ํ๋๋ก ํ์ญ์์ค.
- ์ญ์๋ ฅ ๊ตฌํ: ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ค๋ฃฐ ๋, ์๋น์๊ฐ ๊ณผ๋ถํ์ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐ์ดํฐ ์๋น ์๋๋ฅผ ์ ์ดํ์ญ์์ค.
- ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ ํ์ฉ: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ๊ตฌ์ฑ ๊ฐ๋ฅํ ํน์ฑ์ ํ์ฉํ์ฌ ๋ชจ๋์์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๋ง๋์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๊ฐ ๋ค์ํ ์กฐ๊ฑด์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค.
๊ฒฐ๋ก
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์ผ๋ฐ์ ์ธ ํจํด์ ์ดํดํจ์ผ๋ก์จ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ , ์๋ต์ฑ์ด ๋ฐ์ด๋๋ฉฐ, ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋, ๋์ฉ๋ ํ์ผ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์์ ์ ํ๋ , ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ ํ๋ฆ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
๋ ์์๋ณด๊ธฐ
- MDN Web Docs: for await...of
- Node.js ์คํธ๋ฆผ API: Node.js ์คํธ๋ฆผ
- RxJS: JavaScript๋ฅผ ์ํ ๋ฐ์ํ ํ์ฅ