์๋ฐ์คํฌ๋ฆฝํธ ๋์ ๋ฐ๋ณต์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํ์ํ์ฌ ๋ฐ์ดํฐ ์ง์ฝ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค์ธ์. ํจ์จ์ ์ธ ๋น๋๊ธฐ ์์ ์ ์ํด ์ด ๋ฐ๋ณต์๋ฅผ ๊ตฌํํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ๋์ ๋ฐ๋ณต์(Concurrent Iterators): ํฅ์๋ ์ฑ๋ฅ์ ์ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ ํ์ฉ
๋์์์ด ๋ฐ์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฑ๋ฅ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ฑ ๋ณต์กํด์ง๊ณ ๋ฐ์ดํฐ ์ง์ฝ์ ์ผ๋ก ๋ณํจ์ ๋ฐ๋ผ, ๊ฐ๋ฐ์๋ค์ ์คํ ์๋์ ๋ฆฌ์์ค ํ์ฉ์ ์ต์ ํํ๊ธฐ ์ํ ๊ธฐ์ ์ ๋์์์ด ์ฐพ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋ ธ๋ ฅ์์ ๊ฐ๋ ฅํ ๋๊ตฌ ์ค ํ๋๋ ๋์ ๋ฐ๋ณต์(Concurrent Iterator)์ด๋ฉฐ, ์ด๋ ๋น๋๊ธฐ ์์ ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ํน์ ์๋๋ฆฌ์ค์์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ด๋์ด๋ ๋๋ค.
๋น๋๊ธฐ ๋ฐ๋ณต์(Asynchronous Iterators) ์ดํดํ๊ธฐ
๋์ ๋ฐ๋ณต์๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ๋ฐ๋ณต์์ ๊ธฐ๋ณธ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ES6์ ํจ๊ป ๋์ ๋ ์ ํต์ ์ธ ๋ฐ๋ณต์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ํํ๋ ๋๊ธฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ํ์ผ์ ์ฝ๋ ๊ฒ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ๋ค๋ฃฐ ๋, ์ ํต์ ์ธ ๋ฐ๋ณต์๋ ๊ฐ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ๋ฏ๋ก ๋นํจ์จ์ ์ด ๋ฉ๋๋ค.
ES2018์ ๋์
๋ ๋น๋๊ธฐ ๋ฐ๋ณต์๋ ๋น๋๊ธฐ ์์
์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ฐ๋ณต์ ์ผ์ ์ค์งํ๊ณ ์ฌ๊ฐํ ์ ์๊ฒ ํ์ฌ ์ด๋ฌํ ํ๊ณ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ async ํจ์์ ํ๋ก๋ฏธ์ค(promise) ๊ฐ๋
์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ, ๋
ผ๋ธ๋กํน(non-blocking) ๋ฐ์ดํฐ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋น๋๊ธฐ ๋ฐ๋ณต์๋ value์ done ์์ฑ์ ํฌํจํ๋ ๊ฐ์ฒด๋ก ๊ท๊ฒฐ(resolve)๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ next() ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค. value๋ ํ์ฌ ์์๋ฅผ ๋ํ๋ด๊ณ , done์ ๋ฐ๋ณต์ด ์๋ฃ๋์๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค.
๋ค์์ ๋น๋๊ธฐ ๋ฐ๋ณต์์ ๊ธฐ๋ณธ ์์ ์ ๋๋ค:
async function* asyncGenerator() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
const asyncIterator = asyncGenerator();
asyncIterator.next().then(result => console.log(result)); // { value: 1, done: false }
asyncIterator.next().then(result => console.log(result)); // { value: 2, done: false }
asyncIterator.next().then(result => console.log(result)); // { value: 3, done: false }
asyncIterator.next().then(result => console.log(result)); // { value: undefined, done: true }
์ด ์์ ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํ(yield)ํ๋ ๊ฐ๋จํ ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค. asyncIterator.next() ๋ฉ์๋๋ ์ํ์ค์ ๋ค์ ๊ฐ์ผ๋ก ๊ท๊ฒฐ๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. await ํค์๋๋ ๋ค์ ๊ฐ์ด ๋ฐํ๋๊ธฐ ์ ์ ๊ฐ ํ๋ก๋ฏธ์ค๊ฐ ๊ท๊ฒฐ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋์์ฑ์ ํ์์ฑ: ๋ณ๋ชฉ ํ์ ํด๊ฒฐ
๋น๋๊ธฐ ๋ฐ๋ณต์๋ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด ๋๊ธฐ ๋ฐ๋ณต์์ ๋นํด ์๋นํ ๊ฐ์ ์ ์ ๊ณตํ์ง๋ง, ์ฌ์ ํ ์์ ์ ์์ฐจ์ ์ผ๋ก ์คํํฉ๋๋ค. ๊ฐ ์์ ์ด ๋ ๋ฆฝ์ ์ด๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์๋๋ฆฌ์ค์์ ์ด๋ฌํ ์์ฐจ์ ์คํ์ ๋ณ๋ชฉ ํ์์ด ๋์ด ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ์ ํํ ์ ์์ต๋๋ค.
๊ฐ๊ฐ ๋ค๋ฅธ ์ง์ญ์ด๋ ๊ตญ๊ฐ๋ฅผ ๋ํ๋ด๋ ์ฌ๋ฌ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด๋ณด์ญ์์ค. ํ์ค ๋น๋๊ธฐ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํ๋ฉด ํ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์๋ต์ ๊ธฐ๋ค๋ฆฐ ๋ค์, ๋ค์ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ผ๋ก ์งํ๋ฉ๋๋ค. ์ด๋ฌํ ์์ฐจ์ ์ ๊ทผ ๋ฐฉ์์ ํนํ API์ ์ง์ฐ ์๊ฐ์ด ๊ธธ๊ฑฐ๋ ์์ฒญ ์ ํ์ด ์๋ ๊ฒฝ์ฐ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
๋ฐ๋ก ์ด ์ง์ ์์ ๋์ ๋ฐ๋ณต์๊ฐ ํ์ฝํฉ๋๋ค. ๋์ ๋ฐ๋ณต์๋ ๋น๋๊ธฐ ์์ ์ ๋ณ๋ ฌ ์คํ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ฌ๋ฌ API์์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ ๋ชจ๋ธ์ ํ์ฉํจ์ผ๋ก์จ ์ ์ฒด ์คํ ์๊ฐ์ ํฌ๊ฒ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋์ ๋ฐ๋ณต์ ์๊ฐ
๋์ ๋ฐ๋ณต์๋ ๋น๋๊ธฐ ์์
์ ๋ณ๋ ฌ ์คํ์ ๊ด๋ฆฌํ๋ ๋ง์ถคํ ๋ฐ๋ณต์์
๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์๋๋ผ ์ง์ ๊ตฌํํ๋ ํจํด์
๋๋ค. ํต์ฌ ์์ด๋์ด๋ ์ฌ๋ฌ ๋น๋๊ธฐ ์์
์ ๋์์ ์์ํ ๋ค์, ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๋๋ก ๋ฐํ(yield)ํ๋ ๊ฒ์
๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๋ฏธ์ค์ Promise.all() ๋๋ Promise.race() ๋ฉ์๋, ๊ทธ๋ฆฌ๊ณ ํ์ฑ ์์
์ ๊ด๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค.
๋์ ๋ฐ๋ณต์์ ์ฃผ์ ๊ตฌ์ฑ ์์:
- ์์ ํ(Task Queue): ์คํํ ๋น๋๊ธฐ ์์ ์ ๋ด๋ ํ์ ๋๋ค. ์ด๋ฌํ ์์ ์ ์ข ์ข ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ ํจ์๋ก ํํ๋ฉ๋๋ค.
- ๋์์ฑ ์ ํ(Concurrency Limit): ๋์์ ์คํ๋ ์ ์๋ ์์ ์์ ๋ํ ์ ํ์ ๋๋ค. ์ด๋ ๋๋ฌด ๋ง์ ๋ณ๋ ฌ ์์ ์ผ๋ก ์์คํ ์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์์ ๊ด๋ฆฌ: ์ ์์ ์์, ์๋ฃ๋ ์์ ์ถ์ , ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ ์์ ์คํ์ ๊ด๋ฆฌํ๋ ๋ก์ง์ ๋๋ค.
- ๊ฒฐ๊ณผ ์ฒ๋ฆฌ: ์๋ฃ๋ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ด๋ ๋ฐฉ์์ผ๋ก ๋ฐํ(yield)ํ๋ ๋ก์ง์ ๋๋ค.
๋์ ๋ฐ๋ณต์ ๊ตฌํ: ์ค์ ์์
์ค์ ์์ ๋ฅผ ํตํด ๋์ ๋ฐ๋ณต์ ๊ตฌํ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ๋ฌ API์์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์ ํ ๊ฒ์ ๋๋ค.
async function* concurrentIterator(urls, concurrency) {
const taskQueue = [...urls];
const runningTasks = new Set();
async function runTask(url) {
runningTasks.add(url);
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
yield data;
} catch (error) {
console.error(`Error fetching ${url}: ${error}`);
} finally {
runningTasks.delete(url);
if (taskQueue.length > 0) {
const nextUrl = taskQueue.shift();
runTask(nextUrl);
} else if (runningTasks.size === 0) {
// ๋ชจ๋ ์์
์๋ฃ
}
}
}
// ์ด๊ธฐ ์์
์ธํธ ์์
for (let i = 0; i < concurrency && taskQueue.length > 0; i++) {
const url = taskQueue.shift();
runTask(url);
}
}
// ์ฌ์ฉ ์์
const apiUrls = [
'https://rickandmortyapi.com/api/character/1', // ๋ฆญ ์ฐ์ฒด์ค
'https://rickandmortyapi.com/api/character/2', // ๋ชจํฐ ์ค๋ฏธ์ค
'https://rickandmortyapi.com/api/character/3', // ์ธ๋จธ ์ค๋ฏธ์ค
'https://rickandmortyapi.com/api/character/4', // ๋ฒ ์ค ์ค๋ฏธ์ค
'https://rickandmortyapi.com/api/character/5' // ์ ๋ฆฌ ์ค๋ฏธ์ค
];
async function main() {
const concurrencyLimit = 2;
for await (const data of concurrentIterator(apiUrls, concurrencyLimit)) {
console.log('๋ฐ์ดํฐ ์์ :', data.name);
}
console.log('๋ชจ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ฃ.');
}
main();
์ค๋ช :
concurrentIteratorํจ์๋ URL ๋ฐฐ์ด๊ณผ ๋์์ฑ ์ ํ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค.- ๊ฐ์ ธ์ฌ URL์ ํฌํจํ๋
taskQueue์ ํ์ฌ ํ์ฑ ์์ ์ ์ถ์ ํ๋runningTasks์งํฉ์ ์ ์งํฉ๋๋ค. runTaskํจ์๋ ์ฃผ์ด์ง URL์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ(yield)ํ ๋ค์, ํ์ ๋ ๋ง์ URL์ด ์๊ณ ๋์์ฑ ์ ํ์ ๋๋ฌํ์ง ์์ ๊ฒฝ์ฐ ์ ์์ ์ ์์ํฉ๋๋ค.- ์ด๊ธฐ ๋ฃจํ๋ ๋์์ฑ ์ ํ๊น์ง์ ์ฒซ ๋ฒ์งธ ์์ ์ธํธ๋ฅผ ์์ํฉ๋๋ค.
mainํจ์๋ ๋์ ๋ฐ๋ณต์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ API์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.for await...of๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณต์๊ฐ ๋ฐํํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ํํฉ๋๋ค.
์ค์ ๊ณ ๋ ค์ฌํญ:
- ์ค๋ฅ ์ฒ๋ฆฌ:
runTaskํจ์์๋ ๊ฐ์ ธ์ค๊ธฐ ์์ ์ค์ ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ์ก๊ธฐ ์ํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ก๊น ์ ๊ตฌํํด์ผ ํฉ๋๋ค. - ์์ฒญ ์ ํ(Rate Limiting): ์ธ๋ถ API๋ก ์์ ํ ๋๋ ์์ฒญ ์ ํ์ ์ค์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์์ฒญ ์ฌ์ด์ ์ง์ฐ์ ์ถ๊ฐํ๊ฑฐ๋ ํ ํฐ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๋ฑ ์ด๋ฌํ ์ ํ์ ์ด๊ณผํ์ง ์๋๋ก ํ๋ ์ ๋ต์ ๊ตฌํํด์ผ ํ ์ ์์ต๋๋ค.
- ์ญ์(Backpressure): ๋ฐ๋ณต์๊ฐ ์๋น์๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ, ์์คํ ๊ณผ๋ถํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ญ์ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํด์ผ ํ ์ ์์ต๋๋ค.
๋์ ๋ฐ๋ณต์์ ์ด์
- ์ฑ๋ฅ ํฅ์: ๋น๋๊ธฐ ์์ ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ํนํ ์ฌ๋ฌ ๋ ๋ฆฝ์ ์ธ ์์ ์ ๋ค๋ฃฐ ๋ ์ ์ฒด ์คํ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
- ์๋ต์ฑ ํฅ์: ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์์์ผ๋ก์จ ๋์ ๋ฐ๋ณต์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ์ ํฅ์์์ผ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ํจ์จ์ ์ธ ๋ฆฌ์์ค ํ์ฉ: ๋์ ๋ฐ๋ณต์๋ I/O ์์ ์ CPU ๋ฐ์ด๋ ์์ ๊ณผ ์ค์ฒฉ์์ผ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- ํ์ฅ์ฑ: ๋์ ๋ฐ๋ณต์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ง์ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ์ฌ ํ์ฅ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋์ ๋ฐ๋ณต์์ ์ฌ์ฉ ์ฌ๋ก
๋์ ๋ฐ๋ณต์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ค์์ ๋ ๋ฆฝ์ ์ธ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค:
- ๋ฐ์ดํฐ ์ง๊ณ: ์ฌ๋ฌ ์์ค(์: API, ๋ฐ์ดํฐ๋ฒ ์ด์ค)์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋จ์ผ ๊ฒฐ๊ณผ๋ก ๊ฒฐํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์ ํ ์ ๋ณด๋ ๋ค๋ฅธ ๊ฑฐ๋์์ ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ: ํฌ๊ธฐ ์กฐ์ , ํํฐ๋ง ๋๋ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํ๋ ๋ฑ ์ฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ๋์์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ์ด๋ฏธ์ง ํธ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ ์์ ์ผ๋ฐ์ ์ ๋๋ค.
- ๋ก๊ทธ ๋ถ์: ์ฌ๋ฌ ๋ก๊ทธ ํญ๋ชฉ์ ๋์์ ์ฒ๋ฆฌํ์ฌ ๋์ฉ๋ ๋ก๊ทธ ํ์ผ์ ๋ถ์ํฉ๋๋ค. ์ด๋ ํจํด, ์ด์ ์งํ ๋๋ ๋ณด์ ์ํ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์น ์คํฌ๋ํ: ์ฌ๋ฌ ์น ํ์ด์ง์์ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ํํฉ๋๋ค. ์ด๋ ์ฐ๊ตฌ, ๋ถ์ ๋๋ ๊ฒฝ์ ์ ๋ณด ์์ง์ ์ํด ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ผ๊ด ์ฒ๋ฆฌ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ์ฝ๋ ์ ๋ฐ์ดํธ ๋๋ ๋ค์์ ์์ ์์๊ฒ ์ด๋ฉ์ผ ๋ฐ์ก๊ณผ ๊ฐ์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ๋ํ ์ผ๊ด ์์ ์ ์ํํฉ๋๋ค.
๋ค๋ฅธ ๋์์ฑ ๊ธฐ์ ๊ณผ์ ๋น๊ต
์๋ฐ์คํฌ๋ฆฝํธ๋ ์น ์์ปค(Web Workers), ํ๋ก๋ฏธ์ค(Promises), ๊ทธ๋ฆฌ๊ณ async/await๋ฅผ ํฌํจํ์ฌ ๋์์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๋ค์ํ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค. ๋์ ๋ฐ๋ณต์๋ ๋น๋๊ธฐ ์์ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํนํ ์ ํฉํ ํน์ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
- ์น ์์ปค(Web Workers): ์น ์์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ์ค๋ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ์ฌ CPU ์ง์ฝ์ ์ธ ์์ ์ ๋ฉ์ธ ์ค๋ ๋์์ ์์ ํ ์คํ๋ก๋ํ ์ ์์ต๋๋ค. ์ง์ ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ฉ์ธ ์ค๋ ๋์์ ํต์ ๋ฐ ๋ฐ์ดํฐ ๊ณต์ ์ ์ ํ์ด ์์ต๋๋ค. ๋ฐ๋ฉด, ๋์ ๋ฐ๋ณต์๋ ๋์ผํ ์ค๋ ๋ ๋ด์์ ์๋ํ๋ฉฐ ๋์์ฑ์ ์ํด ์ด๋ฒคํธ ๋ฃจํ์ ์์กดํฉ๋๋ค.
- ํ๋ก๋ฏธ์ค์ Async/Await: ํ๋ก๋ฏธ์ค์ async/await๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ณธ์ง์ ์ผ๋ก ๋ณ๋ ฌ ์คํ์ ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. ๋์ ๋ฐ๋ณต์๋ ํ๋ก๋ฏธ์ค์ async/await๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ๋ณ๋ ฌ ์คํ์ ์กฐ์จํฉ๋๋ค.
- `p-map` ๋ฐ `fastq`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: `p-map` ๋ฐ `fastq`์ ๊ฐ์ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋น๋๊ธฐ ์์ ์ ๋์ ์คํ์ ์ํ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ฉฐ ๋์์ฑ ํจํด์ ๊ตฌํ์ ๋จ์ํํ ์ ์์ต๋๋ค. ํน์ ์๊ตฌ ์ฌํญ ๋ฐ ์ฝ๋ฉ ์คํ์ผ์ ๋ง๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
์ ์ญ์ ๊ณ ๋ ค์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
์ ์ญ ์ปจํ ์คํธ์์ ๋์ ๋ฐ๋ณต์๋ฅผ ๊ตฌํํ ๋๋ ์ต์ ์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์์๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ: ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ง๋ฆฌ์ ์์น์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ง์ญ์ ์ฌ์ฉ์์ ๋ํ ์ง์ฐ ์๊ฐ์ ์ต์ํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- API ์์ฒญ ์ ํ: API๋ ์ง์ญ์ด๋ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ฐ๋ผ ๋ค๋ฅธ ์์ฒญ ์ ํ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ง์์ ๋ฐฑ์คํ(exponential backoff)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์๋ต์ ์บ์ฑํ๋ ๋ฑ ์์ฒญ ์ ํ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ ๋ต์ ๊ตฌํํ์ญ์์ค.
- ๋ฐ์ดํฐ ํ์งํ: ๋ค๋ฅธ ์ง์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ํ์งํ ๋ฒ๋ฅ ๋ฐ ๊ท์ ์ ์์งํ์ญ์์ค. ํน์ ์ง๋ฆฌ์ ๊ฒฝ๊ณ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํด์ผ ํ ์ ์์ต๋๋ค.
- ์๊ฐ๋: ํ์์คํฌํ๋ฅผ ๋ค๋ฃจ๊ฑฐ๋ ์์ ์ ์์ฝํ ๋ ๋ค๋ฅธ ์๊ฐ๋์ ์ ์ํ์ญ์์ค. ์ ๋ขฐํ ์ ์๋ ์๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ ๊ณ์ฐ ๋ฐ ๋ณํ์ ๋ณด์ฅํ์ญ์์ค.
- ๋ฌธ์ ์ธ์ฝ๋ฉ: ํนํ ๋ค๋ฅธ ์ธ์ด์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฝ๋๊ฐ ๋ค๋ฅธ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ์ญ์์ค. UTF-8์ ์ผ๋ฐ์ ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํธ๋๋ ์ธ์ฝ๋ฉ์ ๋๋ค.
- ํตํ ๋ณํ: ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ ์ ํํ ํ์จ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ต์ ์ ๋ณด๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ ๋ขฐํ ์ ์๋ ํ์จ API ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋์ ๋ฐ๋ณต์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋ฐํํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ ๋ชจ๋ธ์ ํ์ฉํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํค๊ณ , ์๋ต์ฑ์ ๋์ด๋ฉฐ, ๋ฆฌ์์ค ํ์ฉ์ ์ต์ ํํ ์ ์์ต๋๋ค. ๊ตฌํ์๋ ์์ ๊ด๋ฆฌ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋์์ฑ ์ ํ์ ๋ํ ์ ์คํ ๊ณ ๋ ค๊ฐ ํ์ํ์ง๋ง, ์ฑ๋ฅ ๋ฐ ํ์ฅ์ฑ ์ธก๋ฉด์์์ ์ด์ ์ ์๋นํ ์ ์์ต๋๋ค.
๋ ๋ณต์กํ๊ณ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํจ์ ๋ฐ๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด ๋์ ๋ฐ๋ณต์๋ฅผ ์ฌ๋ฌ๋ถ์ ํดํท์ ํตํฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ญ์์ค. ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ต์ ์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ, API ์์ฒญ ์ ํ, ๋ฐ์ดํฐ ํ์งํ์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ์ ์ธก๋ฉด์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
๋ ์์๋ณด๊ธฐ
- MDN ์น ๋ฌธ์ - ๋น๋๊ธฐ ๋ฐ๋ณต์ ๋ฐ ์ ๋๋ ์ดํฐ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function*
- `p-map` ๋ผ์ด๋ธ๋ฌ๋ฆฌ: https://github.com/sindresorhus/p-map
- `fastq` ๋ผ์ด๋ธ๋ฌ๋ฆฌ: https://github.com/mcollina/fastq