자바스크립트는 싱글 스레드 기반으로 동작하는 언어입니다. 이는 하나의 작업이 완료될 때까지 다른 작업을 처리할 수 없다는 의미입니다. 하지만 동시에 다수의 요청을 처리해야 하는 경우가 많이 있습니다. 예를 들어, 웹 애플리케이션에서 여러 API 호출을 수행하거나 동시에 많은 데이터를 처리해야 할 때가 있습니다.
비동기 처리와 콜백 함수
비동기 처리 방식을 사용하여 동시 다발적인 요청 처리를 구현할 수 있습니다. 이를 위해 자바스크립트는 콜백 함수를 사용합니다. 콜백 함수는 비동기 작업을 처리한 뒤에 호출되는 함수입니다. 예를 들어, AJAX 요청을 수행하는 경우 콜백 함수를 등록하여 응답이 도착한 뒤에 작업을 처리할 수 있습니다.
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
// 데이터 처리
})
.catch(error => {
// 에러 처리
});
코드에서 fetch
함수는 비동기적으로 요청을 보내고, then
메서드를 사용하여 응답을 처리하고, catch
메서드를 사용하여 에러를 처리합니다. 이렇게 비동기 코드를 작성하면 여러 개의 요청을 동시에 보낼 수 있습니다.
Promise와 async/await
ES6에서는 콜백 지옥을 해결하기 위해 Promise라는 개념을 도입했습니다. Promise는 비동기 작업을 추상화한 객체이며, 성공 또는 실패를 처리하는 메서드를 제공합니다. 콜백 함수 대신 Promise를 반환하는 방식으로 비동기 작업을 처리할 수 있습니다.
function fetchData() {
return new Promise((resolve, reject) => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => resolve(data))
.catch(error => reject(error));
});
}
fetchData()
.then(data => {
// 데이터 처리
})
.catch(error => {
// 에러 처리
});
또한 ES8에서는 async
와 await
키워드가 도입되었습니다. async
함수는 비동기 작업을 수행하는 일반 함수를 감싸고, await
키워드는 비동기 작업이 완료될 때까지 함수의 실행을 일시 중단합니다. 이를 통해 동기적인 코드와 유사한 스타일로 비동기 작업을 처리할 수 있습니다.
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
// 데이터 처리
} catch (error) {
// 에러 처리
}
}
fetchData();
동시 다발적 요청 처리
Promise와 async/await을 사용하여 여러 개의 요청을 동시에 처리할 수 있습니다. 이를 위해 Promise.all
메서드를 사용하면 됩니다. Promise.all
은 여러 개의 Promise를 받아 모든 Promise가 완료될 때까지 기다린 후에 결과를 반환합니다. 이를 이용하여 여러 개의 비동기 작업을 동시에 처리할 수 있습니다.
async function fetchMultipleData() {
try {
const promise1 = fetch('https://api.example.com/data1');
const promise2 = fetch('https://api.example.com/data2');
const promise3 = fetch('https://api.example.com/data3');
const [data1, data2, data3] = await Promise.all([promise1, promise2, promise3])
.then(responses => Promise.all(responses.map(response => response.json())));
// 데이터 처리
} catch (error) {
// 에러 처리
}
}
fetchMultipleData();
위의 코드에서는 fetch
함수로 요청을 보내고, Promise.all 메서드를 사용하여 모든 요청이 완료될 때까지 기다립니다. 그 후, map
함수를 사용하여 응답을 JSON으로 변환하고, 결과를 배열로 반환합니다. 이러한 방법을 사용하면 여러 개의 요청을 동시에 처리하고, 결과를 모두 받을 수 있습니다.
자바스크립트를 사용하여 동시 다발적인 요청 처리를 구현하는 방법을 살펴보았습니다. 비동기 작업을 적절히 처리하면 웹 애플리케이션의 성능을 향상시키고 사용자 경험을 개선할 수 있습니다. 애플리케이션의 요구 사항에 맞게 비동기 처리 방식을 선택하여 효율적인 코드를 작성해보세요.