๐ ์ถ๊ฐ๋ก ์ ๋ฆฌํ ๊ฒ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- call back
- promise
๋๊ธฐ vs ๋น๋๊ธฐ
JavaScript๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋ (single thread) ์ธ์ด์ด๋ฉฐ,
๋น๋๊ธฐ ๋ฐฉ์์ฒ๋ผ ๋์ํ ์ ์์
๊ฐ๋
- ๋๊ธฐ (Synchronous)
- ํ ๋ฒ์ ํ ์์ ๋ง ์คํํ๋ฉฐ, ์์ ์ด ๋๋ ๋๊น์ง ๋ค์ ์ฝ๋๊ฐ ์คํ๋์ง ์์
- ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ -> ์ค๊ฐ์ ์คํ ์๋๊ฐ ๋๋ฆฌ๋ฉด, ๋ค์ ๋ถ๋ถ์ด ์์ ํ๋ฉด์ ๋ณด์ด์ง ์์
console.log('1') // ๋ฐ๋ก ์ถ๋ ฅ
alert('์ฌ์ฉ์์ ์
๋ ฅ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.') // ์ฌ์ฉ์๊ฐ ๋๋ฅผ ๋๊น์ง ๋๊ธฐ
console.log('2') // ์ ์ค์ด ์คํ ์๋ฃ๋ ๋๊น์ง ์ถ๋ ฅ๋์ง ์์
- ๋น๋๊ธฐ (Asynchronous)
- ํ๋์ ์์ ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ๋ค๋ฅธ ์์ ์ ๋์์ ์คํ ๊ฐ๋ฅ
- ๋น ๋ฅธ ์คํ ์๋์ ์ ์ฐํ ์ฝ๋ ์คํ์ด ๊ฐ๋ฅ
- ๋ํ์ ์ธ ๋น๋๊ธฐ ์์
- `setTimeout`,`setInterval` (์๊ฐ ์ง์ฐ)
- `fetch API` (๋คํธ์ํฌ ์์ฒญ)
- ์ด๋ฒคํธ ๋ฆฌ์ค๋ (ํด๋ฆญ, ํค ์ ๋ ฅ ๋ฑ)
- `Promise`,`async`/`await` (๋น๋๊ธฐ ์ฝ๋ ์ฒ๋ฆฌ)
console.log('1')
setTimeout(() => {
console.log('2')
}, 2000)
console.log('3')
// ๊ฒฐ๊ณผ : 1 3 2
JavaScript์์ ๋น๋๊ธฐ๊ฐ ํ์ํ ์ด์
- ๋ฌธ์ ์
- ๋ง์ฝ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์คํํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋๊น์ง ์ดํ ์ฝ๋๊ฐ ๋ฉ์ถฐ๋ฒ๋ฆผ
๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
1๏ธโฃ ์ฝ๋ฐฑ ํจ์ (Callback)
๋ค๋ฅธ ํจ์์ `์ธ์`๋ก ์ ๋ฌ๋์ด ํน์ ์์ ์ ์คํ๋๋ ํจ์
์ฝ๋ฐฑ ํจ์๋ ๋ฏธ๋ฆฌ ๋ฑ๋กํด๋๊ณ , ํน์ ์์ ์ด๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์์คํ ์ด ํธ์ถ๋๋ ํจ์
- ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ํ ์คํํ ์ฝ๋ (์์ )๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํ๋ ์ญํ
- ํจ์ ๋ด๋ถ์์ ์คํ ์์ ์ ์กฐ์ ํ ์ ์์
- ์ฃผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ (์: API ํธ์ถ, ํ์ผ ์ฝ๊ธฐ, ํ์ด๋จธ)์์ ์ฌ์ฉ๋จ
// setTimeout() ์์
console.log("A");
setTimeout(function () {
console.log("B");
}, 2000); // 2์ด ํ ์คํ
console.log("C");
โผ๏ธ ์ฝ๋ฐฑ ์ง์ฅ (Callback Hell) ๋ฌธ์
- ์ค๋ช
- ์ฝ๋ฐฑ ํจ์๊ฐ ์ค์ฒฉ๋ ์๋ก ์ฝ๋๊ฐ ๋ณต์กํด์ง๋ ๋ฌธ์
- ๋ฌธ์ ์
- ์ฝ๋๊ฐ ์ค์ฒฉ๋ ์๋ก ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง
- ๋๋ฒ๊น ๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ๋งค์ฐ ์ด๋ ค์์ง ์ ์์
- ํ์ฌ
- ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ์ต์ ๋น๋๊ธฐ API๋ ์ฝ๋ฐฑ์ ์ฌ์ฉํ์ง ์์
- ๋์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด `Promise`์ `async`/`await`๊ฐ ๋ฑ์ฅํจ
// ์ฝ๋ฐฑ ์ง์ฅ ์์
function step1(callback) {
setTimeout(() => {
console.log("1๋จ๊ณ ์๋ฃ");
callback();
}, 1000);
}
function step2(callback) {
setTimeout(() => {
console.log("2๋จ๊ณ ์๋ฃ");
callback();
}, 1000);
}
function step3(callback) {
setTimeout(() => {
console.log("3๋จ๊ณ ์๋ฃ");
callback();
}, 1000);
}
// ์ฝ๋ฐฑ ์ค์ฒฉ (์ฝ๋ฐฑ ์ง์ฅ ๋ฐ์)
step1(() => {
step2(() => {
step3(() => {
console.log("๋ชจ๋ ์์
์๋ฃ!");
});
});
});
๐ ์ฝ๋ฐฑ ํจ์(Callback) ๊ฐ๋ & ์์ฉ - ์๋ฒฝ ์ ๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ฐฑ ํจ์ ๋? ์ฝ๋ฐฑ(Callback) ํจ์๋ ๊ฐ๋จํ ๋งํ๋ฉด ๋งค๊ฐ๋ณ์๋ก ํจ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ ํธ์ถ ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์ ํจ์๋ฅผ ์คํํ๋ ๊ฒ์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด ์๋ ์ฝ๋์ ๊ฐ์ด sayHello(
inpa.tistory.com
2๏ธโฃ Promise
promise๋ ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ ๋ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ฃผ๊ฒ ๋ค๊ณ '์ฝ์'ํ๋ ๊ฐ์ฒด
- ์ค๋ช
- ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฉ์๋์์ ๋ง์น ๋๊ธฐ ๋ฉ์๋์ฒ๋ผ ๋ฐํํ ์ ์์
- ๋ค๋ง, ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ ๋ฏธ๋ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ฒ ๋ค๋ ํ๋ก๋ฏธ์ค (์ฝ์)์ ๋ฐํ
- ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
- ์ฝ๋ฐฑ ํจ์๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์ฝ๋ฐฑ ์ง์ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํ๊ธฐ๋ ํจ.
- `promise`๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ ์ ์์
- ์ํ
- ๋๊ธฐ (pending) : ๋น๋๊ธฐ ์์ ์ด ์์ง ์๋ฃ๋์ง ์์ ์ํ (์ดํํ์ง๋, ๊ฑฐ๋ถํ์ง๋ ์์ ์ด๊ธฐ ์ํ)
- ์ดํ (fulfilled) : ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ์ํ (์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ)
- ๊ฑฐ๋ถ (rejected) : ๋น๋๊ธฐ ์์ ์ด ์คํจํ ์ํ (์ฐ์ฐ์ด ์คํจํจ)
๋น๋๊ธฐ ๋ฉ์๋์์ ๋๊ธฐ ๋ฉ์๋์ฒ๋ผ?
๋ณดํต ๋น๋๊ธฐ ์ฝ๋ (ex: setTimeout, fetch ๋ฑ)๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฆ์ ๋ฐํํ์ง ๋ชปํจ. ํ์ง๋ง, promise์ `then()`์ ํตํด ์ฐ๊ฒฐํ๋ฉด ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ๋๊ธฐ ์ฝ๋์ฒ๋ผ ๋ณด์ด๊ฒ ๋จ
Promise ์ฌ์ฉ๋ฒ
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise
Promise - JavaScript | MDN
Promise ๊ฐ์ฒด๋ ๋น๋๊ธฐ ์์ ์ด ๋ง์ดํ ๋ฏธ๋์ ์๋ฃ ๋๋ ์คํจ์ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋ ๋๋ค.
developer.mozilla.org
https://inpa.tistory.com/entry/%F0%9F%8C%90-js-async
๐ ์๋ฐ์คํฌ๋ฆฝํธ์ ํต์ฌ '๋น๋๊ธฐ' ์๋ฒฝ ์ดํด โ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋๊ธฐ์ ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ ์ ์๋ค. ์ฆ, ์ด์ ์์ ์ด ์๋ฃ๋์ด์ผ ๋ค์ ์์ ์ ์ํํ ์ ์๊ฒ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ
inpa.tistory.com
โ๏ธ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋์ ์๋ฆฌ
๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋์ ์๋ฆฌ๊ฐ ๊ถ๊ธํ๋๋ฐ, ์น๊ตฌ์๊ฒ ์์์ ์ถ์ฒ๋ฐ์ ์ดํดํ ๋ฐ๋ฅผ ์ ๋ฆฌํด ๋ดค์ต๋๋ค.
์๋์ ์์์ ๋จผ์ ํ๋ฒ ๋ณด์๊ณ ๊ธ์ ์ฝ๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
JavaScript Runtime (๋จ์ํ ์์)
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ ์ธ์ด์ด์ง๋ง, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๊ธฐ ์ํด
Web APIs, ์ด๋ฒคํธ ๋ฃจํ, ์ฝ๋ฐฑ ํ๋ฅผ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ์ฉํจ
- ์คํ ์์น?
- Heap & Stack :JavaScript ์์ง ๋ด๋ถ (V8, SpiderMonkey ๋ฑ)
- Web APIs : ๋ธ๋ผ์ฐ์ (๋๋ Node.js ๋ฐํ์ ํ๊ฒฝ)
- Callback Queue & Event Loop : ๋ธ๋ผ์ฐ์ (๋๋ Node.js ๋ฐํ์ ํ๊ฒฝ)
webapis๊ฐ ์คํ๋๋ ์์น๋ ์๋ฒ๊ฐ ์๋๋ผ ๋ด!!!!!!!! ์ปดํจํ ์์์ ์ฐ๋๊ฑฐ๋ค!!
- heap (ํ)
- ์ฐธ์กฐ ์๋ฃํ (object, array, function)๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
- ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ (์ฐธ์กฐ๊ฐ) ์ ์ฅ
- stack (์คํ)
- ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์ปจํ ์คํธ (excution context)๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ
- LIFO (last in, first out) ๊ตฌ์กฐ : ํจ์๊ฐ ์คํ๋๋ฉด stack์ ์์ด๊ณ , ์คํ์ด ๋๋๋ฉด ์ ๊ฑฐ๋จ
- web apis (๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ญ)
- setTimeout, DOM ์ด๋ฒคํธ, AJAX ์์ฒญ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ด ์คํ๋๋ ๊ณต๊ฐ
- ๋ธ๋ผ์ฐ์ ์๋ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ณต๊ฐ์ด ๋ฐ๋ก ๋ง๋ จ๋์ด ์์
- JavaScript๋ ์ฑ๊ธ ์ค๋ ๋์ด๋ฏ๋ก, web apis๋ฅผ ํตํด ๋น๋๊ธฐ ์์ ์ ์คํ ํ ๋๊ธฐ์ํด
- callback queue (์ฝ๋ฐฑ ํ)
- web apis์์ ์๋ฃ๋ ์์ ์ด ์ฝ๋ฐฑ ํ๋ก ์ด๋
- ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋๊ธฐํ๋ ๊ณต๊ฐ
- ํ์ง๋ง ๋ฐ๋ก ์คํ๋์ง ์๊ณ , stack์ด ๋น์์ ๋ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์คํํ๋๋ก ํจ
- event loop (์ด๋ฒคํธ ๋ฃจํ)
- stack์ด ๋น์๋์ง ํ์ธํ๊ณ , ๋น์์ ๊ฒฝ์ฐ์๋ง ์ฝ๋ฐฑ ํ์์ ์์ ์ ๊ฐ์ ธ์ ์คํ
- javascript๊ฐ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ ํต์ฌ ๋งค์ปค๋์ฆ
the call stack
- printsquare์ ๊ธฐ์ค์ผ๋ก ํจ์๊ฐ ํธ์ถ๋๋ ์์ผ๋ก ์์ด๊ณ (printsqure > square ...),
- ์คํ๋๋ ์์ผ๋ก ๋น ์ ธ๋๊ฐ๋ค (multiply > square ...)
๋์ ์์
1. main() ํจ์๊ฐ ์คํ
2. console.log('hi') ์คํ
- ์ฝ์์ hi ์ถ๋ ฅ
- stack ๋น ์ ธ๋๊ฐ
3. setTimeout(cb, 5000) ์คํ
- ์ฝ๋ฐฑ ํจ์(cb)๋ฅผ web api์ ๋๊น
- web api์์ 5์ด ํ์ด๋จธ ์์
- setTimeout ํจ์๋ ์คํ์ด ๋๋๋ฏ๋ก stack์์ ์ ๊ฑฐ๋จ
4.console.log('JSConfEU') ์คํ
- ์ฝ์์ JSConfEU ์ถ๋ ฅ
- stack ๋น ์ ธ๋๊ฐ
5. 5์ด ํ, ์ฝ๋ฐฑ ํจ์ (cb) ์คํ ์ค๋น
- web api๋ cb๋ฅผ callback queue์ ๋ฃ์
6. event loop๊ฐ callback queue๋ฅผ ํ์ธ
- event loop๋ stack์ด ๋น์ด์๋์ง ํ์ธ
- stack์ด ๋น์ด ์์ผ๋ฉด callback queue์์ cb๋ฅผ ๊บผ๋ด ์คํ
7. console.log('there') ์คํ
- cb๊ฐ stack์ ๋ค์ด๊ฐ ์คํ๋จ
- there๊ฐ ์ฝ์์ ์ถ๋ ฅ
* ๋ง์ฝ setTimeout์ด '0'์ผ๋ก ์ค์ ๋์ด ์๋ค๋ฉดโ
setTimeout์ด 0์ผ๋ก ์ค์ ๋์ด ์๋ค๊ณ ํ๋๋ผ๋ task queue๋ก ๋์ด๊ฐ cb๋ stack์ด ๋น์์ ธ์ผ์ง ์คํ๋จ
๋ฐ๋ผ์ ์ง์ฐ ์๊ฐ๊ณผ ๊ด๊ณ์์ด ๊ฒฐ๊ณผ๋ 1, 3, 2๋ก ์ถ๋ ฅ
console.log('1')
setTimeout(function cb() {
console.log('2')
}, 0)
console.log('3')
// ๊ฒฐ๊ณผ: 1, 3, 2
'IT > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ ์ด์ ๋ฆฌ (0) | 2025.02.23 |
---|