Skip to main content

ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ํšจ๋นˆ2025๋…„ 3์›” 26์ผAbout 2 minJavaScriptArticle(s)blogyozm.wishket.comjsjavascript

ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ

JavaScript > Article(s)

Article(s)

ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด โ€˜๋น„๋™๊ธฐโ€™๋ผ๋Š” ๊ฐœ๋…์„ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐœ๋…์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋ ค๋ฉด, ๋™๊ธฐ(Synchronous)์™€ ๋น„๋™๊ธฐ(Asynchronous)์˜ ์ฐจ์ด๋ฅผ ๋จผ์ € ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•, setTimeout, Promise, async/await ๋“ฑ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๋ฉด, ์™œ ๋น„๋™๊ธฐ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ด ์˜ค๊ธฐ ์‹œ์ž‘ํ•  ๊ฒ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋น„๋™๊ธฐ์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด โ€˜๋น„๋™๊ธฐโ€™๋ผ๋Š” ๊ฐœ๋…์„ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ API๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋น„๋™๊ธฐ๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด์ฃ . ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ๋งŽ์•„, โ€œ์ด๊ฑฐ ๋Œ€์ฒด ์™œ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜์ง€?โ€๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐœ๋…์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋ ค๋ฉด, ๋™๊ธฐ(Synchronous)์™€ ๋น„๋™๊ธฐ(Asynchronous)์˜ ์ฐจ์ด๋ฅผ ๋จผ์ € ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•, setTimeout, Promise, async/await ๋“ฑ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๋ฉด, ์™œ ๋น„๋™๊ธฐ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ด ์˜ค๊ธฐ ์‹œ์ž‘ํ•  ๊ฒ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋น„๋™๊ธฐ์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ผญ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ์ฐจ์ด๋ฅผ ์‚ดํŽด๋ณด๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•„์š”๋กœํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

console.log("์ž‘์—… 1 ์‹œ์ž‘");
console.log("์ž‘์—… 2 ์‹œ์ž‘");
console.log("์ž‘์—… 3 ์‹œ์ž‘");

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ฝ”๋“œ๊ฐ€ ์œ„์—์„œ ์•„๋ž˜๋กœ, ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— โ€œ์ž‘์—… 1 ์‹œ์ž‘โ€, โ€œ์ž‘์—… 2 ์‹œ์ž‘โ€, โ€œ์ž‘์—… 3 ์‹œ์ž‘โ€์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ โ€œ๋™๊ธฐ ์ฒ˜๋ฆฌโ€์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…(์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ํŒŒ์ผ ์ฝ๊ธฐ ๋“ฑ)์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

console.log("์ž‘์—… 1 ์‹œ์ž‘");
sleep(5000); // 5์ดˆ ๋™์•ˆ ๋ฉˆ์ถ”๋Š” ํ•จ์ˆ˜(์˜ˆ์‹œ)
console.log("์ž‘์—… 2 ์‹œ์ž‘");
console.log("์ž‘์—… 3 ์‹œ์ž‘");

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด, sleep(5000) ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” 5์ดˆ ๋™์•ˆ์€ ์•„๋ฌด๋Ÿฐ ์ž‘์—…๋„ ํ•  ์ˆ˜ ์—†๊ฒ ์ฃ . ์ฆ‰, ์ž‘์—… 2์™€ ์ž‘์—… 3์ด ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , 5์ดˆ ๋™์•ˆ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉˆ์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๋‹จ์ ์€ ํ•œ ์ž‘์—…์ด ๋๋‚˜์•ผ๋งŒ, ๋‹ค์Œ ์ž‘์—…์ด ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ์žˆ์œผ๋ฉด ์ „์ฒด์ ์ธ ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์ง€์—ฐ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์งˆ๊นŒ์š”?

console.log("์ž‘์—… 1 ์‹œ์ž‘");

setTimeout(() => {
    console.log("์ž‘์—… 2 ์‹œ์ž‘");
}, 5000); // 5์ดˆ ํ›„ ์‹คํ–‰

console.log("์ž‘์—… 3 ์‹œ์ž‘");

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, โ€œ์ž‘์—… 1 ์‹œ์ž‘โ€, โ€œ์ž‘์—… 3 ์‹œ์ž‘โ€, ๊ทธ๋ฆฌ๊ณ  5์ดˆ ํ›„์— โ€œ์ž‘์—… 2 ์‹œ์ž‘โ€์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” setTimeout๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ธด ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ๋จผ์ € ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ฆ‰, setTimeout ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ํ›„ 5์ดˆ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ, ๋‹ค์Œ ์ฝ”๋“œ์ธ โ€œ์ž‘์—… 3 ์‹œ์ž‘โ€์ด ๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด์ฃ .

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋น„๋™๊ธฐ์™€ ๋™๊ธฐ ๋ฐฉ์‹์˜ ์ฐจ์ด๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด ๋ณด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

1. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(Single Thread)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์–ด๋– ํ•œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ, ํŠนํžˆ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ํ๋ฆ„์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ž€ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

๋‹ค์‹œ ๋งํ•ด ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” CPU๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ, ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(Multi Thread) ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๋น„๊ตํ•ด์„œ ๋ณด๋ฉด, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์ด ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์™œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ผ๊นŒ์š”?

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฃผ๋กœ UI๋ฅผ ์กฐ์ž‘ํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— DOM์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น์ฒ˜๋Ÿผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž‘์—…์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

๋™๊ธฐ ๋ฐฉ์‹์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, ์‹คํ–‰ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…(์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ํŒŒ์ผ ์ฝ๊ธฐ ๋“ฑ)์ด ์žˆ๋‹ค๋ฉด, ์ „์ฒด์ ์ธ ์ฝ”๋“œ ์‹คํ–‰์ด ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค.

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

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

๋ฐ˜๋ฉด, ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ด๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ์ž‘์—…๋“ค์ด ์™„๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์š”์†Œ๋“ค์ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ์žˆ๋”๋ผ๋„ ์ „์ฒด์ ์ธ ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์— ๋กœ๋”ฉ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ 2์ดˆ ํ›„์— ํ…์ŠคํŠธ๊ฐ€ ๋จผ์ € ๋ณด์ด๊ณ , ๊ทธ๋‹ค์Œ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ด๋ฏธ์ง€๊ฐ€ 4์ดˆ ํ›„์— ๋‚˜ํƒ€๋‚˜์ฃ . ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ž‘์—…์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณผ๊ฒŒ์š”.


setTimeout

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

1. ๋ฉ”์„œ๋“œ ์‚ดํŽด๋ณด๊ธฐ

setTimeout์„ ํ™œ์šฉํ•˜๋ฉด, ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ํŠน์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, setTimeout์„ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„, ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ํŠน์ • ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

setTimeout ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

setTimeout(callback, delayTime);

์—ฌ๊ธฐ์„œ callback์€ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋๋‚œ ์ดํ›„ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ, delayTime์€ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ setTimeout ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์—…์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

3์ดˆ ํ›„์— โ€œ3์ดˆ ํ›„ ์‹คํ–‰โ€์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ์ž‘์„ฑํ•ด ๋ณผ๊ฒŒ์š”.

console.log("์‹œ์ž‘");

setTimeout(() => {
    console.log("3์ดˆ ํ›„ ์‹คํ–‰");
}, 3000);

console.log("์ข…๋ฃŒ");

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, setTimeout ํ•จ์ˆ˜์˜ callback ํ•จ์ˆ˜๋กœ๋Š” console.log(โ€œ3์ดˆ ํ›„ ์‹คํ–‰โ€);์„, delayTime์œผ๋กœ๋Š” 3,000ms๋ฅผ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ œ์ผ ๋จผ์ € โ€œ์‹œ์ž‘โ€์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ๊ทธ๋‹ค์Œ์œผ๋กœ๋Š” โ€œ์ข…๋ฃŒโ€ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ”๋“œ ์‹คํ–‰ 3์ดˆ ํ›„์— โ€œ3์ดˆ ํ›„ ์‹คํ–‰โ€์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ setTimeout ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์‹คํ–‰ ํ๋ฆ„์„ ์ง€์—ฐ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ๋„, ๋น„๋™๊ธฐ์ ์œผ๋กœ ํŠน์ • ์‹œ์ ์— ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ

setTimeout๊ณผ ๊ฐ™์€ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ๊ฐ„๋‹จํ•œ ์ž‘์—…์—์„œ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์ฝœ๋ฐฑ ์ง€์˜ฅ(Callback Hell) ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ์กฐ๊ธˆ ๋” ๊ตฌ์กฐ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๋ฏธ์Šค(Promise)๋ผ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ๋Š” ์ด์ „ ์ž‘์—…์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋‹ค์Œ ์ž‘์—…์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž‘์—…์€ ํ•ญ์ƒ ์ž‘์—… ์ฒ˜๋ฆฌ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ณ , ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ์—๋Š” ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ๋ณด๋‹ค๋Š” ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ ๋™์ž‘ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ๋ฒ•

ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋Š” new ํ‚ค์›Œ๋“œ์™€ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ, ์ธ์ˆ˜๋กœ executor๋ผ๋Š” ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์‹คํ–‰ ํ•จ์ˆ˜์—๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ resolve์™€ reject๋ผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ด…์‹œ๋‹ค.

const executor = (resolve, reject) => {
    //์ฝ”๋“œ
};

const promise = new Promise(executor);
console.log(promise); // Promise{<pending>}

์œ„์˜ ์ฝ”๋“œ์—์„œ executor ์‹คํ–‰ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž์— ๋ฐ˜๋“œ์‹œ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ๊ณผ ๋™์‹œ์— executor ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , executor์—์„œ ์›ํ•˜๋Š” ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ๋Š” ์ด์ „ ์ž‘์—…์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ž‘์—…์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ž‘์—…์€ ํ•ญ์ƒ ์ž‘์—… ์ฒ˜๋ฆฌ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋Š”๋ฐ์š”. ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

2. resolve์™€ reject

ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ executor๋Š” ์ž‘์—… ์ฒ˜๋ฆฌ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์„ฑ๊ณตํ–ˆ์„ ๋• resolve๋ฅผ, ์‹คํŒจํ–ˆ์„ ๋• reject๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋Š” state์™€ result๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. resolve์™€ reject ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ธ์ง€ ์‚ดํŽด๋ณด๊ณ , ์ž‘์—… ์ฒ˜๋ฆฌ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ state์™€ result ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ๋ฐ”๋กœ executor ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์ด๋•Œ state ๊ฐ’์€ pending, result ๊ฐ’์€ undefined๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋งŒ์•ฝ ํŠน์ • ์ž‘์—…์ด ์„ฑ๊ณตํ•ด์„œ resolve ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, state๋Š” fulfilled์˜ ๊ฐ’์„ ๊ฐ–๊ณ , result๋Š” resolve ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ value์˜ ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ํŠน์ • ์ž‘์—…์ด ์‹คํŒจํ•ด์„œ reject ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค๋ฉด state๋Š” rejected, ์ฆ‰, ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด ๊ทธ๋ฆฌ๊ณ  result์—๋Š” error๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ 3์ดˆ ํ›„์— โ€œ์„ฑ๊ณตโ€์„ ์ „๋‹ฌํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ resolve๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์„ฑํ•ด ๋ณด๊ณ , ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” โ€œ์‹คํŒจโ€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ reject๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•ด ๋ด…์‹œ๋‹ค.

const executor = (resolve, reject) => {
  setTimeout(() => {
    resolve('์„ฑ๊ณต');
    reject('์‹คํŒจ');
  }, 3000);
};

const promise = new Promise(executor);

ํŠน์ • ์ž‘์—…์„ 3์ดˆ ๋’ค์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์‹คํ–‰ ํ•จ์ˆ˜ executor ๋‚ด๋ถ€์—๋Š” setTimeout ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , delayTime์œผ๋กœ 3,000ms๋ฅผ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  setTimeout ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์— resolve ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ โ€œ์„ฑ๊ณตโ€์„ ์ถœ๋ ฅํ•˜๊ณ , reject ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ โ€œ์‹คํŒจโ€๋ฅผ ์ถœ๋ ฅํ•œ ๋‹ค์Œ, ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , promise ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ฒˆ์—๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด ๋ณผ๊นŒ์š”? resolve์™€ reject ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const executor = (resolve, reject) => {
  setTimeout(() => {
    resolve('์„ฑ๊ณต');
    reject('์‹คํŒจ');
  }, 3000);
};

const promise = new Promise(executor);
promise.then(
  (result) => {
    console.log(result);
  },
  (error) => {
    console.log(error);
  }
);

์ด์ฒ˜๋Ÿผ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์—๋Š” then()์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. then ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. then ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ fulfilled ์ƒํƒœ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ด๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๊ฐ€ rejected ์ƒํƒœ์ผ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•œ๋‹ค๋ฉด, ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด โ€˜์„ฑ๊ณตโ€™์ด ์ถœ๋ ฅ๋˜๊ณ , ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํŒจ๋œ๋‹ค๋ฉด โ€˜์‹คํŒจโ€™๋ผ๋Š” ๊ฐ’์ด ์ถœ๋ ฅ๋˜๊ฒ ๋„ค์š”. ๋น„๋™๊ธฐ ์ž‘์—…์€ ์ˆœ์ฐจ์ ์ธ ์ž‘์—…์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณตํ•  ์ˆ˜๋„, ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋” ํšจ๊ณผ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋งˆ์น˜๋ฉฐ

๊ธ€์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด์„œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ๋ฐฉ์‹์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ๋ฉˆ์ถ”๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” setTimeout๊ณผ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ดค๋Š”๋ฐ์š”. setTimeout์€ ํŠน์ • ์‹œ๊ฐ„ ํ›„์— ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ, ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์™„๋ฃŒ ๋ฐ ์‹คํŒจ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋”์šฑ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด, ๋‹ค์Œ ๊ธ€์—์„œ ๋‹ค๋ฃจ๊ฒŒ ๋  ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ โ€œ์ฝœ๋ฐฑ ์ง€์˜ฅโ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ , async/await๊ณผ ๊ฐ™์€ ์ตœ์‹  ๋น„๋™๊ธฐ ๋ฐฉ์‹๋„ ์‰ฝ๊ฒŒ ์ตํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ง ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ์— ๋Œ€ํ•ด ์ „๋ถ€ ๋‹ค๋ฃจ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์Œ ๊ธ€์—์„œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ๊นŠ์ด ๋ฐฐ์›Œ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด๋ž€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  async/await ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ 

ํ”„๋ผ๋ฏธ์Šค
๋ณธ์ธ์„ ์•„์ฃผ ์œ ๋ช…ํ•œ ๊ฐ€์ˆ˜๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํƒ‘ ๊ฐ€์ˆ˜์ธ ๋ณธ์ธ์ด ๋ฐค, ๋‚ฎ์œผ๋กœ ๋‹ค์Œ ์‹ฑ๊ธ€ ์•จ๋ฒ”์ด ์–ธ์ œ ๋‚˜์˜ค๋Š”์ง€ ๋ฌผ์–ด๋ณด๋Š” ํŒฌ๋“ค์„ ์ƒ๋Œ€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ด ๋ด…์‹œ๋‹ค.
์›น ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฒซ๊ฑธ์Œ ๊ฐ•์˜ | ํšจ๋นˆ Hyobin - ์ธํ”„๋Ÿฐ
ํšจ๋นˆ Hyobin | ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ํฌ๋งํ•œ๋‹ค๋ฉด? ์นœ์ ˆํ•˜๊ณ  ๊ผผ๊ผผํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ•์˜๋กœ ์ฒซ๊ฑธ์Œ์„ ๋‚ด๋”›์–ด๋ณด์„ธ์š”โœจ
Introducing asynchronous JavaScript - Learn web development | MDN
In this article, we'll explain what asynchronous programming is, why we need it, and briefly discuss some of the ways asynchronous functions have historically been implemented in JavaScript.
ํ•œ ๋ฒˆ์— ์ดํ•ดํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด โ€˜๋น„๋™๊ธฐโ€™๋ผ๋Š” ๊ฐœ๋…์„ ์ž์ฃผ ์ ‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐœ๋…์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋ ค๋ฉด, ๋™๊ธฐ(Synchronous)์™€ ๋น„๋™๊ธฐ(Asynchronous)์˜ ์ฐจ์ด๋ฅผ ๋จผ์ € ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•, setTimeout, Promise, async/await ๋“ฑ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๋ฉด, ์™œ ๋น„๋™๊ธฐ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฐ์ด ์˜ค๊ธฐ ์‹œ์ž‘ํ•  ๊ฒ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋น„๋™๊ธฐ์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.