React를 사용한 웹 사이트 개발 프로젝트를 진행하면서 동기, 비동기 작업 처리가 중요한 역할을 담당한다고 느끼는 일이 많았는데, 무작정 사용하는 것이 아닌 개념을 좀 더 분명하게 알고 사용하고 싶어 정리를 해보려고 합니다.
작업이 순차적으로 실행되는 것을 의미
즉, 한 가지 작업이 끝나야 다음 작업이 시작
console.log('1');
console.log('2');
console.log('3');
동시에 여러 작업이 실행될 수 있는 것을 의미
javascript에서는 async와 await를 통해 비동기 작업을 다룸
async function exFunc() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
}
exFunc();
Q: 비동기 프로그래밍에서 순서 보장을 처리할 바에 그냥 동기적 프로그래밍을 사용하면 되지 않나요?
A: 그렇게 생각할 수 있지만, 비동기 프로그래밍이 가진 장점을 유지하면서 특정 순서를 보장하는 방법이 필요하므로 비동기적 요소에서 순서를 보장하는 경우가 많습니다.
예를 들어, 데이터를 활용해 UI를 업데이트하는 경우에 데이터 로딩 작업이 완료되지 않은 상태에서 UI 업데이트 작업을 시작하면 문제가 발생할 수 있기 때문에, 이런 경우 비동기 작업의 순서를 보장해야 합니다.
Promise 사용
let promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('첫 번째 작업 완료');
}, 3000);
});
let promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('두 번째 작업 완료');
}, 2000);
});
promise1.then((result1) => {
console.log(result1);
return promise2;
}).then((result2) => {
console.log(result2);
});
async/await 사용
async function asyncFunction() {
let promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('첫 번째 작업 완료');
}, 3000);
});
let promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('두 번째 작업 완료');
}, 2000);
});
console.log(await promise1);
console.log(await promise2);
}
asyncFunction();