Language/React.js
[React] 동기와 비동기
JJcoding
2024. 10. 7. 17:45
본격적으로 리액트에 들어가기 앞서 다시 한번 상기하는 공부.
동기
- 여러 개의 작업을 순서대로, 하나씩 처리하는 방식이다.
- JavaScript는 기본적으로 “동기적”으로 코드를 실행한다.
- 동기 방식에는 치명적인 단점이 존재한다.
- 자바 등 다른 언어에서는 ‘멀티쓰레드’ 방식으로 오래 걸리는 작업이 중간에 포함되어 있더라도 해당 작업이 프로그램 전체 성능에 큰 영향을 주지 않도록 동기 방식의 단점을 어느정도 보완한다.
- 그러나 자바스크립트 엔진에는 쓰레드가 1개 밖에 없다. 그래서 ‘비동기’ 방식으로 해결한다.
비동기
- 작업을 순서대로 처리하지 않는 방식이다.
- 여러 개의 작업이 주어졌을 때 앞선 작업이 끝나지 않았어도 다음 작업을 동시에 실행시킨다.
- 비동기 작업들은 자바스크립트 엔진이 아닌 Web APIs에서 실행 된다.
- Web APIs는 웹 브라우저가 직접 관리하는 별도의 영역이다.
비동기 작업 처리하기 1. 콜백함수
콜백지옥
// 음식을 주문하는 상황
function orderFood(callback){
setTimeout(() => {
const food = "떡볶이";
callback(food);
}, 3000);
}
function cooldownFood(food, callback) {
setTimeout(() => {
const cooldownedFood = `식은 ${food}`;
callback(cooldownedFood);
}, 2000)
}
function freezeFood(food, callback) {
setTimeout(()=>{
const freezedFood = `냉동된 ${food}`;
callback(freezedFood);
}, 1500);
}
orderFood((food) => {
console.log(`맛있는 ${food}`);
cooldownFood(food, (cooldownedFood) => {
console.log(cooldownedFood);
freezeFood(cooldownedFood, (freezedFood) => {
console.log(freezedFood);
});
});
});
비동기 작업 처리하기 2. Promise
- 비동기 작업을 효율적으로 처리할 수 있도록 도와주는 자바스크립트의 내장 객체이다.
- 비동기 작업을 감싸는 객체로서 비동기 작업 실행, 비동기 작업 상태 관리, 비동기 작업 결과저장, 비동기 작업 병렬 진행, 비동기 작업 다시 시작, 기타 등등의 일을 한다.
- Promise의 3가지 상태
- 대기(Pending) : 아직 작업이 완료되지 않은 상태
- 성공(Fulfilled) : 비동기 작업이 성공적으로 마무리 된 상태 (resolve)
- 실패(Rejected) : 비동기 작업이 실패한 상태 (reject)
function add10(num) {
const promise = new Promise((resolve, reject) => {
// 비동기 작업 실행하는 함수
// executor
setTimeout(() => {
if(typeof num === 'number') {
resolve(num + 10);
} else {
reject("num이 숫자가 아닙니다.");
}
}, 2000);
});
return promise;
}
add10(0)
.then((result)=>{
console.log(result);
return add10(result);
})
.then((result) => {
console.log(result);
return add10(undefined);
})
.then((result) => {
console.log(result);
}).catch((error) => {
console.log(error);
});
// then 메서드
// -> 그 후에
// promise chaining 이라고 한다.
promise
.then((value) => {
console.log(value);
})
.catch((error)=>{
console.log(error);
});
비동기 작업 처리하기 3. async/await
// async
// 어떤 함수를 비동기 함수로 만들어주는 키워드
// 함수가 프로미스를 반환하도록 변환해주는 키워드
async function getData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
name: "이진주",
id: "jinju",
});
}, 1500);
});
};
// await
// async 함수 내부에서만 사용이 가능 한 키워드
// 비동기 함수가 다 처리되기를 기다리는 역할
async function printData() {
const data = await getData();
console.log(data);
}
printData();
출처 : 한입 크기로 잘라 먹는 리액트