Promise란?
Promise는 JavaScript에서 비동기 작업을 다루는 객체이다. 이는 "나중에 결과를 주겠다"라는 약속과 같다. Promise가 성공적으로 완료되면 결과를 제공하며, 실패하면 그 원인을 알려준다.
let homework = new Promise((resolve, reject) => {
// 여기서 숙제를 함
if (/* 숙제 성공 */) {
resolve("숙제 답");
} else {
reject("너무 어려워서 못 했어요");
}
});
homework.then(answer => console.log(answer)).catch(reason => console.error(reason));
위 코드에서 homework라는 Promise 객체가 있는데 이 객체가 resolve 함수를 호출하면, .then() 메서드가 실행된다. 반대로 reject 함수를 호출하면 .catch() 메서드가 실행된다.
Async/Await란?
async function waitForResult() {
try {
let answer = await homework; // 시험 답안이 준비될 때까지 기다림
console.log(answer);
} catch (reason) {
console.error(reason); // 왜 시험 답안이 안 나왔는지 설명함
}
}
waitForResult();
await 키워드는 우리가 결과를 기다리도록 지시한다. 그리고 이 '결과'란 바로 앞선 예시에서 본 것처럼 'Promise'이다.
즉, await homework; 라고 하면 JavaScript에게 "여기서 잠깐 멈춰! homework Promise가 결과를 줄 때까지 기다려!"라고 말하는 것과 같다. 그리고 이 모든 것은 async 함수 내에서만 가능하다.
Promise와 Async/Await의 차이
두 방법 모두 JavaScript에서 비동기 처리를 하기 위한 도구이다. 하지만, Async/Await은 Promise를 기반으로 한 보다 간결한 문법을 제공한다.
Promise는 '비동기 작업이 완료될 것을 약속'하는 객체이다. 이행(fulfilled) 상태가 되면 결과를 반환하고, 거부(rejected) 상태가 되면 오류를 반환한다.
반면에, Async/Await는 비동기 코드를 마치 동기 코드처럼 작성할 수 있게 해준다. 이로 인해 코드의 가독성과 유지 관리가 훨씬 쉬워진다.
결론
JavaScript에서 비동기 처리는 매우 중요한 부분인데 Promise와 Async/Await 모두 자신만의 장점을 가지고 있으며, 필요에 따라 적절히 활용할 수 있다.
Async/Await 문법은 Promise 기반으로 구현되어 있으며, 코드의 가독성을 크게 향상시키므로 복잡한 로직에서 특히 유용하다. 그러나 때로는 단순한 비동기 작업에 대해서는 Promise만 사용하는 것이 더 간단하고 직관적일 수도 있다.
따라서 어떤 도구를 사용할지 결정하기 위해서는 개별 프로젝트의 요구 사항과 개인적인 선호도 등 여러 요소들을 고려해야 한다.