자바스크립트 비동기 처리

자바스크립트는 싱글 스레드 기반의 언어로, 한 번에 하나의 작업만 처리할 수 있습니다. 하지만 웹 애플리케이션에서는 여러 작업을 동시에 처리해야 할 때가 많습니다. 이런 경우 자바스크립트의 비동기 처리 메커니즘이 큰 도움이 됩니다. 비동기 처리를 통해 여러 작업을 동시에 처리하고, 효율적으로 웹 애플리케이션을 개발할 수 있습니다.

콜백 함수

자바스크립트에서 가장 일반적으로 사용되는 비동기 처리 방법은 콜백 함수 입니다. 콜백 함수는 비동기 작업이 완료되었을 때 호출되는 함수입니다. 이를 통해 작업의 완료 여부를 확인하고, 이후 작업을 수행할 수 있습니다.

다음은 콜백 함수를 사용한 비동기적인 타이머 설정 예제입니다.

console.log("시작");

setTimeout(function() {
  console.log("3초 경과");
}, 3000);

console.log("");

위 코드에서 setTimeout 함수는 3초 후에 콜백 함수를 실행합니다. 코드의 실행 흐름은 다음과 같습니다.

  1. “시작”을 출력합니다.
  2. setTimeout 함수를 호출하고 작업을 등록합니다.
  3. “끝”을 출력합니다.
  4. 3초가 지나면 등록된 콜백 함수가 실행되어 “3초 경과”를 출력합니다.

Promise

콜백 함수는 쉽게 깊어지는 콜백 헬(callback hell)을 유발할 수 있습니다. 이러한 문제를 해결하기 위해 ES6부터는 Promise 객체가 도입되었습니다. Promise는 비동기 작업의 성공 또는 실패 상태를 나타내는 객체로, 콜백 함수보다 가독성이 높고 유지 보수가 쉽습니다.

Promise를 사용한 예제를 살펴보겠습니다.

console.log("시작");

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("3초 경과");
  }, 3000);
});

promise.then((result) => {
  console.log(result);
}).catch((error) => {
  console.error(error);
});

console.log("");

위 코드는 이전의 콜백 함수 예제와 동일한 동작을 수행합니다. 하지만 Promise를 사용하면 .then() 메서드와 .catch() 메서드를 통해 성공과 실패에 대한 처리를 분리할 수 있습니다.

async/await

ES8부터는 async/await 문법이 도입되었습니다. async/await는 Promise를 더 간편하게 사용할 수 있도록 해 줍니다. async 함수는 항상 Promise를 반환하며, await 키워드를 사용하여 비동기 작업을 동기적으로 처리할 수 있습니다.

console.log("시작");

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function timer() {
  await delay(3000);
  console.log("3초 경과");
}

timer()
  .then(() => {
    console.log("완료");
  })
  .catch((error) => {
    console.error(error);
  });

console.log("");

위 코드에서는 delay 함수를 정의하여 원하는 시간(ms)만큼 대기할 수 있도록 했습니다. timer 함수는 delay 함수를 사용하여 3초를 기다린 후 “3초 경과”를 출력합니다. 이후 호출한 곳에서 .then()을 사용하여 작업의 완료를 확인할 수 있습니다.

마무리

자바스크립트 비동기 처리는 웹 애플리케이션 개발에서 중요한 부분입니다. 콜백 함수, Promise, async/await 등을 통해 비동기 작업을 효율적으로 처리할 수 있습니다. 하지만 비동기 처리를 사용할 때에는 코드의 복잡성과 에러 처리에 대한 주의가 필요하므로, 유지 보수하기 쉬운 코드를 작성하는 것이 중요합니다.