데이터 처리 모델은 데이터를 받는 방식으로 동기, 비동기의 2가지 처리 모델이 존재한다.
(출처 : https://jieun0113.tistory.com/73)
🔎 Callback 함수
콜백함수란 함수에 매개변수로 함수 객체를 전달해서 호출 함수 내에서 매개변수 함수를 실행하는 것을 뜻하며, 다른 함수가 실행을 끝낸 뒤 실행된다.
콜백함수는 가독성이나 코드 재사용 면에서도 사용되며, 비동기 방식으로 작성된 함수를 동기 처리하기 위해서도 사용된다.
(출처 : https://dkswnkk.tistory.com/488)
자바스크립트는 비동기 처리를 위한 하나의 패턴으로 콜백 함수를 사용한다. 하지만 전통적인 콜백 패턴은 콜백 지옥(콜백 헬)로 인해 가독성이 나쁘고 비동기 처리 중 발생한 에러의 처리가 곤란하며, 여러 개의 비동기 처리를 한 번에 처리하는 데도 한계가 있다. 그래서 ES6에서는 비동기 처리를 위한 또 다른 패턴으로 프로미스(Promise)를 도입했다.
➡️ 콜백 지옥을 경험하고 나서 등장한 것도 있지만, 프로미스는 보통 네트워크 통신이나 파일에서 큰 데이터를 읽는 등의 무거운 작업을 수행할 때 많이 사용한다.
// Promise 객체의 생성
const promise = new Promise((resolve, reject) => {
// 비동기 작업을 수행한다.
if (/* 비동기 작업 수행 성공 */) {
resolve('result');
}
else { /* 비동기 작업 수행 실패 */
reject('failure reason');
}
});
→ 프로미스는 Promise 생성자 함수를 통해 객체 생성, Promise 생성자 함수는 비동기 작업을 수행할 콜백 함수를 인자로 전달받는다.
→ 프로미스는 실패할 때도 존재하기 때문에 성공할 경우는 resolve에, 실패할 경우는 reject에 리턴할 값과 에러 메시지를 담는다. (if 절로 분기를 나눠서 정리)
⇒ 실패한 경우에 에러 메시지는 프로미스 객체의 후속 처리 메소드로 전달됨.
promise
.then((value) => {
console.log(value);
})
.catch((error) => {
console.log(error);
})
.finally(() => {
console.log("anyway finally");
});
프로미스는 후속 처리 메소드를 체이닝하여 여러 개의 프로미스를 연결하여 사용할 수 있는데 이를 이용하여 콜백 지옥을 해결할 수 있다.
자바스크립트의 비동기 처리 패턴 중 가장 최근에 나온 문법으로, 기존의 비동기 처리 방식인 콜백 함수와 프로미스의 단점을 보완하고 가독성 좋은 코드를 작성할 수 있게 도와준다.
async function 함수명() {
await 비동기처리_메서드_명();
}
🎲 async
🎲 await
💡 async/await를 사용하면 await가 대기를 처리해 주기 때문에 .then(프로미스)이 거의 필요하지 않으며, 일반 try … catch를 사용할 수 있어서 대개는 async/await를 사용하는 것이 편하다.
그러나, await는 async 안에서만 동작하기 때문에 관행처럼 .then/catch를 추가해 최종 결과나 처리되지 못한 에러를 다룬다.
📎 참고
https://jieun0113.tistory.com/73
https://velog.io/@slobber/동기와-비동기의-차이
https://velog.io/@khy226/동기-비동기란-Promise-asyncawait-개념
https://dkswnkk.tistory.com/488
https://lunuloopp.tistory.com/entry/동기-비동기의-이해-callback함수-promise-async-await
https://velog.io/@ko1586/Callback함수란-뭔데
https://velog.io/@wnduf8922/JS-Promisethen-catch