자바스크립트 비동기 처리 이해하기
웹 개발에서 자바스크립트의 비동기 처리는 매우 중요한 개념입니다. 비동기 프로그래밍을 통해 사용자는 웹 페이지의 반응성을 유지하며, 대기 시간을 줄일 수 있습니다. 이 글에서는 자바스크립트에서 비동기 처리를 이루는 여러 방법을 살펴보겠습니다.

비동기와 동기 방식의 차이
동기(Synchronous) 방식에서는 코드가 순차적으로 처리되며, 이전 작업이 완료될 때까지 다음 작업이 대기합니다. 반면 비동기(Asynchronous) 방식에서는 현재 실행 중인 작업이 완료되지 않아도 다음 작업을 진행할 수 있습니다. 이를 통해 사용자는 다른 작업을 하면서도 웹 페이지의 반응을 기다릴 수 있습니다.
- 동기 방식: 현재 작업이 완료될 때까지 기다린다.
- 비동기 방식: 작업이 완료되지 않아도 다음 작업을 진행할 수 있다.
비동기 처리의 필요성
자바스크립트는 싱글 쓰레드로 작동하므로 한 번에 하나의 작업만 수행할 수 있습니다. 이러한 특성 때문에 비동기 처리가 필요합니다. 예를 들어, 서버에서 데이터를 요청할 경우 동기 방식으로 처리를 하면, 응답이 오기까지 다른 작업을 수행하지 못하게 됩니다. 이를 해결하기 위해 비동기 방식이 도입되었습니다.
콜백 함수 사용하기
비동기 작업을 처리하는 가장 기본적인 방법 중 하나는 콜백 함수입니다. 콜백 함수는 다른 함수의 인자로 전달되어, 특정 작업이 끝났을 때 실행되는 함수입니다. 다음은 콜백 함수를 활용한 예시입니다.
javascript
function fetchUserData(userId, callback) {
const user = {
id: userId,
name: “User” + userId,
email: userId + “@example.com”,
};
callback(user);
}
// 콜백 함수 사용
fetchUserData(1, function(user) {
console.log(“사용자 정보:”, user);
});
위 예시에서 fetchUserData
함수는 사용자 ID를 받아 사용자 객체를 생성한 후 콜백 함수를 호출합니다. 이를 통해 비동기 작업이 완료된 후의 결과를 안전하게 처리할 수 있습니다.
비동기 함수의 비동기 처리
자바스크립트에서는 setTimeout
과 같은 내장 비동기 함수도 활용할 수 있습니다. setTimeout
은 지정한 시간 후에 코드를 실행하는 기능을 제공하여 비동기 작업의 흐름을 쉽게 관리할 수 있게 해줍니다. 다음의 예시를 통해 살펴보겠습니다.
javascript
console.log(“작업 시작!”);
setTimeout(() => {
console.log(“비동기 작업 완료!”);
}, 1000);
console.log(“다음 작업 진행…”);
이 코드에서 setTimeout
은 1초 후에 “비동기 작업 완료!”라는 메시지를 출력하지만, 메인 스레드는 계속해서 다음 줄로 넘어갑니다. 결과적으로 사용자는 “작업 시작!”과 “다음 작업 진행…”을 먼저 보고, 1초 후에 비동기 작업의 결과를 보게 됩니다.

비동기 함수와 콜백의 한계
비동기 처리를 위해 콜백 함수를 사용하는 것은 편리하지만, 여러 개의 비동기 작업이 연속으로 이루어질 때 코드가 복잡해지는 콜백 지옥 현상이 발생할 수 있습니다. 이를 방지하기 위해 ES6에서는 Promise
라는 객체가 도입되었습니다.
Promise와 비동기 처리
Promise는 비동기 작업의 결과를 표현하는 객체로, 성공적으로 완료되면 resolved
상태가 되고, 실패하면 rejected
상태가 됩니다. 다음은 Promise를 활용한 예제입니다.
javascript
function getUser(userId) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (userId) {
resolve({ id: userId, name: “User” + userId });
} else {
reject(“사용자 ID가 유효하지 않습니다.”);
}
}, 1000);
});
}
getUser(1)
.then(user => {
console.log(“사용자 정보:”, user);
})
.catch(error => {
console.error(“오류:”, error);
});
Promise를 사용하면 then()
과 catch()
메서드를 통해 비동기 작업의 성공과 실패를 간단하게 처리할 수 있습니다. 이는 코드의 가독성을 높이는 데 큰 도움을 줍니다.
async/await를 통한 비동기 코드 간소화
ES8에서는 async
와 await
가 도입되어 비동기 코드를 더 간결하게 작성할 수 있습니다. async
키워드는 비동기 함수를 정의할 때 사용되고, await
키워드는 Promise가 완료될 때까지 기다리도록 만들 수 있습니다.
javascript
async function fetchData() {
try {
const user = await getUser(1);
console.log(“사용자 정보:”, user);
} catch (error) {
console.error(“오류:”, error);
}
}
fetchData();
위의 코드에서 async
함수 내에서 await
를 사용하면, Promise가 해결될 때까지 기다리게 됩니다. 이러한 방식은 동기적인 코드처럼 읽히기 때문에 비동기 작업의 흐름을 이해하기 쉽게 만들어 줍니다.

결론
비동기 처리는 자바스크립트 프로그래밍에서 필수적인 개념으로, 사용자 경험을 향상시키고 성능을 최적화하는 데 도움을 줍니다. 콜백 함수, Promise, async/await를 통해 우리는 비동기 작업을 간편하게 관리하고, 복잡한 흐름을 더 효율적으로 처리할 수 있습니다. 이러한 기법들을 숙지하고 활용함으로써, 더욱 매끄럽고 반응성이 뛰어난 웹 애플리케이션을 개발할 수 있습니다.
자주 찾는 질문 Q&A
비동기 처리가 무엇인가요?
비동기 처리는 동시에 여러 작업을 수행할 수 있도록 하는 방식으로, 사용자가 다른 작업을 하면서 기다리게 해줍니다.
동기 방식과 비동기 방식의 차이는 무엇인가요?
동기 방식은 이전 작업이 끝날 때까지 다음 작업이 시작되지 않지만, 비동기 방식은 이전 작업이 완료되지 않아도 다음 작업을 진행할 수 있습니다.
콜백 함수란 무엇인가요?
콜백 함수는 다른 함수의 인자로 전달되어 특정 작업이 끝난 후에 실행되는 함수를 의미합니다. 이는 비동기 작업의 결과를 처리하는 데 사용됩니다.
Promise는 무엇이고 어떻게 사용하나요?
Promise는 비동기 작업의 결과를 나타내는 객체로, 작업의 성공 여부에 따라 resolved나 rejected로 상태가 변합니다. 이를 통해 보다 간편하게 비동기 작업을 제어할 수 있습니다.
async/await는 어떻게 작동하나요?
async/await는 비동기 함수를 정의하고, Promise가 완료될 때까지 기다리게 해주는 문법으로, 코드의 가독성을 높이면서 비동기 작업의 흐름을 쉽게 이해할 수 있게 도와줍니다.