์๋ฐ์คํฌ๋ฆฝํธ ๋์
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ป๊ฒ ๋์ํ ๊น? ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ๊ฑฐ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋์ ์๋ฆฌ์ ๋ํด์๋ ์์์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
๊ฐ๋จํ๊ฒ ์์ฝํ๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ์ด๊ณ ์ฝ๋ฐฑ ํ๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง V8
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ์ธํฐํ๋ฆฌํฐ ์ญํ ์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํ์ํ๋ค. ๋์ค์ ์ผ๋ก ์๋ ค์ง ์์ง์ ๊ตฌ๊ธ์ V8 ์์ง์ผ๋ก ํฌ๋กฌ ์น ๋ธ๋ผ์ฐ์ , Node.js ๋ฑ์์ ์ฌ์ฉ๋๊ณ ์๋ค.
V8 ์์ง์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ ๋ํ๋ด๋ฉด ์ด๋ ๋ค. Memory Heap ๊ณผ Call Stack ์ด ์ฃผ์ ๊ตฌ์ฑ์์์ด๋ค.
- Memory Heap: ๋ณ์์ ๊ฐ์ฒด์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ผ์ด๋๋ ๊ณณ
- Call Stack: ํจ์๊ฐ ํธ์ถ๋๋ฉด ์์๋๋ก ์์ด๋ ๊ณณ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ ์ธ์ด์ด๊ณ ๋๊ธฐ์ ์ผ๋ก ์คํํ๋ค. ์ด ๋ง์ ์ฆ ํธ์ถ ์คํ์ด ํ๋๋ผ๋ ๋ง์ด๋ค. ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ๊ณ ์คํ ๋ด ์์๋๋ก ์์ ์ ์์ํ๋๋ฐ ํ๋์ ์์ ์ด ๋๋์ ์คํ์์ ์ ๊ฑฐ๋์ด์ผ ๋ค์ ์์ ์ ์คํํ ์ ์๋ค.
๊ทธ๋์ ๊ฐ๋ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ ์ฝ๋๋ฅผ ์๋ชป ์์ฑํ๊ฒ ๋๋ฉด [Uncaught RangeError: Maximum call stack size exceeded] ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณค ํ๋ค.
์ฑ๊ธ ์ค๋ ๋์์ ๋๊ธฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋๋ฉด ์ฝ๋ ์์ฑ์ ์ฝ๊ฒ ์ง๋ง ์ ์ฝ์ด ๋ง๋ค. ์๋ฅผ ๋ค์ด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ฝ๋๊ฐ ์คํ์ ๋๋๊ณ ์ฝ๋ฐฑ์ ๋ฐํํ๊ธฐ ์ ๊น์ง ๊ณ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ๋ฐ๋ผ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํด์ผ ํ ํ์์ฑ์ด ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ธ๋ถ API ๋ฅผ ์ฌ์ฉํ๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ธ๋ถ API ์ ์์ํ๊ณ ์๋ฃ๋ ์์ ์ event loop ๋ฅผ ํตํด ๋ฐํ ๋ฐ๊ณ ๋ค์ ์ฝ๋ฐฑ์ ์คํํ์ฌ ๋ณ๋ ฌ์ ์ผ๋ก ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
- Call Stack: ์์ ์ด ์์๋๋ก ์์ด๊ณ ๋๋๋ฉด ๋น ์ง๋ ๊ณณ
- Callback Queue: ๋น๋๊ธฐ ์์ ์ด ๋๊ธฐํ๋ค๊ฐ Call Stack ์ด ๋น์ด์์ผ๋ฉด Event Loop ์ ๋ช ๋ น์ ๋ฐ๋ผ ์ฐจ๋ก๋ก ๋ค์ด๊ฐ๋ ๊ณณ
- Event Loop: ๋น๋๊ธฐ/๋๊ธฐ ์์ ์ ์์๋ฅผ ๊ด๋ฆฌ
Call Stack ์์ ์คํ๋ ๋น๋๊ธฐ ํจ์๋ Web API ๋ฅผ ํธ์ถํ๊ณ , ์ฝ๋ฐฑํจ์๋ฅผ Callback Queue ์ ๋ฃ๋๋ค. Event Loop ๋ Call Stack ์ด ๋น ์ํ๊ฐ ๋๋ฉด Callback Queue ์ ์๋ ์ฒซ ๋ฒ์งธ ์ฝ๋ฐฑ์ Call Stack ์ผ๋ก ์ด๋์ํจ๋ค.
์ ๋ฆฌํด๋ณด๋ฉด ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ธ๋ถ API ์ ์์๋์ด ์คํ์ด ๋๋๋ฉด callback ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌํด์ฃผ๋ ๋ฐฉ์์ด๋ค. ์ด๋ฌํ callback ํจํด์ผ๋ก ๋น๋๊ธฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋จ์ํ callback ๋ง์ผ๋ก ๋ชจ๋ ์ํ๋ฅผ ํต์ ํ๊ธฐ๋ ์ด๋ ค์ ๋ค์ํ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์ ์๋ค.
Callback ๋น๋๊ธฐ ๋ฌธ์ ์
- ์ฝ๋ฐฑ ์ง์ฅ
์๋ ์์๋ฅผ ๋ณด๋ฉด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ฐํํ๋ ์ฝ๋์ธ๋ฐ ์ค์ ๋ก ์คํํด๋ณด๋ฉด undefined ๊ฐ ์ถ๋ ฅ๋๋ค. ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ฐ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์๋ฌด ๊ฒ๋ ๋ค์ด๊ฐ์ง ์์ ๊ฐ์ด ๋์จ ๊ฒ์ด๋ค.
function getInfo() {
var myData;
$.get('info/1', function(response) {
myData = response;
});
return myData;
}
console.log(getInfo()); // undefined
์ด๋ฅผ ์ฝ๋ฐฑํจ์๋ก ํ๋ฆ ์ ์ด๋ฅผ ํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
function getInfo(callback) {
$.get('info/1', function (response) {
callback(response);
})
}
getInfo(function (data) {
console.log(data);
}) // callback
๋์ค์ ์คํ์ํค๊ณ ์ ํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ด์ ํธ์ถํ๋ค. ๊ฑฐ์ณ์ผ ํ ํจ์๋ค์ด ๋ง๋ค๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ต๋ช ํจ์๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ด ์ค์ฒฉ๋์ด ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๊น์ด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
- ๊ฒฝ์๊ด๊ณ ๋ฐ์
์ฝ๋ฐฑ ์ค์ฒฉ ํจํด์ ์ฐํํ๊ธฐ ์ํด ๋ด๋ถ์ ํ๋๊ทธ๋ฅผ ์ฃผ๊ณ ๊ฐ์ด ๋์ฐฉํ์ ๋ ์คํํ๋๋ก ์ ์ดํ๋๋ฐ, ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ ์ด๋ค ํจ์๊ฐ ๋จผ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ง ์์ง ๋ชปํ๋ค.
Promise
๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ์ค API ํํ๋ก ์ฌ์ฉํ ์ ์๊ฒ ES6์์ ํ๋ก๋ฏธ์ค(Promise) ๋ฅผ ์ถ๊ฐํ๋ค.
Promise ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ๋ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด๋ก ๋น๋๊ธฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒดํ์์ผ ์ฌ์ฉํ๋ค.
function getInfo(callback) {
return new Promise(function(resolve, reject) {
$.get('info/1', function(response) {
resolve(response);
});
});
}
getInfo().then(function(data) {
console.log(data);
});
- Promise ์ํ
new Promise() ๋ก ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ๊ณ ์ข ๋ฃ๋ ๋๊น์ง 3๊ฐ์ง ์ํ๋ฅผ ๊ฐ๋๋ค.
- Pending (๋๊ธฐ): ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์์ง ์๋ฃ๋์ง ์์ ์ํ
- Fulfilled (์ดํ): ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ด ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํด์ค ์ํ
- Rejected (์คํจ): ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ํ
- Promise ์ฌ์ฉ ๋ฐฉ๋ฒ
- new Promise ์์ฑ์๋ก Promise ์์ฑ
- resolve ๋ ์ฑ๊ณต, reject ๋ ์คํจ ์ ์ฌ์ฉ
- then ์ฌ์ฉ ์ Promise ๋ฅผ ๋ฐํํ๋ฏ๋ก chain ํจํด์ผ๋ก ์ฌ์ฉ
const myPromise = new Promise(function(resolve, reject) {
// ...
// resolve('') or reject('')
});
myPromise
.then(x => {}) // ์ฑ๊ณต ์, ์ธ์๋ resolve ๊ฐ
.catch(x => {}) // ์คํจ ์, ์ธ์๋ reject ๊ฐ
์ฐธ๊ณ ์๋ฃ ๋ฐ ์ถ์ฒ ๐โ๏ธ
https://ljtaek2.tistory.com/142
https://joshua1988.github.io/web-development/javascript/promise-for-beginners/
'๊ฐ๋ฐ > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ES6 Syntax (0) | 2022.05.03 |
---|---|
TypeScript (0) | 2022.04.28 |
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ / Promise / async / await / fetch (0) | 2022.04.20 |
javascript ํจ์ํ ํ๋ก๊ทธ๋๋ฐ (0) | 2022.02.06 |
javascript ๋ณ์ / ํธ์ด์คํ / var, let, const ์ฐจ์ด (0) | 2022.01.26 |
๋๊ธ