์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฑ๋ฅ ์์ง์ ํ์ํ๊ณ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ต์ ํ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ด ๊ฐ์ด๋๋ ์ด๋ก , ์ค์ ์์ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฑ๋ฅ ์์ง: ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ต์ ํ
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ค๋ฃน๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ ๋๋ ์ดํฐ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ํ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ ์ต์ ํ ๊ธฐ์ ์ ํตํด ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ํฅ์์ํค๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฑ๋ฅ ์์ง์ ๊ฐ๋ ์ ํ๊ตฌํฉ๋๋ค.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ ๋๋ ์ดํฐ ์ดํดํ๊ธฐ
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ ๋๋ ์ดํฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ค ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ํ์ฅ์ ๋๋ค. ์ด๋ฅผ ํตํด ์คํธ๋ฆผ์ด๋ ์๊ฒฉ ์์ค๋ก๋ถํฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํ ์ ์์ต๋๋ค. ์ด๋ I/O ๋ฐ์ด๋ ์์ ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ ์๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ next()
๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด์
๋๋ค. ์ด ํ๋ก๋ฏธ์ค๋ ๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ ์ฌํ๊ฒ value
์ done
์์ฑ์ ๊ฐ์ง ๊ฐ์ฒด๋ก ํด์(resolve)๋ฉ๋๋ค. ๊ทธ๋ฌ๋ next()
๋ฉ์๋๋ ์ฆ์ ๊ฐ์ ๋ฐํํ์ง ์๊ณ , ๊ฒฐ๊ตญ ๊ฐ์ผ๋ก ํด์๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
์์ :
async function* generateNumbers(count) {
for (let i = 0; i < count; i++) {
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate async operation
yield i;
}
}
(async () => {
for await (const number of generateNumbers(5)) {
console.log(number);
}
})();
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ
๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค. async function*
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค. ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ ๋ด์์๋ yield
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ์์ฑํ ์ ์์ต๋๋ค.
์์ ์์ ๋ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. generateNumbers
ํจ์๋ ์ซ์๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์์ฑํ๊ณ , for await...of
๋ฃจํ๋ ๊ทธ ์ซ์๋ค์ ์๋นํฉ๋๋ค.
์ต์ ํ์ ํ์์ฑ: ์ฑ๋ฅ ๋ณ๋ชฉ ํ์ ํด๊ฒฐ
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ์ ์คํ๊ฒ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ณ๋ชฉ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ฐจ์ ์ฒ๋ฆฌ: ๊ธฐ๋ณธ์ ์ผ๋ก ์คํธ๋ฆผ์ ๊ฐ ์์๋ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ ๋ณ๋ ฌ๋ก ์ํํ ์ ์๋ ์์ ์ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
- I/O ์ง์ฐ ์๊ฐ: I/O ์์ (์: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ API์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ)์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์๋นํ ์ง์ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
- CPU ๋ฐ์ด๋ ์์ : ๊ฐ ์์์ ๋ํด ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํํ๋ฉด ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ถ์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ณ๋ชฉ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ ์ ์๋ ์ฑ๋ฅ ์์ง์ด ํ์ํฉ๋๋ค. ์ด ์์ง์ ๋ณ๋ ฌ ์ฒ๋ฆฌ, ์บ์ฑ, ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๊ฐ์ ๊ธฐ์ ์ ํตํฉํด์ผ ํฉ๋๋ค.
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฑ๋ฅ ์์ง ์๊ฐ
๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฑ๋ฅ ์์ง์ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ค๊ณ๋ ๋๊ตฌ ๋ฐ ๊ธฐ์ ๋ชจ์์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํฉ๋๋ค:
- ๋ณ๋ ฌ ์ฒ๋ฆฌ: ์คํธ๋ฆผ์ ์ฌ๋ฌ ์์๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ฒํผ๋ง ๋ฐ ๋ฐฐ์น ์ฒ๋ฆฌ: ๋ณด๋ค ํจ์จ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ํด ์์๋ฅผ ๋ฐฐ์น๋ก ์ถ์ ํฉ๋๋ค.
- ์บ์ฑ: ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ I/O ์ง์ฐ ์๊ฐ์ ์ค์ ๋๋ค.
- ๋ณํ ํ์ดํ๋ผ์ธ: ์ฌ๋ฌ ์์ ์ ํ์ดํ๋ผ์ธ์ผ๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์คํจ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
์ฃผ์ ์ต์ ํ ๊ธฐ์
1. `mapAsync`๋ฅผ ์ด์ฉํ ๋ณ๋ ฌ ์ฒ๋ฆฌ
mapAsync
ํฌํผ๋ ์คํธ๋ฆผ์ ๊ฐ ์์์ ๋น๋๊ธฐ ํจ์๋ฅผ ๋ณ๋ ฌ๋ก ์ ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๋
๋ฆฝ์ ์ผ๋ก ์ํ๋ ์ ์๋ ์์
์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์ :
async function* processData(data) {
for (const item of data) {
await new Promise(resolve => setTimeout(resolve, 50)); // Simulate I/O operation
yield item * 2;
}
}
async function mapAsync(iterable, fn, concurrency = 4) {
const results = [];
const executing = new Set();
for await (const item of iterable) {
const p = Promise.resolve(fn(item))
.then((result) => {
results.push(result);
executing.delete(p);
})
.catch((error) => {
// Handle error appropriately, possibly re-throw
console.error("Error in mapAsync:", error);
executing.delete(p);
throw error; // Re-throw to stop processing if needed
});
executing.add(p);
if (executing.size >= concurrency) {
await Promise.race(executing);
}
}
await Promise.all(executing);
return results;
}
(async () => {
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const processedData = await mapAsync(processData(data), async (item) => {
await new Promise(resolve => setTimeout(resolve, 20)); // Simulate additional async work
return item + 1;
});
console.log(processedData);
})();
์ด ์์ ์์ mapAsync
๋ ๋์์ฑ 4๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ์ต๋ 4๊ฐ์ ์์๊ฐ ๋์์ ์ฒ๋ฆฌ๋ ์ ์์์ ์๋ฏธํ๋ฉฐ, ์ ์ฒด ์ฒ๋ฆฌ ์๊ฐ์ ํฌ๊ฒ ์ค์
๋๋ค.
์ค์ ๊ณ ๋ ค ์ฌํญ: ์ ์ ํ ๋์์ฑ ์์ค์ ์ ํํด์ผ ํฉ๋๋ค. ๋๋ฌด ๋์ ๋์์ฑ์ ๋ฆฌ์์ค(CPU, ๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค)๋ฅผ ์๋ํ ์ ์์ผ๋ฉฐ, ๋๋ฌด ๋ฎ์ ๋์์ฑ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค๋ฅผ ์์ ํ ํ์ฉํ์ง ๋ชปํ ์ ์์ต๋๋ค.
2. `buffer`์ `batch`๋ฅผ ์ด์ฉํ ๋ฒํผ๋ง ๋ฐ ๋ฐฐ์น ์ฒ๋ฆฌ
๋ฒํผ๋ง๊ณผ ๋ฐฐ์น ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์๋๋ฆฌ์ค์ ์ ์ฉํฉ๋๋ค. ๋ฒํผ๋ง์ ์์๋ฅผ ๋ฒํผ์ ์ถ์ ํ๊ณ , ๋ฐฐ์น ์ฒ๋ฆฌ๋ ์์๋ฅผ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ฐฐ์น๋ก ๊ทธ๋ฃนํํฉ๋๋ค.
์์ :
async function* generateData() {
for (let i = 0; i < 25; i++) {
await new Promise(resolve => setTimeout(resolve, 10));
yield i;
}
}
async function* buffer(iterable, bufferSize) {
let buffer = [];
for await (const item of iterable) {
buffer.push(item);
if (buffer.length >= bufferSize) {
yield buffer;
buffer = [];
}
}
if (buffer.length > 0) {
yield buffer;
}
}
async function* batch(iterable, batchSize) {
let batch = [];
for await (const item of iterable) {
batch.push(item);
if (batch.length === batchSize) {
yield batch;
batch = [];
}
}
if (batch.length > 0) {
yield batch;
}
}
(async () => {
console.log("Buffering:");
for await (const chunk of buffer(generateData(), 5)) {
console.log(chunk);
}
console.log("\nBatching:");
for await (const batchData of batch(generateData(), 5)) {
console.log(batchData);
}
})();
buffer
ํจ์๋ ์ง์ ๋ ํฌ๊ธฐ์ ๋๋ฌํ ๋๊น์ง ์์๋ฅผ ๋ฒํผ์ ์ถ์ ํฉ๋๋ค. batch
ํจ์๋ ์ ์ฌํ์ง๋ง, ์ง์ ๋ ํฌ๊ธฐ์ ์์ ํ ๋ฐฐ์น๋ง ์์ฑํฉ๋๋ค. ๋จ์ ์์๋ ๋ฐฐ์น ํฌ๊ธฐ๋ณด๋ค ์๋๋ผ๋ ๋ง์ง๋ง ๋ฐฐ์น๋ก ์์ฑ๋ฉ๋๋ค.
์ฌ์ฉ ์ฌ๋ก: ๋ฒํผ๋ง๊ณผ ๋ฐฐ์น ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ํนํ ์ ์ฉํฉ๋๋ค. ๊ฐ ์์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ฐ๋ ๋์ , ํจ๊ป ๋ฐฐ์นํ์ฌ ๋ ํจ์จ์ ์ธ ์ฐ๊ธฐ๋ฅผ ํ ์ ์์ต๋๋ค.
3. `cache`๋ฅผ ์ด์ฉํ ์บ์ฑ
์บ์ฑ์ ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. cache
ํฌํผ๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ ์ ์์ต๋๋ค.
์์ :
const cache = new Map();
async function fetchUserData(userId) {
if (cache.has(userId)) {
console.log("Cache hit for user ID:", userId);
return cache.get(userId);
}
console.log("Fetching user data for user ID:", userId);
await new Promise(resolve => setTimeout(resolve, 200)); // Simulate network request
const userData = { id: userId, name: `User ${userId}` };
cache.set(userId, userData);
return userData;
}
async function* processUserIds(userIds) {
for (const userId of userIds) {
yield await fetchUserData(userId);
}
}
(async () => {
const userIds = [1, 2, 1, 3, 2, 4, 5, 1];
for await (const user of processUserIds(userIds)) {
console.log(user);
}
})();
์ด ์์ ์์ fetchUserData
ํจ์๋ ๋จผ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์บ์์ ์๋์ง ํ์ธํฉ๋๋ค. ๋ง์ฝ ์๋ค๋ฉด ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ฒฉ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์บ์์ ์ ์ฅํ ํ ๋ฐํํฉ๋๋ค.
์บ์ ๋ฌดํจํ: ๋ฐ์ดํฐ์ ์ต์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์บ์ ๋ฌดํจํ ์ ๋ต์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ด๋ ์บ์๋ ํญ๋ชฉ์ ๋ํ TTL(Time-To-Live)์ ์ค์ ํ๊ฑฐ๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ฅผ ๋ฌดํจํํ๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค.
4. `pipe`๋ฅผ ์ด์ฉํ ๋ณํ ํ์ดํ๋ผ์ธ
๋ณํ ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์์ ์ ์์๋๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ณต์กํ ์์ ์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋จ๊ณ๋ก ๋ถํดํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์ :
async function* generateNumbers(count) {
for (let i = 0; i < count; i++) {
await new Promise(resolve => setTimeout(resolve, 10));
yield i;
}
}
async function* square(iterable) {
for await (const item of iterable) {
yield item * item;
}
}
async function* filterEven(iterable) {
for await (const item of iterable) {
if (item % 2 === 0) {
yield item;
}
}
}
async function* pipe(...fns) {
let iterable = fns[0]; // Assumes first arg is an async iterable.
for (let i = 1; i < fns.length; i++) {
iterable = fns[i](iterable);
}
for await (const item of iterable) {
yield item;
}
}
(async () => {
const numbers = generateNumbers(10);
const pipeline = pipe(numbers, square, filterEven);
for await (const result of pipeline) {
console.log(result);
}
})();
์ด ์์ ์์ pipe
ํจ์๋ generateNumbers
, square
, filterEven
์ธ ๊ฐ์ง ์์
์ ํจ๊ป ์ฐ๊ฒฐํฉ๋๋ค. generateNumbers
ํจ์๋ ์ซ์ ์ํ์ค๋ฅผ ์์ฑํ๊ณ , square
ํจ์๋ ๊ฐ ์ซ์๋ฅผ ์ ๊ณฑํ๋ฉฐ, filterEven
ํจ์๋ ํ์๋ฅผ ๊ฑธ๋ฌ๋
๋๋ค.
ํ์ดํ๋ผ์ธ์ ์ด์ : ํ์ดํ๋ผ์ธ์ ์ฝ๋ ๊ตฌ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํต๋๋ค. ํ์ดํ๋ผ์ธ์ ๋จ๊ณ๋ฅผ ์ฝ๋์ ๋๋จธ์ง ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ฝ๊ฒ ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์ฌ์ ๋ ฌํ ์ ์์ต๋๋ค.
5. ์ค๋ฅ ์ฒ๋ฆฌ
๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค.
์์ :
async function* processData(data) {
for (const item of data) {
try {
if (item === 5) {
throw new Error("Simulated error");
}
await new Promise(resolve => setTimeout(resolve, 50));
yield item * 2;
} catch (error) {
console.error("Error processing item:", item, error);
// Optionally, you can yield a special error value or skip the item
}
}
}
(async () => {
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for await (const result of processData(data)) {
console.log(result);
}
})();
์ด ์์ ์์ processData
ํจ์๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด try...catch
๋ธ๋ก์ ํฌํจํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํ๊ณ ๋๋จธ์ง ํญ๋ชฉ์ ์ฒ๋ฆฌ๋ฅผ ๊ณ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ค๋ฅ๋ก ์ธํด ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๊ธ๋ก๋ฒ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
- ๊ธ์ต ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ์ค์๊ฐ ์ฃผ์ ์์ฅ ๋ฐ์ดํฐ ํผ๋๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ด๋ ํ๊ท ์ ๊ณ์ฐํ๊ณ , ์ถ์ธ๋ฅผ ํ์ ํ๋ฉฐ, ๊ฑฐ๋ ์ ํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๋ด์ ์ฆ๊ถ ๊ฑฐ๋์(NYSE), ๋ฐ๋ ์ฆ๊ถ ๊ฑฐ๋์(LSE), ๋์ฟ ์ฆ๊ถ ๊ฑฐ๋์(TSE)์ ๊ฐ์ ์ ์ธ๊ณ ์์ฅ์ ์ ์ฉ๋ ์ ์์ต๋๋ค.
- ์ ์์๊ฑฐ๋ ์ํ ์นดํ๋ก๊ทธ ๋๊ธฐํ: ์ฌ๋ฌ ์ง์ญ๊ณผ ์ธ์ด์ ๊ฑธ์ณ ์ํ ์นดํ๋ก๊ทธ๋ฅผ ๋๊ธฐํํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋ฐ์ดํฐ ์์ค(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, API, CSV ํ์ผ)์์ ์ํ ์ ๋ณด๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ๊ณ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
- IoT ๋ฐ์ดํฐ ๋ถ์: ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ์๋ฐฑ๋ง ๊ฐ์ IoT ์ฅ์น์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๋ถ์ํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ผ์, ์ก์ถ์์ดํฐ ๋ฐ ๊ธฐํ ์ฅ์น์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ค๋งํธ ์ํฐ ์ด๋์ ํฐ๋ธ๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๊ตํต ํ๋ฆ์ ๊ด๋ฆฌํ๊ฑฐ๋ ๋๊ธฐ ์ง์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
- ์์ ๋ฏธ๋์ด ๋ชจ๋ํฐ๋ง: ๋ธ๋๋๋ ์ ํ์ ๋ํ ์ธ๊ธ์ ์ํด ์์ ๋ฏธ๋์ด ์คํธ๋ฆผ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ฏธ๋์ด API์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ด๋ จ ์ ๋ณด(์: ๊ฐ์ฑ ๋ถ์, ์ฃผ์ ์ถ์ถ)๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค.
- ๋ก๊ทธ ๋ถ์: ๋ถ์ฐ ์์คํ ์ ๋ก๊ทธ ํ์ผ์ ์ฒ๋ฆฌํ์ฌ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ , ์ฑ๋ฅ์ ์ถ์ ํ๋ฉฐ, ๋ณด์ ์ํ์ ๊ฐ์งํฉ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋์ฉ๋ ๋ก๊ทธ ํ์ผ์ ์ฝ๊ณ ์ฒ๋ฆฌํ์ฌ ๋ ๋น ๋ฅธ ๋ถ์๊ณผ ์ ์ํ ๋์ ์๊ฐ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๊ตฌํ ์ ๊ณ ๋ ค์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
- ์ฌ๋ฐ๋ฅธ ์๋ฃ ๊ตฌ์กฐ ์ ํ: ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ฒ๋ฆฌ์ ์ ํฉํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ธ์. ์๋ฅผ ๋ค์ด, ํจ์จ์ ์ธ ์กฐํ ๋ฐ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด Map๊ณผ Set์ ์ฌ์ฉํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ต์ ํ: ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ถ์ ํ์ง ๋ง์ธ์. ์คํธ๋ฆฌ๋ฐ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌํ์ธ์.
- ์ฝ๋ ํ๋กํ์ผ๋ง: ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ธ์. Node.js๋ ์ฝ๋ ์ฑ๋ฅ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ ๋ด์ฅ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฝ๋ ํ ์คํธ: ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ์ฝ๋๊ฐ ์ ํํ๊ณ ํจ์จ์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ์ธ์.
- ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ํฐ๋ง: ํ๋ก๋์ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋งํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์ฑ๋ฅ ๋ชฉํ๋ฅผ ์ถฉ์กฑํ๋์ง ํ์ธํ์ธ์.
- ์ ์ ํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๋ฒ์ ์ ํ: ์ต์ ๋ฒ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(์: Chrome ๋ฐ Node.js์ V8)์๋ ์ข ์ข ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ๋ฐ ์ ๋๋ ์ดํฐ์ ๋ํ ์ฑ๋ฅ ๊ฐ์ ์ด ํฌํจ๋ฉ๋๋ค. ํฉ๋ฆฌ์ ์ผ๋ก ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ์ธ์.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ ํฌํผ ์ฑ๋ฅ ์์ง์ ์คํธ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๊ธฐ์ ๋ชจ์์ ์ ๊ณตํฉ๋๋ค. ๋ณ๋ ฌ ์ฒ๋ฆฌ, ๋ฒํผ๋ง, ์บ์ฑ, ๋ณํ ํ์ดํ๋ผ์ธ ๋ฐ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์ ๋ขฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ด๋ฌํ ๊ธฐ์ ์ ์ ์ ํ๊ฒ ์ ์ฉํจ์ผ๋ก์จ ๊ณ ์ฑ๋ฅ, ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ๊ฒฌ๊ณ ํ ์คํธ๋ฆผ ์ฒ๋ฆฌ ์๋ฃจ์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ ๋ ์ค์ํด์ง ๊ฒ์ ๋๋ค. ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ ๋๋ ์ดํฐ๋ฅผ ๋ง์คํฐํ๊ณ ์ฑ๋ฅ ์ต์ ํ ์ ๋ต์ ํ์ฉํ๋ ๊ฒ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๋ณต์กํ ์ํฌ๋ก๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ํจ์จ์ ์ด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
๋ ์์๋ณด๊ธฐ
- MDN ์น ๋ฌธ์: ๋น๋๊ธฐ ์ดํฐ๋ ์ดํฐ์ ์ ๋๋ ์ดํฐ
- Node.js ์คํธ๋ฆผ API: ๋ ๋ณต์กํ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ธฐ ์ํด Node.js ์คํธ๋ฆผ API๋ฅผ ํ์ํด ๋ณด์ธ์.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๊ณ ๊ธ ์คํธ๋ฆผ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ํด RxJS ๋ฐ Highland.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์กฐ์ฌํด ๋ณด์ธ์.