[๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ปTA9 ์ธํ„ด 63์ผ์ฐจ]๋™๊ธฐ, ๋น„๋™๊ธฐ,๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ข…๋ฅ˜

Goofiยท2023๋…„ 9์›” 19์ผ
0

๋™๊ธฐ

ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ task๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ ๊นŒ์ง€, ๋‹ค์Œ task๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹

  • ๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์‹คํ–‰, ์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ
  • ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ task๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ task๊ฐ€ ์‹คํ–‰์ด ์•ˆ๋œ๋‹ค๋Š”๊ฒŒ ๋ฌธ์ œ = ๋ธ”๋กœํ‚น(blocking)

๋ธ”๋กœํ‚น

์ž‘์—…์ด ์ค‘๋‹จ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
์ฆ‰, ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์—์„œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๊ณ  ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ์ผ์„ ์ค‘๋‹จํ•œ ์ƒํƒœ๋กœ ๋Œ€๊ธฐํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ ์–ธ์–ด์ด๋‹ค.
ํ•œ์ค„์”ฉ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

2๏ธโƒฃ ๋น„๋™๊ธฐ

ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„, ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

  • ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ task๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„, ๋‹ค์Œ task๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • task์˜ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ task๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Single Thread ์–ธ์–ด์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” task๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Blocking(์ž‘์—… ์ค‘๋‹จ)ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://adrianmejia.com/asynchronous-vs-synchronous-handling-concurrency-in-javascript/

setTimeout ๋น„๋™๊ธฐ ํ•จ์ˆ˜

ํ•˜์ง€๋งŒ... ์ž๋ฐ”์Šค๋ฆฝ๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์ธ๋ฐ ์™œ setTimeout์ด ๋จนํžˆ๋ƒ?
๊ฒฐ๋ก  Web APIs๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํ•ด์ค€๋‹ค. ๋ธŒ๋ผ์šฐ์ €์•ˆ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„๋งŒ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ Web API๋„ ์žˆ๋‹ค. ์›น API ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์™€๋Š” ๋ณ„๊ฐœ๋กœ ์—ฌ๋Ÿฌ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์•„๋‹ˆ๋ผ ๋ณ„๋„์˜ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋œ๋‹ค. ์ด ํ™˜๊ฒฝ์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋‹ค.

3๏ธโƒฃ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ข…๋ฅ˜

1. AJAX(Asynchronous JavaScript And XML)

์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด XMLHttpRequest๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ.

  • JSON, XML, HTML ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํ˜•์‹ ๋“ฑ์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํฌ๋งท์„ ๊ตํ™˜ ๊ฐ€๋Šฅ
  • ๋น„๋™๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ต์‹  ๋ฐฉ์‹
  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์›นํŽ˜์ด์ง€๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ํ™”๋ฉด ์ „์ฒด๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํŽ˜์ด์ง€ ์ผ๋ถ€๋งŒ์„ ๊ฐฑ์‹ ํ•˜๊ณ ๋„ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

2. ์ฝœ๋ฐฑํ•จ์ˆ˜

ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜์ผ ๋•Œ, ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ํ•จ์ˆ˜

๊ตฌ์กฐ

let val = function(๐Ÿ‘){
		return ๐ŸŽ
    }
function fn(arg){
	arg()
}

fn(val)

valํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€๋Š” ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜์–ด์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์˜ํ•ด์„œ ๋‚˜์ค‘์— ํ˜ธ์ถœ๋œ๋‹ค๋ผ ํ•ด์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ฝœ๋ฐฑ์ง€์˜ฅ(callback hell)

ํ•จ์ˆ˜ ์•ˆ์— ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ค€์ด ๊ฐ๋‹นํ•˜๊ธฐ ํž˜๋“ค ์ •๋„๋กœ ๊นŠ์–ด์ง€๋Š” ํ˜„์ƒ

์˜ˆ์ œ)

timer(1000,function(){
    console.log('์ž‘์—…');
    timer(1000,function(){
        console.log('์ž‘์—…');
        timer(1000,function(){
            console.log('์ž‘์—…');
        });
    });
});

3. Promise

Promise๊ฐ์ฒด๋Š” javascript์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

  • ES6 ๋“ฑ์žฅํ•œ Promise๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ณด๋‹ค ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์ˆœ์„œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • Promise๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์ด๋ฉฐ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ์ดํ›„ ๋‹ค์Œ ์ž‘์—…์„ ์—ฐ๊ฒฐ์‹œ์ผœ ์ง„ํ–‰ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

Promise ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

๊ธฐ๋ณธ ํ˜•ํƒœ

const myPromise = new Promise((resolve, reject)=>{
	//๊ตฌํ˜„ ..
})

promise๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ”„๋กœ๋ฏธ์Šค ์•ˆ์—์žˆ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

Promise ํ˜ธ์ถœ ๊ณผ์ •

  1. ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋•Œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์„ฑ๊ณตํ•˜๋ฉด resolve ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  2. ์ด๋•Œ resolve ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ ํ•˜๋Š”๋ฐ, ์ด ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋Š” Promise ๊ฐ์ฒด์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  3. ๋งŒ์•ฝ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ•˜๋ฉด reject ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ์ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” Promise ๊ฐ์ฒด์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ์—๋Š” ๋Œ€ํ‘œ์ ์ธ then(Promise ๋ฐ˜ํ™˜)๊ณผ catch(์˜ˆ์™ธ)๊ฐ€ ์žˆ๋‹ค.

Promise์˜ 3๊ฐ€์ง€ ์ƒํƒœ(states)

ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์ด ๋ฐ”๋กœ ํ”„๋กœ๋ฏธ์Šค ์ƒํƒœ(states)์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ƒํƒœ๋ž€ ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. new Promise()๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ 3๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

  • Pending(๋Œ€๊ธฐ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ
  • Fulfilled(์ดํ–‰) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€ ์ƒํƒœ
  • Rejected(์‹คํŒจ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํƒœ

Pending(๋Œ€๊ธฐ)

new Promise() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋Œ€๊ธฐ(Pending) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

new Promise()
new Promise(function(resolve,reject){
	//...
})

Fulfilled(์ดํ–‰)

์—ฌ๊ธฐ์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ธ์ž resolve๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด ์ดํ–‰(Fulfilled) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

new Promise(function(resolve, reject){
	resolve();
})
function getData(){
	return new Promise(function(resolve, reject){
		let data = 100;
      	resolve(data);
	})
}

//resolve()์˜ ๊ฒฐ๊ณผ ๊ฐ’ data๋ฅผ resolvedData๋กœ ๋ฐ›์Œ
getData().then(function(resolvedData){
	console.log(resolvedData); //100
});

ํ”„๋กœ๋ฏธ์Šค์˜ '์ดํ–‰' ์ƒํƒœ๋ฅผ ์ข€ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•ด๋ณด๋ฉด '์™„๋ฃŒ' ์ž…๋‹ˆ๋‹ค.

Rejected(์‹คํŒจ)

new Promise()๋กœ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ธ์ž๋กœ resolve์™€ reject๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ reject๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋ฉด ์‹คํŒจ(rejected) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

new Promise(function(resolve, reject){
	reject();
})

๊ทธ๋ฆฌ๊ณ , ์‹คํŒจ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์‹คํŒจํ•œ ์ด์œ (์‹คํŒจ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ ๊ฐ’)๋ฅผ catch()๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

getData().then().catch(function(err){
	console.log(err);
})

4. fetch()

fetch()๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹  ํ•จ์ˆ˜์ด๋ฉฐ ๋Œ€ํ‘œ์ ์œผ๋กœ Promise ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
fetch()์˜ Return ๊ฐ’์€ Promise ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋ฆฌํ„ดํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด Promise ๋ฐ์ดํ„ฐํƒ€์ž…์€ response Object๋ฅผ ๋Œ๋ ค์ค„ ๊ฒƒ์ด๋‹ค.

  • fetch()๊ฐ€ ๋ฆฌํ„ดํ•œ ๊ฐ’(promise ๊ฐ์ฒด)์€ then(),catch()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • then()
      ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์„ ๋•Œ ์ž‘๋™.
      • then() ํ•จ์ˆ˜ ์•ˆ์—๋Š” callback()๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
      • callback() ์•ˆ์—๋Š” ์‘๋‹ต์„ ๋ฐ›์•˜์„ ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ.
      • ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋๋‹ค๋ฉด response์—๋Š” fetch()์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.
    • catch()
      ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ž‘๋™
      • catch()์—๋Š” callback()๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
      • ๋น„๋™๊ธฐ ์ž‘์—…์— ์‹คํŒจํ–ˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ
      • err์—๋Š” ์—๋Ÿฌ ๊ด€๋ จ ์ •๋ณด๋“ค์ด ๋“ค์–ด์žˆ๋‹ค.

.then(function(response){ })
response ํŒŒ๋ผ๋ฏธํ„ฐ์— ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด(์„œ๋ฒ„์™€ ํ†ต์‹ ๊ฒฐ๊ณผ,์„œ๋ฒ„์™€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต์‹ ํ–ˆ๋Š”์ง€ ๋“ฑ)๊ฐ€ ์ €์žฅ ๋˜์–ด์žˆ๋‹ค.

response.json()

  1. api๋ฌธ์„œ์— ์žˆ๋Š” ํ…์ŠคํŠธ๋ฅผ json๋ฐ์ดํ„ฐํƒ€์ž…์ด๋ผ๋Š” ๊ฒƒ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.
  2. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” json๋ฐ์ดํ„ฐํƒ€์ž…์— ๋งž๊ฒŒ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋Œ๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค.
  3. response.json ๋ฆฌํ„ด๊ฐ’์€ promise๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
  4. ๊ฒฐ๋ก  : response.json()์€ promise์ด๋‹ค.
  5. ๋ฐ˜ํ™˜๋œ promise ์—ญํ• ์€ jsonํ…์ŠคํŠธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐํƒ€์ž…์œผ๋กœ ์ปจ๋ฒ„ํŒ…ํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค์ด๋‹ค.
  6. ์ด ํ”„๋กœ๋ฏธ์Šค๋Š” ์ปจ๋ฒ„ํŒ…์ž‘์—…์ด ๋๋‚ฌ์„๋•Œ then์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  7. response.json()์€ promise์ด๋ฏ€๋กœ then์„ ์‚ฌ์šฉ๊ฐ€๋Šฅ

promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

Nested๋ฐฉ์‹

promise๋Š” then()์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— then()์•ˆ์— ๋˜ then()์ด ๋“ค์–ด๊ฐ€๊ณ  ๋‹ค์‹œ ๋˜ then()์ด ๋“ค์–ด๊ฐ€๋Š” ๋ฐฉ์‹

fetch("https://jsonplaceholder.typicode.com/posts")
  .then(function (response) {
    response.json().then(function (data) {
      console.log("data", data);
    });
  })
  .catch(function (reason) {
    console.log("reason", reason);
  });

chaining๋ฐฉ์‹

then()์•ˆ์—์„œ promise๋ฅผ return ํ•˜๊ณ  ๋ฐ”๊นฅ์ชฝ์—์„œ๋Š” ๋‚ด๋ถ€ then()๊ณผ ์™ธ๋ถ€ then()์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

fetch("https://jsonplaceholder.typicode.com/posts")
  .then(function (response) {
    return response.json();
  })
  .catch(function (response) {
    console.log("response", response);
  })
  .then(function (data) {
    console.log("data", data);
  });

โ—๏ธ๋‘˜๋‹ค ์žฅ๋‹จ์ ์ด ์žˆ์ง€๋งŒ chaining๋ฐฉ์‹์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

5. async & await

๋น„๋™๊ธฐํ•จ์ˆ˜ timer ์‹ค์Šต


function timer(time) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(time);
    }, time);
  });
}

timer(1000)
  .then(function (time) {
    //1000์€ time์ธ์ž์— ๋“ค์–ด๊ฐ„๋‹ค.
    console.log("time:" + time);
    return timer(time + 1000);
  })
  .then(function (time) {
    console.log("time:" + time);
    return timer(time + 1000);
  })
  .then(function (time) {
    console.log("time:" + time);
  });

React ํ™˜๊ฒฝ then

//fetch ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
const [coins, setCoins] = useState([]);
useEffect(() => {
  fetch("https://api.coinpaprika.com/v1/tickers?limit=10")
    .then((response) => response.json())
    .then((json) => setCoins(json));
  setLoading(false);
}, []);
//useEffectํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ๋ฒˆ๋งŒ ํ†ต์‹ ํ•˜๊ฒŒ ํ•œ๋‹ค.
//fetch๋กœ ์–ป์–ด์˜จ ๋ฐ์ดํ„ฐ๊ฐ’ response๊ฐ’์„ response.json()์„ ์ด์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜.
//๋ณ€ํ™˜๋œ ๊ฐ์ฒด๊ฐ’์„ setCoins๋ณ€์ˆ˜์— ๋„ฃ์–ด state๊ฐ’์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค.

async & await

async์™€ await๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด ์ค‘ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋‚˜์˜จ ๋ฌธ๋ฒ•์ด๋‹ค.

  • Promise Chaining ๋ฐฉ์‹์œผ๋กœ .then()์„ ์—ฐ์‡„์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋‹ค๋ณด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ช‡๋ฒˆ์งธ then์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๊ฑด์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • .then()๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ES7์— async & await์ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด๋‹ค.
  • async & await์„ ์‚ฌ์šฉํ•˜๋ฉด await์ด ๋Œ€๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— .then()์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ๋˜ promise์—์„œ ์‚ฌ์šฉํ•œ๋˜ .catch ๋Œ€์‹  try/catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์ƒ๊ธด๋‹ค.
  • async & await์„ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

async

  • ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • ํ•จ์ˆ˜ ์•ž์— ๋ถ™์ด๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” promise๋ฅผ return ํ•œ๋‹ค.

await

  • ๋น„๋™๊ธฐ์ ์ธ ํ•จ์ˆ˜ ์•ž์— ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • await๊ฐ€ ๋ถ™์–ด์žˆ๋Š” promise๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์•ˆ์— ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ณ  ๊ทธ ํ•จ์ˆ˜๋Š” ์•ž์— async๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์‹ค์Šต1)

function timer(time) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(time);
    }, time);
  });
}


async function run() {
  var time = await timer(1000);
  console.log("time:" + time);
  time = await timer(time + 1000);
  console.log("time:" + time);
  time = await timer(time + 1000);
  console.log("time:" + time);
}

run();

์‹ค์Šต2)

function timer(time) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(time);
    }, time);
  });
}
async function run() {
  console.log("start");
  var time = await timer(1000);
  console.log("time:" + time);
  time = await timer(time + 1000);
  console.log("time:" + time);
  time = await timer(time + 1000);
  console.log("time:" + time);
  console.log("end");
}

async function run2() {
  console.log("parent start");
  await run();
  console.log("parent end");
}
run2();

//์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.

//console.log(run()); -> promise ๋ฆฌํ„ด -> ์ด๋ง์€ run()์•ž์—๋„ await์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
/*
๊ฒฐ๋ก  : async๋Š” ํ‰๋ฒ”ํ•œ ํ•จ์ˆ˜๋ฅผ promise๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋น„๋™๊ธฐ์ ์ธ ํ•จ์ˆ˜๋กœ
๋งŒ๋“ค์–ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ์ด๊ณ  ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์•ˆ์—์„œ๋Š” await ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
*/

์‹ค์Šต3)

async & await & .then() ๋ณ‘ํ–‰ ํ™œ์šฉ

async function run() {
  console.log("start");
  var time = await timer(1000);
  console.log("time: " + time);
  time = await timer(time + 1000);
  console.log("time: " + time);
  time = await timer(time + 1000);
  console.log("time: " + time);
  console.log("end");
  return time;
  // asyncํ•จ์ˆ˜์— return๊ฐ’์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค๋ฉด run2()ํ•จ์ˆ˜ ์•ˆ time์— ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค.
}
async function run2() {
  console.log("parent start");
  var time = await run();
  console.log("time:" + time);
  console.log("parent end");
}
console.log("parent parent start");
run2().then(function () {
  console.log("parnet parent end");
});

๋ฐ˜๋ณตํ•ด์„œ async()ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ๋Š” ๋งˆ์ง€๋ง‰์— then()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์‹ค์ „)

promise๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์ธ fetch๋กœ ํ†ต์‹ ํ•˜์—ฌ await์„ ์ด์šฉํ•˜์—ฌ json๋ณ€์ˆ˜์— ๋„ฃ์–ด์ฃผ๊ณ  asyncํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์ฃผ์–ด jsonํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” json()์„ ์ด์šฉํ•˜์—ฌ getMovies ํ•จ์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

const getMovies = async () => {
  const json = await (
    await fetch(
      `https://yts.mx/api/v2/list_movies.json?minimum_rating=8.8&sort_by=year`
    )
  ).json();
};
/*
const getMovies = async () =>{
	const response = await fetch(`https://yts.mx/api/v2/list_movies.json?minimum_rating=8.8&sort_by=year`);
	const json = await response.json();
};
*/

๊ฒฐ๋ก 

  1. promise์™€ async & await์˜ ์ฐจ์ด์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ  ์จ์•ผํ•œ๋‹ค.
  2. ๋‘˜๋‹ค ๋น„๋™๊ธฐ ์‹คํ–‰์„ ํ•˜๊ธฐ์œ„ํ•œ ๋ฐฉ๋ฒ•
  3. ๋‘˜๋‹ค ๋น„๋™๊ธฐ ์‹คํ–‰ ๋  ๋‚ด์šฉ์„ ๋™๊ธฐ๊ฐ€์ง€๊ณ  ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด๋‹ค.
  4. async & await์€ catch๋ผ๊ณ  ํ•˜๋Š” ๊ตฌ๋ฌธ์„ ๋ณ„๋„๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ• ์ค‘ try, catch๋ฌธ์ด ์žˆ๋‹ค.
    try catch ๊ตฌ๋ฌธ ์•ˆ์— async & await ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ ๋„ฃ์–ด ๋†“์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด catch์—์„œ ์žก์•„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ
Promise ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
Promise states
์ฝœ๋ฐฑํ•จ์ˆ˜ - ์ƒํ™œ์ฝ”๋”ฉ
async & awiat - ์ƒํ™œ์ฝ”๋”ฉ
๋งŽ์ด ์ฐธ๊ณ ํ•œ ์ž๋ฃŒ

profile
์˜ค๋Š˜๋ณด๋‹จ ๋‚ด์ผ์ด ๊ฐ•ํ•œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค!!๐Ÿง‘๐Ÿปโ€๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€