๐ ์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ '๋น๋๊ธฐ' ์๋ฒฝ ์ดํด โ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋๊ธฐ์ ๋น๋๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ ์ ์๋ค. ์ฆ, ์ด์ ์์ ์ด ์๋ฃ๋์ด์ผ ๋ค์ ์์ ์ ์ํํ ์ ์๊ฒ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ฉด์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ํจ์์ ์ฝ๋๋ค์ด ์์์ ์๋๋ก ์ฐจ๋ก๋ก ๋์ํ๋ ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์๋ค. ์ด๋ฌํ ์ฝ๋ ์์ฐจ ์คํ์ ๋๊ธฐ(Synchronous) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฐ๋ฐ ๋๊ธฐ ๋ฐฉ์์ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด์ง๋ง, ์์ ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์๋ต์ด ๋ฆ์ด์ง๋ ๊ฒฝ์ฐ์๋ ์ ์ฒด์ ์ธ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ์ค ์ ์๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ์๋ต์ ๋ฐ์์ผ ํ๋ ์์ ์ด ์๋ค๋ฉด, ์๋ต์ด ์ฌ ๋๊น์ง ๋ค๋ฅธ ์์ ์ ํ์ง ๋ชปํ๊ณ ๋๊ธฐํด์ผ ํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ด ๋ฉ์ถ๊ฑฐ๋ ์ง์ฐ๋๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฌ๋ฌ ์์
์ ๋์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋น๋๊ธฐ(Asynchronous) ๋ผ๋ ๊ฐ๋
์ ๋์
ํ์ฌ, ํน์ ์์
์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์
์ ๋์์ ์ํํ ์ ์๋๋ก ํ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฐฐ์ฐ๋ค ๋ณด๋ฉด setTimeout() ํจ์๋ fetch() ํจ์๋ฅผ ์ ํด๋ณผ ๊ฒ์ด๊ณ , ์ด๋ค์ ๋น๋๊ธฐ๋ก ๋์ํ๋ค๋ ์๋ฆฌ๋ฅผ ํ๋ฒ ์ฏค์ ๋ค์ด๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ๋น๋๊ธฐ๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์์
์ ๋ค๋ฅธ ๊ณณ์ ์ธ๊ฐํ์ฌ ์ฒ๋ฆฌ๋๊ฒ ํ๊ณ , ๊ทธ ์์
์ด ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ์ ์คํํ๋ ๋ฐฉ์์ผ๋ก, ์ฝ๊ฒ ๋งํด ์์
์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ฒญํ์ฌ ์ฒ๋ฆฌ๋๊ฒ ํ์ฌ ๋ฉํฐ๋ก ์์
์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋๋ค.
์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ์๋ต์ ๋ฐ์์ผ ํ๋ ์์ ์ด ์๋ค๋ฉด, ์๋ต์ด ์ค๋ ๊ฒ๊ณผ ์๊ด์์ด ๋ค๋ฅธ ์์ ์ ๊ณ์ ์ด์ด๋๊ฐ ๋ณ๋ ฌ๋ก ์์ ์ ๋์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ ธ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ด ๋ฉ์ถ๊ฑฐ๋ ์ง์ฐ๋์ง ์๊ฒ ๋๋ค. ๋ฐ๋ผ์ Task๋ค์ด ๋ณ๋ ฌ์ ์ผ๋ก ๋์์ ์ฒ๋ฆฌ๋๊ฒ ๋๊ณ ์ด ์ฝ๋ ์คํ ์๊ฐ์ ํ๊ธฐ์ ์ผ๋ก ์ค์ด๋ค๊ฒ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ํน์ง
๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ ์ฉ์ฑ
์๋ฅผ ๋ค์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ ์์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด ์์ ์ ๋ง์ผ ๋๊ธฐ์ ์ผ๋ก ์ํํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ต์ด ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด ์ด ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฏ๋ก, ๋๊ท๋ชจ ํธ๋ํฝ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
ํ์ง๋ง ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ต์ด ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์์๋ ๋ค๋ฅธ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋๋ค. ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ๊ทธ ์๊ฐ ๋์ ๋ค๋ฅธ ์์ ์ ํ ์ ์์ผ๋ฏ๋ก ์์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด, ๋๊ท๋ชจ ํธ๋ํฝ์์๋ ์์ ์ ์ผ๋ก ๋์ํ ์ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค.
๋ํ์ ์ผ๋ก ์น์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ Ajax ๊ธฐ์ ์ด ์๋ค. ๋ค๋ฅธ ์๋ฒ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ XMLHttpRequest ๊ฐ์ฒด๋ ํน์ fetch ๋ฉ์๋๋ก ์์ฒญ์ํ๊ฒ ํ๋๋ฐ, ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์์๋ ์ฌ์ฉ์์์ ์ธํฐ๋์
์ ์ ์งํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์๊ฒ ๋๋ค.
// fetch ํจ์์ URL ์ ๋ฌ
fetch("https://jsonplaceholder.typicode.com/todos/1")
.then(function(response) {
return response.json(); // ์๋ต์ JSON ํ์์ผ๋ก ๋ณํ
})
.then(function(data) {
console.log(data); // JSON ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
})
.catch(function(error) {
console.error(error); // ์๋ฌ๋ฅผ ์ถ๋ ฅ
});
๋น๋๊ธฐ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์๋ฆฌ
์๋ง ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ผ๋ฉด ํ์๋ก ์ตํ๋ ๊ฒ์ด ํธ์ถ ์คํ๊ณผ ์ด๋ฒคํธ ๋ฃจํ ์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ ๊ทธ๋ฆผ์ ๋๋น ์ง๊ฒ ๋ด์์ ๊ฒ์ด๋ค. ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๊ฐ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด์ Callback Queue์ ๋ด๊ธฐ๊ณ ๋ค์ ์ฑ๊ธ ์ค๋ ๋์ธ Call Stack์ ๋ด๊ฒจ์ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ ๋์ ์๋ฆฌ ๊น์ง๋ ์๋ง ๋๋ถ๋ถ์ ๊ฐ์์์ ์ ํด๋ณด๊ณ ๋์ด๊ฐ์ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด๋ผ๊ณ ํ๋๋ฐ ์ด๋ป๊ฒ ์์ (task)๋ค์ ๋์์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ ๊ฒ์ผ๊น?
์ด์ ๋ํด ์ ํํ ์ค๋ช ํ์ง ๋ชปํ๋ ๋ ์๋ถ๋ค์, ์๋ง ๋ค๋ฅธ ๊ณณ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ๋ฃจํ์ ํธ์ถ ์คํ ๊ณผ์ ์ ํ์ตํ๋๋ฐ ์์ด ๋์ ํ๋ฅ ๋ก Call Stack ์ฐ์ธก์ ์๋ Web APIs ์ ๋ํด์ ๋์ถฉ ๋ณด๊ณ ๋์ด๊ฐ์ ๊ฒ์ด๋ค. ์๋ํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ์ฝ ์คํ(Call Stack)์ ์ฑ๊ธ ์ค๋ ๋์ง๋ง, ์๋ฒ์๊ฒ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๊ฑฐ๋ ํ์ผ ์ ์ถ๋ ฅ ํน์ ํ์ด๋จธ ๋๊ธฐ ์์ ์ ์คํํ๋ Web APIs ๋ค์ ๋ฉํฐ ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์ ๋์ ์์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. (๋ฉํฐ ์ค๋ ๋๋ฅผ ์ ๋ชจ๋ฅธ๋ค๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์์ ์ฒ๋ฆฌ๋๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค)
Web API๋ ํ์ด๋จธ, ๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ ์ถ๋ ฅ, ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ๋ค์ํ API๋ฅผ ํฌ๊ดํ๋ API์ ์ด์นญ์ด๋ค. ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ค๋ฅด๊ฒ ์ง๋ง, ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ผ ๊ฒฝ์ฐ Web API๋ ๋ฉํฐ ์ค๋ ๋๋ก ๊ตฌํ๋์ด ์๋ค.
์ฆ, ๋ธ๋ผ์ฐ์ ๋ผ๋ ์ํํธ์จ์ด๊ฐ ๋ฉํฐ ์ค๋ ๋ ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ Web API์ ์์ ์ ์ฒ๋ฆฌํ์ฌ ๋์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
๋ง์ผ ์๋์ ๊ฐ์ด 3์ด๋ฅผ ๋๊ธฐํ๋ setTimeout ๋น๋๊ธฐ ํจ์์ ๊ทธ์ธ ์์ (Task)๋ค์ด ์๋ค๊ณ ํ๋ค๋ฉด, ์ด setTimeout ์ฝ๋๊ฐ Web APIs ๋ค ์ค ํ์ด๋จธ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ Timer API์ ๋์ด๊ฐ์ 3000ms ๋ฐ๋ฆฌ์ด๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋๋ฉด์, ๋์์ ๋ฉ์ธ ์ฝ ์คํ์ Task1, Task2 ... ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
setTimeout(() => {
console.log('5์ด ๋๊ธฐ ์๋ฃ')
}, 3000);
Task1();
Task2();
Task3();
์ ๋ฆฌํ์๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ฉํฐ์ค๋ ๋๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ ๋น๋๊ธฐ ํจ์๋ ์ด๋ฌํ ๋์์ ์ฒ๋ฆฌ ์์ ์๋ฆฌ ๋๋ถ์ ์ฐ๋ฆฌ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ํตํด ์ฑ๋ฅ ํฅ์์ ๋๋ฆด ์ ์์๋ ๊ฒ์ด์๋ค.
์ ์๋ฒฝํ ๋ฉํฐ ์ค๋ ๋ฉ์ด ์๋๊ฐ
setTimeout์ ์ด์ฉํด ๋น๋๊ธฐ์ ๋ฉํฐ ์์ ์ฒ๋ฆฌ๋ฅผ ์ค๋ช ํ์ง๋ง, ์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ๋ ์๋ฒฝํ ๋ฉํฐ ์ค๋ ๋ฉ์ด ์๋๋ค. ์๋ํ๋ฉด ํ์ด๋จธ 3000ms ๋ง ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌ๋๊ณ , ๊ทธ ์์ ์ฝ๋ฐฑ ํจ์ ์คํ ์ฝ๋๋ ์ถํ์ ์ด๋ฒคํธ ๋ฃจํ์ ์ธํด ์ฝ ์คํ(Call Stack)์ ๋ค์ด๊ฐ ์ฑ๊ธ ์ค๋ ๋๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
setTimeout ๋ฟ๋ง ์๋๋ผ fetch ๋น๋๊ธฐ ํจ์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์๋ฒ์ ์์ฒญํด์ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋ ํ๋ ๊ฒ์ ๋ฉํฐ ์ค๋ ๋๋ก ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ง๋ง, ์์ฒญ์ด ์๋ฃ๋๊ณ ๋์์ ํ์ฒ๋ฆฌ then ํธ๋ค๋ฌ์ ์ฝ๋ฐฑ ํจ์๋ ์ฝ ์คํ์ ๋ณ๋๋ก ์ฒ๋ฆฌ๋๋ค.
๋ณ๋ ฌ๋ก ๋์ ์ฒ๋ฆฌํ ๊บผ๋ฉด ์ ์ฒด๋ฅผ ์์ ํ ์ฒ๋ฆฌํ ๊ฒ์ด์ง ์ ์ด๋ฐ์์ผ๋ก ๋ฒ๊ฑฐ๋กญ๊ฒ ๋๋ ๊ฒ์ผ๊น?
์๋ง ์๋ฐ์ ๋ฉํฐ ์ค๋ ๋(Thread) ํ๋ก๊ทธ๋๋ฐ์ ํด๋ณด์ ๋ ์๋ถ๋ค์ ์ด์ ๋ํ ์ด์ ๋ฅผ ์๊ณ ์์ ๊ฒ์ด๋ค. ์์ ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ์ฑ๋ฅ ๋งํผ์ ์ด๋์ ์ป์์ ์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ํญ์ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ๋ผ์ synchronized ์ฒ๋ฆฌ๊ฐ ์๋ฐ๋๋ค๋ ์ฌ์ค ๋ง์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ๋ง ๋ฐฐ์ฐ์ ๋ถ๋ค์ ์ด์ ๋ํด ์ ์๋ฟ์ง ์์ ์ ์์ง๋ง, ์ด synchronized ์ฒ๋ฆฌ๋ฅผ ์๋ชปํ๋ฉด ์คํ๋ ค ์ฑ๋ฅ ๊ฐ์๊ฐ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๊ณ ๋์ด๋์ ์ง์๊ณผ ์ค๋ ฅ์ ์๊ตฌํ๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋์์ฑ ๋ฌธ์ ์ ๋ํด ์ฌํํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋น๋๊ธฐ ์ฝ๋ฐฑ ํจ์ ๋ฐฉ์์ ์ฑํํ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ์ด๋ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ฅผ ์ค๊ณํ ๊ณผ๊ฑฐ ๋น์์๋ ๋ฉํฐ ํ๋ก์ธ์ ์ปดํจํฐ๋ ๋ณดํธ์ ์ด์ง ์์์ ๋ฟ๋๋ฌ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ฒ๋ฆฌํ ์ฝ๋ ์๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ผ๋ ์ด์ ๋ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฉํฐ ์ค๋ ๋ฉ์ ์ฌ์ฉํ๊ณ ์ถ์ด
๊ทธ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์์ํ ๋ฉํฐ ์ค๋ ๋ฉ์ ๊ตฌํ ๋ชปํ๋ ๊ฒ์ผ๊น? ๊ทธ๋์ ๋์จ ๊ฒ์ด ๋ฐ๋ก ์น ์์ปค(web workers)์ด๋ค. ์น ์์ปค๋ฅผ ์ด์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋ฐ์ ์ค๋ ๋์ ๊ฐ์ด ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ํ ์๊ฐ ์๋ค.
// ์น ์์ปค ์คํฌ๋ฆฝํธ ํ์ผ(worker.js)
self.addEventListener('message', function(e) {
// ๋ฉ์ธ ์คํฌ๋ฆฝํธ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด ์คํํ ํจ์
var result = "Hello " + e.data;
self.postMessage(result); // ๊ฒฐ๊ณผ๋ฅผ ๋ฉ์ธ ์คํฌ๋ฆฝํธ๋ก ์ ์ก
}, false);
// ๋ฉ์ธ ์คํฌ๋ฆฝํธ์์ ์น ์์ปค ์ฌ์ฉ ์์
var worker = new Worker('./worker.js'); // ์น ์์ปค ๊ฐ์ฒด ์์ฑ
worker.addEventListener('message', function(e) {
// ์น ์์ปค๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด ์คํํ ํจ์
console.log(e.data); // ๊ฒฐ๊ณผ ์ถ๋ ฅ
}, false);
worker.postMessage('World'); // ์น ์์ปค์๊ฒ ๋ฉ์์ง ์ ์ก
Node.js์์๋ Worker_Threads ๋ชจ๋๋ก ๋ฉํฐ ์ค๋ ๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
์ด๋ฌํ ๋น๋๊ธฐ ์๋ฆฌ๋ ๊ผญ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด ๋ฟ๋ง ์๋๋ผ ๋ธ๋ผ์ฐ์ ์ HTML ๋งํฌ์
์ธ์ด์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค. HTML ์ ํ์ฑ ๋์ ๋ฐฉ์์ ์๋ก ๋ค ์ ์๋๋ฐ, ์๋์ ๊ฐ์ด ๋ค์๊ณผ ๊ฐ์ด <script> ํ๊ทธ๋ฅผ HTML ํ์ผ์ <head> ํ๊ทธ ์์ ๋ฃ์ผ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ๋ค์ด๋ก๋๋๊ณ ์คํ๋ ๋๊น์ง HTML ํ์ฑ์ด ์ค๋จ๋๊ฒ ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง์ ๋ด์ฉ์ ๋ณด๋๋ฐ ์ค๋ ๊ธฐ๋ค๋ ค์ผ ํ๊ฒ ๋๋ค.
<!DOCTYPE html>
<html>
<head>
<script src="script1.js"></script>
<script src="script2.js"></script>
<script src="script3.js"></script>
</head>
<body>
<h1>์น ํ์ด์ง ์ ๋ชฉ</h1>
<p>์น ํ์ด์ง ๋ด์ฉ</p>
</body>
</html>
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ํจ์๊ฐ ์๋ค๋ฉด html์๋ ๋น๋๊ธฐ๋ฅผ ์ด์ฉํ ์ ์๋ ๊ธฐ์ ์ด ์๋ค. ๋ฐ๋ก <script> ํ๊ทธ์ ๋ถ์ด๋ async ๊ณผ defer ํค์๋ ์ด๋ค. async์ defer ์์ฑ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ค์ด๋ก๋ํ๊ณ ์คํํ ์ ์๊ฒ ํด์ค๋ค. ์ด๋ ๊ฒ ํ๋ฉด HTML ํ์ฑ๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ค์ด๋ก๋๊ฐ ๋์์ ์งํ๋์ด ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ํฅ์์ํฌ ์ ์๊ฒ ๋๋ค.
<!DOCTYPE html>
<html>
<head>
<script async src="script1.js"></script>
<script async src="script2.js"></script>
<script async src="script3.js"></script>
</head>
<body>
<h1>์น ํ์ด์ง ์ ๋ชฉ</h1>
<p>์น ํ์ด์ง ๋ด์ฉ</p>
</body>
</html>
๊ทธ๋ฆผ์ ๋น๊ตํ๋ฉด ๋๊ฐ์ ์์ ์ ์ฒ๋ฆฌํ๋๋ฐ ์์ด Asynchronous๊ฐ ์ด ๊ฑธ๋ฆฐ Time์ด ๋ ์ ์๊ฑธ ๋ณผ ์ ์๋ค.
์ด ์ญ์ ์์์ ๋ฐฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ์ Web APIs ์๋ฆฌ์ ๊ฐ์ด, ํ์ผ ๋ค์ด๋ก๋ ๋์ ์์ฒด๋ฅผ ๋น๋๊ธฐ๋ก ๋ธ๋ผ์ฐ์ ๋ด๋ถ์ ๋ฉํฐ ์ค๋ ๋์ ์๋ํ๊ณ ๊ณ์ html ํ์ฑ์ ์ด์ด๋๊ฐ๋ฉด์ ๋์์ ํ์ผ์ ๋ค์ด๋ฐ๋ ์๋ฆฌ์ด๋ค.
HTML์ ๋น๋๊ธฐ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฝ ์คํ๊ณผ ์ด๋ฒคํธ ๋ฃจํ ๋์๊ณผ๋ ๋ณ๊ฐ๋ก ๋ธ๋ผ์ฐ์ ๋ด๋ถ ๊ตฌํ์ ์์กดํ๋ ๊ฒ์ด๋ค.
์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ด์ฉํ๋ ์ฌ์ฉ์๋ค์ ๋น ๋ฅธ ์๋น์ค๋ฅผ ์ํ์ง, ๋ถ๋ฌ์ค๋ ์๋๊ฐ ๋๋ฆฌ๊ณ ๋ฐ์์ด ์๋ ๊ฒ์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์ ์ผ๋ก ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ํ์ ์คํฌ์ด๋ผ ๋ณผ ์ ์๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฌธ์ ์
๋ค๋ง ์ฑ๋ฅ ํฅ์์ ์ํด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค. Asynchronous๋ ์์ฒญํ ์์ ์ ์๋ฃ ์ฌ๋ถ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์์ ์ ๊ทธ๋ค์ ์์ ์ ๊ณ์ ์ํํด ๋๊ฐ๋ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ผ ๊ทธ๋ค์ ์คํํ ์์ ์ด ์ด์ ์ ์์ฒญํ ์์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์ฝ๊ฒ ์๋ฅผ ๋ค์ด๋ณด๋ฉด ์๋์ html์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์๋ฌ๋ฅผ ์ผ์ผํค๊ฒ ๋๋ค. ์๋ํ๋ฉด $('body').appned() ์ฝ๋๋ ์ ์ด์ฟผ๋ฆฌ ์ ์ฉ ์ฝ๋๋ก์ ์ ์ด์ฟผ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ด ๋ค์ด์ ๋ชจ๋ ๋ฐ์ ์ํ์ฌ์ผ๋ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ ์ด์ฟผ๋ฆฌ ์์คํ์ผ ํธ์ถ์ ๋น๋๊ธฐ์ ์ผ๋ก ์งํํด ์์คํ์ผ์ด ๋ค์ด๋ก๋ ๋๊ธฐ๋ ์ ์ ์ ์ด์ฟผ๋ฆฌ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ผ๋ ์๋ฌ๊ฐ ์ผ์ด๋๋๊ฒ ๋น์ฐํ ๊ฒ์ด๋ค. (๋ง์ผ ์์คํ์ผ ๋ค์ด์ ์์ฒญ ๋นจ๋ฆฌํ๋ค๋ฉด ์๋ฌ๊ฐ ์ผ์ด๋์ง ์์ ์ ์๋ค)
<script async src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
<script>
// ์ ์ด์ฟผ๋ฆฌ ํ์ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ํธ์ถํ๊ณ ๋ฐ๋ก ์ ์ด์ฟผ๋ฆฌ ์ ์ฉ ์ฝ๋๋ฅผ ์คํ ์์ผฐ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค
$('body').append('<h1>Hello World</h1>'); // ! ERROR
</script>
์ด๋ฐ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ ๋น๋๊ธฐ ํจ์์ ๊ฒฐ๊ณผ๊ฐ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ์ฝ๋์ ์ํฅ์ ์ค ๋๋ ๋ฌธ์ ๊ฐ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ์ฝ๋๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ก์ง์ ๊ฐ๋จํ๊ฒ ํํํ ์์ ์ด๋ค. getDB() ํจ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ๋๋ฐ, ์ด๋ ์กฐํ ์๊ฐ์ด 3์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฆฌ๊ณ DB๋ก๋ถํฐ ์๋ต์ ๋ฐ๊ฒ ๋๋ฉด data ๋ณ์์ ์ ์ฅํ๊ณ ๊ฐ์ ๋๋ฐฐ ๊ณฑ์
์ฐ์ฐ ํ ์ถ๋ ฅํ๋ ค๊ณ ํ๋ค.
function getDB() {
let data;
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ๊ฐ์ ธ์ค๋ 3์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ (๋น๋๊ธฐ ์ฒ๋ฆฌ)
setTimeout(() => {
data = 100;
}, 3000);
return data;
}
function main() {
let value = getDB();
value *= 2;
console.log('value์ ๊ฐ : ', value);
}
main(); // ๋ฉ์ธ ์ค๋ ๋ ์คํ
ํ์ง๋ง ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด๋ data ๋ณ์์ NaN์ด๋ผ๋ ์ด์ํ ๊ฐ์ด ๋ค์ด๊ฐ ์๋ค. ์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์์๊น? ๊ทธ ์ด์ ๋ ๋น๋๊ธฐ ํจ์์ธ setTimeout ํจ์๊ฐ 3์ด ๋์ ๋๊ธฐํ๋ ๋์ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋์ธ console.log(data)๋ฅผ ์คํํ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ data ๋ณ์์๋ ์์ง ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ง ์์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ์ฐ์ฐ์ ํ๋ ์ด์ํ ๊ฐ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ ๊ฐ์ด ์์ ์ ์์๋ฅผ ๋ง์ถ๋ ๊ฒ์ด ํ์ ๋ถ๊ฐ๊ฒฐ์ผ ๊ฒฝ์ฐ ์ด์ฉ์ ์์ด ๋น๋๊ธฐ๋ฅผ ํฌ๊ธฐํ๊ณ ๋๊ธฐ๋ก ์ฒ๋ฆฌํด์ผ ๋๋ ์ถ์ง๋ง, ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ช๊ฐ์ง ๊ธฐ๋ฒ์ด ์๋ค. ๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ์ด ์ฝ๋ฐฑ ํจ์ ๊ธฐ๋ฒ์ด๋ค.
๋น๋๊ธฐ๋ฅผ ์๋ง๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ฒ
๋น๋๊ธฐ์ ์ฝ๋ฐฑ ํจ์
ํํ ๋น๋๊ธฐ๋ฅผ ๋ค๋ฃฐ๋ ์์ฃผ ์ฎ์ฌ ๋ฑ์ฅํ๋ ๊ฐ๋ ์ด ์ฝ๋ฐฑ(callback) ํจ์์ด๋ค. ์ฝ๋ฐฑ ํจ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ผ๊ธ ๊ฐ์ฒด ํน์ฑ์ ์ด์ฉํด ํจ์์ ๋งค๊ฐ๋ณ์์ ํจ์ ์์ฒด๋ฅผ ๋๊ฒจ, ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์ ํจ์๋ฅผ ์คํํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค.
๋น๋๊ธฐ ๋ฐฉ์์ ์์ฒญ๊ณผ ์๋ต์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์๋ต์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ์์กดํ๋ ๊ฒฝ์ฐ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด์ฉํ์ฌ ์์ ์์๋ฅผ ๊ฐ์ ์ ์ผ๋ก ๋ผ์ ๋ง์ถ ์ ์๋ค. ์ฝ๋ฐฑ ํจ์ ๋ฐฉ์์ผ๋ก ์์ ๋ฌธ์ ์ฝ๋๋ฅผ ์์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๊ฒ ๋๋ค.
function getDB(callback) {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ 3์ด ํ์ ๋ฐ์ดํฐ ๊ฐ์ ๋ฐ์์จ ํ, ์ฝ๋ฐฑ ํจ์ ํธ์ถ
setTimeout(() => {
const value = 100;
callback(value);
}, 3000);
}
function main() {
// ํธ์ถํ ์์
์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋๊ธด๋ค
getDB(function(value) {
let data = value * 2;
console.log('data์ ๊ฐ : ', data);
});
}
main();
์ ์ฝ๋๋ ์ฝ๋ฐฑ ํจ์ ๋ด์์ data ๋ณ์์ ๊ฐ์ ๋ฐ์ ์ถ๋ ฅํ๋ฏ๋ก, ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋ ํ์ ์ถ๋ ฅ๋๊ฒ ๋๋ค. ์ฆ, ์ฝ๋ฐฑ ํจ์๋ ๋น๋๊ธฐ ํจ์์์ ์์
๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌ๋ฐ์ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋์ด ์์
์์๋ฅผ ๋ง์ถ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ ์๋ก ๋ฐ์ ํ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด๋ค.
๋ค๋ง ๋๋ฌด ๋ณต์กํ๊ฒ ์ฝํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋๋ฌธ์ ์ฝ๋ฐฑ ํจ์ ๋ฐฉ์์ ์ฝ๋ ๋ณต์ก๋๋ฅผ ์ฆ๊ฐ์์ผ, ๊ฐ๋ฐ์๊ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ํ๋ฆ์ ์ฝ๊ธฐ ์ด๋ ค์์ง๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ด ์๋ชปํ๋ฉด ์ฝ๋ฐฑ ์ง์ฅ(callback hell) ์ ๋น ์ง์ ์๋ค๋ ๋จ์ ์ด ์๋ค. ์กฐ๊ธ ์ต์ง์ค๋ฌ์ด ์ฝ๋์ง๋ง ์ ๋ง๋ก ์ฝ๋ฐฑ ํจ์๋ค์ ๋ณต์กํ๊ฒ ์ค์ฒฉํ์ฌ ๊ตฌ์ฑํ๋ค๋ฉด ์๋์ ๊ฐ์ '์๋ด๊ฒ'์ ๋ง์ ํ๋ฆฌ๊ฐ ๊ตฌ๋ถ๋ฌ์ง ์ฐ์ค๊ฝ ์ค๋ฌ์ด ์ฝ๋ ๋ชจ์์ด ๋๊ฒ ๋๋ค.
๋น๋๊ธฐ์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด
์ฝ๋ฐฑ ํจ์๋ ์์ฐํ ๋งํ์๋ฉด ๋น๋๊ธฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ผ์ข ์ 'ํธ๋ฒ' ๊ฐ์ ๊ฒ์ด์ง ์ ์์ผ๋ก ์ง์ํ๋ ๋น๋๊ธฐ ์ ์ฉ ํจ์๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ์ Promise ๊ฐ์ฒด๋ ์ด๋ฌํ ํ๊ณ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ์ฉ ๊ฐ์ฒด๋ก์ ํ์ํ์๋ค. Promise๋ ๋น๋๊ธฐ ์์ ์ ์ฑ๊ณต ๋๋ ์คํจ์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ํ๋ด๋ ๊ฐ์ฒด์ด๋ค. ๊ทธ๋์ Promise๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ ์ฝ๊ณ ๊น๋ํ๊ฒ ์ฐ๊ฒฐํ ์ ์๊ฒ ๋๋ค.
function getDB() {
return new Promise((resolve) => {
setTimeout(() => {
const value = 100;
resolve(value);
}, 3000);
});
}
function main() {
getDB()
.then((value) => {
let data = value * 2;
console.log('data์ ๊ฐ : ', data);
})
.catch((error) => {
console.error(error);
});
}
main();
๋น๋๊ธฐ์ async / await
ํ์ง๋ง ํ๋ก๋ฏธ์ค๋ ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ ์๋๋ค. ์๋ํ๋ฉด Callback Hell์ด ์๋ฏ์ด ์ง๋์น then ํธ๋ค๋ฌ ํจ์์ ๋จ์ฉ์ผ๋ก ์ธํ Promise Hell์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ํ๋ก๋ฏธ์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์ฐ๊ฒฐ๋๋ฉด ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ๋ณต์กํด์ง ์ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ์๋ async/await๋ผ๋ ๋ฌธ๋ฒ์ด ๋ํ ์ถ๊ฐ๋์๋ค. async/await๋ ํ๋ก๋ฏธ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง, ๋ง์น ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑํ ์ ์๊ฒ ํด์ค๋ค. ๋น๋๊ธฐ ์์ ์ ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ์ผ์ด ์๋ค๋ฉด ๋๊ฒ async/await ๋ฐฉ์์ ์ฐ๋ ๊ฒ์ด ๋ณดํต์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ Promise๋ async/await์ ๊ฐ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ด๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ํ๋ฆ์ ์ข ๋ ๋ช ํํ๊ฒ ์ธ์งํ๊ณ ์ ํ๋ ๋ ธ๋ ฅ์ธ ๊ฒ์ด๋ค.
function getDB() {
return new Promise((resolve, reject) => {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ๊ฐ์ ธ์ค๋ 3์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ (๋น๋๊ธฐ ์ฒ๋ฆฌ)
setTimeout(() => {
const value = 100;
resolve(value); // Promise ๊ฐ์ฒด ๋ฐํ
}, 3000);
});
}
async function main() {
let data = await getDB(); // await ํค์๋๋ก Promise๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
data *= 2;
console.log('data์ ๊ฐ : ', data);
}
main(); // ๋ฉ์ธ ์ค๋ ๋ ์คํ
๊ทธ๋ผ ๋ฌด์กฐ๊ฑด await๊ฐ ๋ต์ธ๊ฐ?
์ด๋ ๊ฒ ๋ณด๋ฉด async/await์ด ๋น๋๊ธฐ๋ฅผ ์ฒ๋ฆฌํจ์ ์์ด callback์ด๋ Promise ๋ฐฉ์๋ณด๋ค ํจ์ฌ ์ข์ ๋ณด์ด์ง๋ง, ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์๋ ์ฝ๋๊ฐ ๋ณต์กํด์ง ์๋ ์๋ค. ๋ฐ๋ผ์ ์ด ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ํ 3๊ฐ์ง ๋ฐฉ์์ ์ฉ๋์ ๋ง์ถฐ์ ์ ์ ํ ์ฌ์ฉํด์ผ ํ๋ค.
์๋ํ๋ฉด callback ๋ฐฉ์์ ๋ณ ๋ค๋ฅธ ํค์๋ ์์ด๋ ์ ๋ง ๋จ์ํ๊ฒ ๊ตฌํํ ์ ์๋ ๋ฌธ๋ฒ์ด๊ธฐ ๋๋ฌธ์, ์ฝ๋ฐฑ ์ง์ฅ์ ๋ง์ดํ ์ ๋์ ๋ณต์กํ ์ํฉ์ด ์๋ ๋๋ฉด ์คํ๋ ค ์ฌ์ฉํ๋ฉด ๊ฐ๋ ์ฑ์ด ์ข๋ค. ๋ํ์ ์ธ ์๋ก Node.js์ Express ํ๋ ์์ํฌ๋ ์๋ฒ ๋ผ์ฐํ ์ ์ฝ๋ฐฑ ํจ์๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
const express = require("express"); // Express ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
const app = express(); // Express ์ฑ ๊ฐ์ฒด ์์ฑ
// /home url ๊ฒฝ๋ก์ GET ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด์ ๋ํ ๋ผ์ฐํ
์ ์
app.get("/home", function (req, res) {
// ์๋ต ๋ณด๋ด๊ธฐ
res.send("Hello, Express!");
});
๋ฐ๋ผ์, ์ฝ๋ฐฑ ํจ์๋ ๋ณต์กํ๊ธฐ ์๊ณ ๋น๊ต์ ์ฌํํ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํด์ผ ํ ๋ ์ฌ์ฉํ๋ฉด ์คํ๋ ค ํ๋ก๋ฏธ์ค ๋ฐฉ์๋ณด๋ค ๋ ์ข์ ์ ์๋ค. ๋ฐ๋ฉด์ ๋น๊ต์ ๋ณต์กํ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ๋๋ Promise ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0
https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif
https://medium.com/sjk5766/javascript-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%95%B5%EC%8B%AC-event-loop-%EC%A0%95%EB%A6%AC-422eb29231a8