
ํ ๋ฒ์ ์ดํดํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ
ํ ๋ฒ์ ์ดํดํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ด๋ จ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด โ๋น๋๊ธฐโ๋ผ๋ ๊ฐ๋ ์ ์์ฃผ ์ ํ๊ฒ ๋ฉ๋๋ค. ํนํ 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๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ๊น์ง ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฐธ๊ณ
