Nevertheless

동기와 비동기 λ³Έλ¬Έ

πŸ–₯️Web/JavaScript

동기와 비동기

hxx_1 2025. 9. 16. 17:00

동기

μ—¬λŸ¬ 개의 μž‘μ—…μ΄ μžˆμ„ λ•Œ μž‘μ—…λ“€μ„ μˆœμ„œλŒ€λ‘œ ν•œ λ²ˆμ— ν•˜λ‚˜μ”©λ§Œ μ²˜λ¦¬ν•˜λŠ” 방식

➑️ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” "동기"적으둜 μ½”λ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.

➑️ λ§Œμ•½ ν•˜λ‚˜μ˜ μž‘μ—…μ΄ μ•„μ£Ό 였래 κ±Έλ¦°λ‹€λ©΄, κ·Έ μž‘μ—…μ΄ λλ‚˜κΈ° μ „κΉŒμ§€λŠ” λ‹€μŒ μž‘μ—…μ„ μ‹€ν–‰ν•  수 μ—†κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž¨ μ„±λŠ₯이 μ•…ν™”λœλ‹€. 

➑️ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 비동기 방식을 μ‚¬μš© ( μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€λ ˆλ“œκ°€ 1개) 

 

비동기

- 동기적이지 μ•Šλ‹€, μž‘μ—…μ„ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμŒ

- μ—¬λŸ¬ 개의 μž‘μ—…μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μ•žμ„  μž‘μ—…μ΄ μ’…λ£Œλ˜μ§€ μ•Šμ•„λ„ 기닀릴 ν•„μš” 없이 λ‹€λ₯Έ μž‘μ—…μ„ λ™μ‹œμ— μ§„ν–‰μ‹œν‚€λŠ” 것이 κ°€λŠ₯

console.log(1);

setTimeout(()=>{
   console.log(2);
},3000);

console.log(3);

// 1 
// 3
// 2

 

Q. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹±κΈ€ μŠ€λ ˆλ“œλΌκ³  ν–ˆλŠ”λ° μ–΄λ–»κ²Œ λ™μ‹œμ— μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ”κ°€?

A. 비동기 μž‘μ—…λ“€μ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ•„λ‹Œ 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) : 비동기 μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ 마무리 된 μƒνƒœ

- μ‹€νŒ¨ (Rejected) : 비동기 μž‘μ—…μ΄ μ‹€νŒ¨ν•œ μƒνƒœ

function add10(num){
	const promise = new Promise((resolve,reject) => {
	// 비동기 μž‘μ—… μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜
	// executor
    
    setTimeout(()=>{
        if(typeof num==="number"){
        	resolve(num+10); // Promise 객체의 μƒνƒœ => 성곡
        }
        else {
        	reject("num 이 μˆ«μžκ°€ μ•„λ‹™λ‹ˆλ‹€."); // μ‹€νŒ¨
        }
    },2000);
   });
   
   return promise;
}

// then λ©”μ„œλ“œ , 비동기 μž‘μ—…μ΄ μ„±κ³΅ν–ˆμ„ λ•Œλ§Œ μˆ˜ν–‰
// => κ·Έ 후에
add10(0)
	.then((result)=> {
    	console.log(result);
       	retrun add10(result);
    })
	.then((result)=> {
    	console.log(result);
       	return add10(undefined);
    })
	.then((result)=> {
    	console.log(result);
    })
	.catch((error) => {
    	console.log(error);
    });

 

3. async / await 

// async 
// μ–΄λ–€ ν•¨μˆ˜λ₯Ό 비동기 ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” ν‚€μ›Œλ“œ
// ν•¨μˆ˜κ°€ ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ λ³€ν™˜ν•΄μ£ΌλŠ” 그런 ν‚€μ›Œλ“œ

async function getData() {
	return new Promise((resolve, reject) => {
    	setTimeout(()=> {
        	resolve({
            	name:"μ΄μ •ν™˜",
                id:"winterlood",
            });
        },1500);
    });
}


// await 
// async ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•œ ν‚€μ›Œλ“œ
// 비동기 ν•¨μˆ˜κ°€ λ‹€ 처리되기λ₯Ό κΈ°λ‹€λ¦¬λŠ” μ—­ν• 
// then λ©”μ†Œλ“œλ₯Ό μ“Έ ν•„μš” μ—†μŒ

async function printData() {
	const data = await getData();
	console.log(data);
}

printData();

 


좜처

 

ν•œ μž… 크기둜 잘라 λ¨ΉλŠ” λ¦¬μ•‘νŠΈ(React.js) : κΈ°μ΄ˆλΆ€ν„° μ‹€μ „κΉŒμ§€

'πŸ–₯️Web > JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μžλ°”μŠ€ν¬λ¦½νŠΈ 심화  (0) 2025.09.16
var 와 let κ³Ό const  (2) 2025.06.17
λ³€μˆ˜(Variable) λž€?  (0) 2025.06.16