JavaScript์ AbortController API์ ๋ํ ์ข ํฉ ๊ฐ์ด๋๋ก, ์ต์ ์น ๊ฐ๋ฐ์ ์ํ ์์ฒญ ์ทจ์, ๋ฆฌ์์ค ๊ด๋ฆฌ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
AbortController API: ์์ฒญ ์ทจ์ ๋ฐ ๋ฆฌ์์ค ๊ด๋ฆฌ ๋ง์คํฐํ๊ธฐ
์ต์ ์น ๊ฐ๋ฐ์์ ๋น๋๊ธฐ ์์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ฑ๋ฅ์ด ์ข์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. AbortController API๋ ์์ฒญ์ ์ทจ์ํ๊ณ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ณ ๋ถํ์ํ ์ค๋ฒํค๋๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ AbortController API์ ํต์ฌ ๊ฐ๋ , ์ค์ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ณ ๊ธ ๊ธฐ์ ์ ๋ํด ์์ธํ ์ดํด๋ด ๋๋ค.
AbortController API๋ ๋ฌด์์ธ๊ฐ?
AbortController API๋ ํ๋ ์ด์์ ์น ์์ฒญ์ ์ค๋จํ ์ ์๊ฒ ํด์ฃผ๋ ๋ด์ฅ JavaScript API์ ๋๋ค. ์ด๋ ๋ ๊ฐ์ง ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค:
- AbortController: ์ทจ์ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด์ ๋๋ค.
- AbortSignal: AbortController์ ์ฐ๊ฒฐ๋ ์ ํธ ๊ฐ์ฒด๋ก, ์ทจ์ ์ ํธ๋ฅผ ์์ ํ๊ธฐ ์ํด ๋น๋๊ธฐ ์์
(์:
fetch
์์ฒญ)์ ์ ๋ฌ๋ฉ๋๋ค.
AbortController์์ abort()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ์ฐ๊ฒฐ๋ AbortSignal์ abort
์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ณ , ๋น๋๊ธฐ ์์
์ ์ด๋ฅผ ์์ ํ์ฌ ์ ์ ํ๊ฒ ์๋ตํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ฒญ์ ์ ์์ ์ผ๋ก ์ทจ์ํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก ๋ฐ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
ํต์ฌ ๊ฐ๋
1. AbortController ์์ฑํ๊ธฐ
AbortController API๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ AbortController
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค:
const controller = new AbortController();
2. AbortSignal ๊ฐ์ ธ์ค๊ธฐ
AbortController
์ธ์คํด์ค๋ signal
์์ฑ์ ํตํด AbortSignal
๊ฐ์ฒด์ ์ ๊ทผํ ์ ์์ต๋๋ค:
const signal = controller.signal;
3. ๋น๋๊ธฐ ์์ ์ AbortSignal ์ ๋ฌํ๊ธฐ
AbortSignal
์ ์ ์ดํ๋ ค๋ ๋น๋๊ธฐ ์์
์ ์ต์
์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, fetch
API๋ฅผ ์ฌ์ฉํ ๋ ์ต์
๊ฐ์ฒด์ ์ผ๋ถ๋ก signal
์ ์ ๋ฌํ ์ ์์ต๋๋ค:
fetch('/api/data', { signal })
.then(response => response.json())
.then(data => {
console.log('Data received:', data);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.error('Fetch error:', error);
}
});
4. ์์ฒญ ์ค๋จํ๊ธฐ
์์ฒญ์ ์ทจ์ํ๋ ค๋ฉด AbortController
์ธ์คํด์ค์์ abort()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค:
controller.abort();
์ด๋ ๊ฒ ํ๋ฉด ์ฐ๊ฒฐ๋ AbortSignal
์์ abort
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ฌ fetch
์์ฒญ์ด AbortError
์ ํจ๊ป ๊ฑฐ๋ถ๋ฉ๋๋ค.
์ค์ฉ์ ์ธ ์ฌ์ฉ ์ฌ๋ก
1. Fetch ์์ฒญ ์ทจ์ํ๊ธฐ
AbortController API์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ fetch
์์ฒญ์ ์ทจ์ํ๋ ๊ฒ์
๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง์์ ๋ฒ์ด๋๊ฑฐ๋ ์งํ ์ค์ธ ์์ฒญ์ ๋ถํ์ํ๊ฒ ๋ง๋๋ ์์
์ ์ํํ๋ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ ์ ์๊ฑฐ๋ ์น์ฌ์ดํธ์์ ์ ํ์ ๊ฒ์ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ด์ ๊ฒ์ ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ์ ์ฌ์ฉ์๊ฐ ์๋ก์ด ๊ฒ์์ด๋ฅผ ์
๋ ฅํ๋ฉด, AbortController๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ์์ฒญ์ ์ทจ์ํ๊ณ ๋์ญํญ๊ณผ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ ์ฝํ ์ ์์ต๋๋ค.
let controller = null;
function searchProducts(query) {
if (controller) {
controller.abort();
}
controller = new AbortController();
const signal = controller.signal;
fetch(`/api/products?q=${query}`, { signal })
.then(response => response.json())
.then(products => {
displayProducts(products);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('Search aborted');
} else {
console.error('Search error:', error);
}
});
}
function displayProducts(products) {
// UI์ ์ ํ ํ์
console.log('Products:', products);
}
// ์ฌ์ฉ ์์:
searchProducts('shoes');
searchProducts('shirts'); // 'shoes'์ ๋ํ ์ด์ ๊ฒ์์ ์ทจ์ํจ
2. ํ์์์ ๊ตฌํํ๊ธฐ
AbortController API๋ ๋น๋๊ธฐ ์์ ์ ๋ํ ํ์์์์ ๊ตฌํํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์๋ฒ๊ฐ ์๋ตํ์ง ์์ ๊ฒฝ์ฐ ์์ฒญ์ด ๋ฌด๊ธฐํ ๋๊ธฐ ์ํ์ ๋น ์ง๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ๋คํธ์ํฌ ์ง์ฐ์ด๋ ์๋ฒ ๋ฌธ์ ๋ก ์ธํด ์์ฒญ์ด ์์๋ณด๋ค ์ค๋ ๊ฑธ๋ฆด ์ ์๋ ๋ถ์ฐ ์์คํ ์์ ์ค์ํฉ๋๋ค. ํ์์์์ ์ค์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฒฐ์ฝ ๋์ฐฉํ์ง ์์ ์ ์๋ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ๋ฉ์ถ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
async function fetchDataWithTimeout(url, timeout) {
const controller = new AbortController();
const signal = controller.signal;
const timeoutId = setTimeout(() => {
controller.abort();
}, timeout);
try {
const response = await fetch(url, { signal });
clearTimeout(timeoutId);
return await response.json();
} catch (error) {
clearTimeout(timeoutId);
if (error.name === 'AbortError') {
throw new Error('Request timed out');
} else {
throw error;
}
}
}
// ์ฌ์ฉ ์์:
fetchDataWithTimeout('/api/data', 5000) // 5์ด ํ์์์
.then(data => {
console.log('Data received:', data);
})
.catch(error => {
console.error('Error:', error.message);
});
3. ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ๊ด๋ฆฌํ๊ธฐ
AbortController API๋ ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ๋์์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ด๋ จ๋ ์์ฒญ ๊ทธ๋ฃน์ ์ทจ์ํด์ผ ํ๋ ์๋๋ฆฌ์ค์์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์๋ณด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ธ์. ์ฌ์ฉ์๊ฐ ๋์๋ณด๋์์ ๋ฒ์ด๋๋ฉด ๋ชจ๋ ๋ณด๋ฅ ์ค์ธ ์์ฒญ์ ์ทจ์ํ์ฌ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํด์ผ ํฉ๋๋ค.
const controller = new AbortController();
const signal = controller.signal;
const urls = [
'/api/data1',
'/api/data2',
'/api/data3'
];
async function fetchData(url) {
try {
const response = await fetch(url, { signal });
return await response.json();
} catch (error) {
if (error.name === 'AbortError') {
console.log(`Fetch aborted for ${url}`);
} else {
console.error(`Fetch error for ${url}:`, error);
}
throw error;
}
}
Promise.all(urls.map(fetchData))
.then(results => {
console.log('All data received:', results);
})
.catch(error => {
console.error('Error fetching data:', error);
});
// ๋ชจ๋ ์์ฒญ์ ์ทจ์ํ๋ ค๋ฉด:
controller.abort();
๊ณ ๊ธ ๊ธฐ์
1. ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ํจ๊ป AbortController ์ฌ์ฉํ๊ธฐ
AbortController API๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ํด์ ๋๊ฑฐ๋ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๋ฆฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ง์ ๋น๋์ค ํ๋ ์ด์ด๋ฅผ ๋ง๋ค ๋ 'play', 'pause', 'ended' ์ด๋ฒคํธ์ ๋ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. AbortController๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ ์ด์ด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์ด๋ฌํ ๋ฆฌ์ค๋๊ฐ ์ ๋๋ก ์ ๊ฑฐ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
function addEventListenerWithAbort(element, eventType, listener, signal) {
element.addEventListener(eventType, listener);
signal.addEventListener('abort', () => {
element.removeEventListener(eventType, listener);
});
}
// ์ฌ์ฉ ์์:
const controller = new AbortController();
const signal = controller.signal;
const button = document.getElementById('myButton');
function handleClick() {
console.log('Button clicked!');
}
addEventListenerWithAbort(button, 'click', handleClick, signal);
// ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด:
controller.abort();
2. AbortSignal ์ฒด์ด๋
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฌ๋ฌ AbortSignal์ ํจ๊ป ์ฐ๊ฒฐํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ทจ์ ์ ํธ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ํ๋์ ์ ํธ๋ฅผ ์ค๋จํ๋ฉด ๋ชจ๋ ์์ ์ ํธ๊ฐ ์๋์ผ๋ก ์ค๋จ๋ฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ์ ํธ๋ฅผ ๋จ์ผ ์ ํธ๋ก ๊ฒฐํฉํ๋ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ๋ง๋ค์ด ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ์๋ก ์์กดํ๋ ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ์์ํด ๋ณด์ธ์. ํ ์ปดํฌ๋ํธ๊ฐ ์คํจํ๊ฑฐ๋ ์ทจ์๋๋ฉด ๋ชจ๋ ์ข ์ ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ์ทจ์ํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
function combineAbortSignals(...signals) {
const controller = new AbortController();
signals.forEach(signal => {
if (signal) {
signal.addEventListener('abort', () => {
controller.abort();
});
}
});
return controller.signal;
}
// ์ฌ์ฉ ์์:
const controller1 = new AbortController();
const controller2 = new AbortController();
const combinedSignal = combineAbortSignals(controller1.signal, controller2.signal);
fetch('/api/data', { signal: combinedSignal })
.then(response => response.json())
.then(data => {
console.log('Data received:', data);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
} else {
console.error('Fetch error:', error);
}
});
// controller1์ ์ค๋จํ๋ฉด fetch ์์ฒญ๋ ์ค๋จ๋ฉ๋๋ค:
controller1.abort();
3. AbortError ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ
์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด AbortError
์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํ๋ ์ ์ญ ์ค๋ฅ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์ผ๊ด๋ ๋์์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด๋ AbortError๋ฅผ ํ์ธํ๊ณ ์ ์ ํ ์กฐ์น๋ฅผ ์ทจํ๋ ์ฌ์ฉ์ ์ง์ ์ค๋ฅ ์ฒ๋ฆฌ ํจ์๋ฅผ ๋ง๋ค์ด ์ํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค์ ์ง์ค์ ์ ๊ทผ ๋ฐฉ์์ ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง์ ๋ ์ฝ๊ฒ ์
๋ฐ์ดํธํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
function handleAbortError(error) {
if (error.name === 'AbortError') {
console.log('Request aborted globally');
// ํ์ํ ์ ๋ฆฌ ์์
์ด๋ UI ์
๋ฐ์ดํธ ์ํ
}
}
// ์ฌ์ฉ ์์:
fetch('/api/data')
.then(response => response.json())
.then(data => {
console.log('Data received:', data);
})
.catch(error => {
handleAbortError(error);
console.error('Fetch error:', error);
});
์ค๋ฅ ์ฒ๋ฆฌ
AbortController API๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ด ์ค๋จ๋๋ฉด fetch
ํ๋ก๋ฏธ์ค๋ AbortError
์ ํจ๊ป ๊ฑฐ๋ถ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์์ ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ๋ ค๋ฉด ์ด ์ค๋ฅ๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
fetch('/api/data', { signal })
.then(response => response.json())
.then(data => {
console.log('Data received:', data);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('Fetch aborted');
// ํ์ํ ์ ๋ฆฌ ์์
์ด๋ UI ์
๋ฐ์ดํธ ์ํ
} else {
console.error('Fetch error:', error);
// ๋ค๋ฅธ ์ค๋ฅ ์ฒ๋ฆฌ
}
});
์ค๋ฅ ์ฒ๋ฆฌ ๋ธ๋ก์์ error.name
์์ฑ์ ๊ฒ์ฌํ์ฌ AbortError
๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ค๋ฅ๊ฐ AbortError
์ธ ๊ฒฝ์ฐ, ์ฌ์ฉ์์๊ฒ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์
์ํ๋ฅผ ์ฌ์ค์ ํ๋ ๋ฑ ํ์ํ ์ ๋ฆฌ ์์
์ด๋ UI ์
๋ฐ์ดํธ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก
- ํญ์
AbortError
์์ธ ์ฒ๋ฆฌํ๊ธฐ: ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฝ๋๊ฐAbortError
์์ธ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํ์ธ์. - ์ค๋ช ์ ์ธ ์ค๋ฅ ๋ฉ์์ง ์ฌ์ฉํ๊ธฐ: ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๋ช ํํ๊ณ ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์.
- ๋ฆฌ์์ค ์ ๋ฆฌํ๊ธฐ: ์์ฒญ์ด ์ค๋จ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ด๋จธ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๊ฐ์ ๊ด๋ จ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ์ธ์.
- ํ์์์ ๊ฐ ๊ณ ๋ คํ๊ธฐ: ์์ฒญ์ด ๋ฌด๊ธฐํ ๋๊ธฐ ์ํ์ ๋น ์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋น๋๊ธฐ ์์ ์ ์ ์ ํ ํ์์์ ๊ฐ์ ์ค์ ํ์ธ์.
- ์ฅ๊ธฐ ์คํ ์์ ์ AbortController ์ฌ์ฉํ๊ธฐ: ์๋ฃํ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ ์์ ์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ํ์ํ ๋ ์์ ์ ์ทจ์ํ ์ ์๋๋ก AbortController API๋ฅผ ์ฌ์ฉํ์ธ์.
๋ธ๋ผ์ฐ์ ํธํ์ฑ
AbortController API๋ Chrome, Firefox, Safari, Edge๋ฅผ ํฌํจํ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ์ด API๋ฅผ ์ง์ํ์ง ์์ ์ ์์ต๋๋ค. ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํด๋ฆฌํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ตฌํ ๋ธ๋ผ์ฐ์ ์ AbortController ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฌ๋ฌ ํด๋ฆฌํ์ด ์์ผ๋ฉฐ, npm์ด๋ yarn๊ณผ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
AbortController์ ๋ฏธ๋
AbortController API๋ ์งํํ๋ ๊ธฐ์ ์ด๋ฉฐ, ์ฌ์์ ํฅํ ๋ฒ์ ์์๋ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ฌํญ์ด ๋์ ๋ ์ ์์ต๋๋ค. ํ๋์ ์ด๊ณ ํจ์จ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด์๋ AbortController API์ ์ต์ ๊ฐ๋ฐ ๋ํฅ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ด ์ ๊ณต๋ ๋ ์ด๋ฅผ ํ์ฉํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํธ์ JavaScript ํ์ค์ ์ฃผ๋ชฉํ์ธ์.
๊ฒฐ๋ก
AbortController API๋ JavaScript์์ ๋น๋๊ธฐ ์์ ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ์์ฒญ์ ์ทจ์ํ๊ณ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ฑ๋ฅ์ด ์ข์ผ๋ฉฐ ์ฌ์ฉ์ ์นํ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. AbortController API์ ํต์ฌ ๊ฐ๋ , ์ค์ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ณ ๊ธ ๊ธฐ์ ์ ์ดํดํ๋ ๊ฒ์ ํ๋ ์น ๊ฐ๋ฐ์ ํ์์ ์ ๋๋ค. ์ด API๋ฅผ ๋ง์คํฐํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.