์๋ ๋ด์ฉ์ ์ฐ์ํํ ํฌ: [10๋ถ ํ ์ฝํก] ๐ ํผํฐ์ ์ด๋ฒคํธ๋ฃจํ ์์์ ์ฐธ๊ณ ํ ๊ธ์ ๋๋ค. ์ ์ตํ ๋ด์ฉ ๋ฐํํด์ฃผ์ ํผํฐ ๋๊ป ๊ฐ์ฌ๋ฅผ ํํ๋ฉฐ, ์์์ ํตํด ํ์ตํ ๋ด์ฉ์ ์๋์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
0. ์์ํ๋ฉฐ,
์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์ด๋ดค์ง๋ง, ์ด๋ป๊ฒ ๋์ํ๋์ง ์ ๋ชจ๋ฅผ ์ ์๋ค. ์ดํดํ๊ธฐ ์ฌ์ด ์์ ์ฝ๋์ ๊ทธ๋ฆผ์ ํตํด ์๋ฆฌ๋ฅผ ์ ์ ์ด ํํค์ณ๋ณด์.
1. ๋น๋๊ธฐ ์ฝ๋ ์์
๋จผ์ , ์๋์ ์์ ์ฝ๋๋ฅผ ๋ณด์.
console.log('์ ๋ค์ด๊ฐ์ด?');
setTimeout(function() {
console.log('๋๋');
}, 1000);
console.log('๋ค์ด๊ฐ๊ฑฐ ๋ง์?');
์ค๊ฐ์ ์๋ setTimeout์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ ์๊ฐ(๋จ์: ms)๋งํผ ๊ธฐ๋ค๋ฆฐ ํ์, ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ ํจ์๋ฅผ ์คํ์ํค๋ ๋ฉ์๋๋ค. ์ด์ ๊ฐ์ด ํน์ ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๋ ํจ์๋ฅผ '์ฝ๋ฐฑ ํจ์'๋ผ๊ณ ๋ถ๋ฅธ๋ค.
2. ์ฝ๋ฐฑํจ์
์ฝ๋ฐฑ ํจ์๋ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๊ณ , ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ฐ์ธ๊ณ ์๋ ์์ ํจ์์ ์ํด ํน์ ์์ ์ ์คํ๋๋ค. ๋น๋๊ธฐ ์ฝ๋ฐฑ์ธ์ง, ๋๊ธฐ ์ฝ๋ฐฑ์ธ์ง์ ๋ฐ๋ผ ์คํ ํ์ด๋ฐ์ด ๋ฌ๋ผ์ง๊ฑฐ๋, ์ฆ์ ์คํ๋ ์๋ ์๋ค.
๋น๋๊ธฐ ์ฝ๋ฐฑ์ผ๋ก๋, ์์ setTimeout๊ณผ ๊ฐ์ด ํจ์๊ฐ ํน์ ์๊ฐ์ด ์ง๋ ํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๊ฑฐ๋, ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๊ฑฐ๋, HTTP ์์ฒญ ํ์ ์คํํ๋ ๋ฑ ๋ค์ํ ์ํฉ์์ ์ฌ์ฉ๋๋ค.
function greeting(name) {
console.log('์๋
ํ์ธ์' + name);
}
function processUserInput(callback) {
const name prompt('์ด๋ฆ์ ์
๋ ฅํด ์ฃผ์ธ์');
callback(name);
}
processUserInput(greeting);
์์ ์์ ์์ processUserInput ํจ์๋ greeting ํจ์๋ฅผ ๋ฃ์ด์ ํธ์ถํ๊ณ ์๋ค. processUserInput ํจ์์์ ์ฌ์ฉ์์๊ฒ ์ด๋ฆ์ ์ ๋ ฅ๋ฐ์ผ๋ฉด, ํด๋น ์ด๋ฆ์ ์ธ์ฌ๋ง๊ณผ ํจ๊ป ์ถ๋ ฅํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋ค.
console.log('์ ๋ค์ด๊ฐ์ด?');
setTimeout(function() {
console.log('๋๋');
}, 1000);
console.log('๋ค์ด๊ฐ๊ฑฐ ๋ง์?');
์กฐ๊ธ ์ ์ ๋ณด์๋ ์ ์ฝ๋๊ฐ ๋๊ธฐ์ ์ผ๋ก ์ฆ, ์ฝ๋๊ฐ ์ ํ์๋ ์์๋๋ก ์คํ์ด ๋๋ค๊ณ ์๊ฐํด๋ณด์. ๊ทธ๋ ๋ค๋ฉด ‘์ ๋ค์ด๊ฐ์ด?’ → (10์ด ๋๊ธฐ) → ‘๋๋’ → ‘๋ค์ด๊ฐ๊ฑฐ ๋ง์?’ ์์ผ๋ก ์ถ๋ ฅ๋ ๊ฒ์ด๋ค. ์ฌ์ค ์ด ์ฝ๋๋ง ๋ด์๋ ์ค๊ฐ์ 10์ด๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค๋ ๊ฒ์ด ์ฌ๊ฐํ๊ฒ ๋๊ปด์ง์ง ์์ ์๊ฐ ์๋๋ฐ, JavaScript ์ฝ๋๊ฐ ์น ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์คํ๋๋ค๋ ์ ์์๋ ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค.
btn.addEventListener('click', () => {
while(true);
});
์์ ๊ฐ์ด ๋ฌดํ๋ฃจํ๋ฅผ ๋๊ฒ๋ ๋ฒํผ์ ๋ง๋ค์๋ค. ์ฝ๊ฐ์ ์์๋ ฅ์ ๋ณดํ์, ์ด ๋ฒํผ์ ๋๋ ์ ๋ ์ค๋ ์๊ฐ์ ์์ํ๋ ์์ ์ ์คํํ๋ค๊ณ ์๊ฐํด๋ณด์. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ฒํผ์ ๋๋ฅด๊ณ , ์์ ์ ์คํ ์ค์ผ ๋๋ ํ ์คํธ๋ฅผ ํด๋ฆญํด๋, ๋ฒํผ์ ํด๋ฆญํด๋ ์๋ฌด ๋ฐ์์ด ์ผ์ด๋์ง ์๋๋ค. ์ด๋ฐ ์ํ๋ก ๊ณ์ํด์ ์์ ์ด ๋๋๊ธฐ๋ฅผ ๊ณ์ ๊ธฐ๋ค๋ ค์ผ ๋๋ ์์ฃผ ์ฌ๊ฐํ ์ํฉ์ด ๋ฐ์ํ๋ค.
3. ๋น๋๊ธฐ์ ์คํ
๋คํํ๋ ์๊น ๋ณด์๋ ์๋ ์ฝ๋๋ ์ค์ ๋ก๋ ๋น๋๊ธฐ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์์๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ฅด์ง ์๊ณ ๋์ํ๋ค.
console.log('์ ๋ค์ด๊ฐ์ด?');
// ์ฌ๊ธฐ์๋ถํฐ -----------------
setTimeout(function() {
console.log('๋๋');
}, 1000);
// ์ฌ๊ธฐ๊น์ง JS backstage์์ ์คํ๋จ
console.log('๋ค์ด๊ฐ๊ฑฐ ๋ง์?');
์ฒ์์ '์ ๋ค์ด๊ฐ์ด?'๊ฐ ์ถ๋ ฅ์ด ๋๊ณ → ‘๋ค์ด๊ฐ๊ฑฐ ๋ง์?’ ์ถ๋ ฅ → (10์ด ๋๊ธฐ) → ‘๋๋’ ์์ผ๋ก ์ถ๋ ฅ์ด ๋๋ค.
์ผ๋จ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ฝ๋๋ฅผ ์งํํ๋ค๊ฐ ์ค๊ฐ์ setTimeout๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋ง๋๋ฉด, (์ ์ฝ๋์ ์ฃผ์์ ๋ณด๋ค์ํผ) ์ด ์ฝ๋๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ทํธ์์ ์คํ์ ํ๊ฒ ๋๋ค. ๊ทธ ๋ค์์ ๋๋จธ์ง ์ฝ๋๋ฅผ ๋ฐ๋ก ์งํํ์ฌ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋๋จธ์ง ์ฝ๋๋ฅผ ๋ฐ๋ก ์งํํ๊ณ , ์ด ๋น๋๊ธฐ ์ฝ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋คํธ์์ ์คํ์ด ๋๋๋ก ๋๋๋ ๊ฒ์ด๋ค.
4. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง
๊ฒฐ๋ก ๋ถํฐ ์ด์ผ๊ธฐํ์๋ฉด, ์ด์ผ๊ธฐํ๊ณ ์ ํ๋ '์ด๋ฒคํธ ๋ฃจํ'๋ ์๋์ ๊ฐ์ด ์ค๋ช ํ ์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ทํธ์์ ๋์ํ๋, ์ด๋ ํ ๋ฌธ๋ฐฑ์ ์ผ๋ถ๋ก์ ๋์ํ๋ ํ๋์ ์ฅ์น
์ด์ ๋ถํฐ๋ ์ด๋ฒคํธ ๋ฃจํ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ๋ค. ์ด๋ฏธ ์๊ณ ์๊ฒ ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ฝ๋๋ฅผ ํด์ํ๊ณ , ์คํํ๊ธฐ ์ํ ์ธํฐํ๋ฆฌํฐ๋ค.
์ฌ๋ฌ๊ฐ์ง ๋ธ๋ผ์ฐ์ ๊ฐ ์์ง๋ง, ๋ํ์ ์ผ๋ก ํฌ๋กฌ์์ ์ฌ์ฉ๋๋ V8 ์์ง ๊ธฐ์ค์ผ๋ก ํฌ๊ฒ Heap๊ณผ ํธ์ถ Stack์ผ๋ก ๊ตฌ๋ถ๋๋๋ฐ, Heap์ ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ‘๋ฉ๋ชจ๋ฆฌ ํ ๋น’์ด ์ผ์ด๋๋ ๋ถ๋ถ ์ฆ, ๋ณ์๋ ๊ฐ์ฒด๋ค์ด ์ ์ฅ๋๋ ์ฐฝ๊ณ ๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํธ์ถ Stack์ ‘ํจ์๊ฐ ํธ์ถ๋๋ ์์๋๋ก ์์ด๋ ์คํ’ ์ด๋ค. ๊ทธ๋์ ํธ์ถ ์คํ์ด ๋น์๋ค๋ ๋ง์ ๊ณง, ์คํํ ํจ์(์ ์คํ ๋ฌธ๋งฅ)๊ฐ ๋จ์์์ง ์๋ค ๋ผ๋ ๋ง๊ณผ๋ ๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
5. ํธ์ถ ์คํ์ ๋์ ๋ฐฉ์
๋ ๋ค๋ฅธ ์์ ์ฝ๋๋ฅผ ํตํด ํธ์ถ ์คํ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณด๊ฒ ๋ค.
function second() {
setTimeout(function() {
console.log('๊ณ ๋
ํ๋ค');
}, 2000);
}
function first() {
console.log('์ ์ฐ๋ฝ์ด ์์ง');
second();
console.log('์ฝ๋ฉ์ด๋ ํด์ผ์ง');
}
first();
์ฒ์์ first ํจ์๊ฐ ์คํ๋๋ฉด first()๊ฐ ํธ์ถ ์คํ์ ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ first ํจ์ ๋ด๋ถ์์ ์ฒซ ๋ฒ์งธ console.log ๊ฐ ์คํ ๋๋ค. '์ ์ฐ๋ฝ์ด ์์ง..' ํ๊ณ ๋ก๊ทธ๋ฌธ์ด ์ถ๋ ฅ๋๋ฉด ์ด์ console.log ๋ ์คํ์ด ๋๋๊ธฐ ๋๋ฌธ์ ๋ฆฌํดํ๊ณ ํธ์ถ ์คํ์์ ๋น ์ ธ๋์จ๋ค.
๋ค์์ second () ๊ฐ ๋ค์ด์จ๋ค.
๊ทธ ๋ค์, ์ด ์์์ setTimeout (fn, 2000) ๊ฐ ์คํ → setTimeout์ด ์คํ๋๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ทํธ์์ ํ์ด๋จธ๊ฐ ์๋ ํ๋๋ฐ, ํ์ด๋จธ๋ฅผ ์๋์ํค๊ณ setTimeout์ ์๊ธฐ ์ญํ ์ ๋๋๊ธฐ ๋๋ฌธ์ return → ๊ทธ๋ฆฌ๊ณ second ํจ์์๋ setTimeout ํจ์ ๋ฐ์ ์์ผ๋, setTimeout์ด ๋๋๋ฉด second ํจ์๋ ๋ฆฌํด → ๊ทธ ๋ค์์ ๋ ๋ฒ์งธ console.log๊ฐ ์คํ๋๋ฉฐ '์ฝ๋ฉ์ด๋ ํด์ผ์ง' ํ๋ฉฐ ๋ฆฌํด → first ํจ์๋ return์ ํ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์, ํ์ด๋จธ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ทํธ์์ ์ง์ ๋ ์๊ฐ์ ๋ชจ๋ ์นด์ดํธ ํ๋ฉด, ํธ์ถ ์คํ์ด ๋น์ด ์์ ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ์คํ๋๋ฉด์ console.log('๊ณ ๋
ํ๋ค')๊ฐ ์ถ๋ ฅ์ด ๋๋ค.
6. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด
์๋ฐ์คํฌ๋ฆฝํธ ํํ ์๋ค์ํผ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด๋ค. ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด๋ผ๋ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ํธ์ถ ์คํ์ ํ๋๋ง ์ฌ์ฉํ๋ค๋ ๋งฅ๋ฝ์์ ๋์จ ๋ง์ด๋ค. ์ด๋ ๊ณง ๋์์ ํ ๊ฐ์ง ์ผ๋ง ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ป์ด๋ค. ๊ทธ๋ฐ๋ฐ ์์ ์์์์ ๋ดค๋ ๊ฒ์ฒ๋ผ
ํจ์๊ฐ ์คํ๋๋ ํธ์ถ ์คํ์ด ํ๋๋ฟ์ด๋ฉด์,
๋น๋๊ธฐ์์ฒญ ์ง์๊ณผ ๋์์ฑ์ ๋ํ ์ฒ๋ฆฌ๋ ๋๊ฐ ํ๋ ๊ฑธ๊น?
์ด๊ฒ์ ์กฐ๊ธ ๋ ์ดํดํ๊ธฐ ์ํด์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์์ผ๋ฅผ ์ด์ง ๋ ๋ํ, ์น ๋ธ๋ผ์ฐ์ ์ ์ฒด๋ฅผ ๋ณผ ํ์๊ฐ ์๋ค.
7. ๋ธ๋ผ์ฐ์ ์ ๊ตฌ์กฐ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฏธ ๋งํ๋ฏ์ด ํ ๋ฒ์ ํ๋์ ์์ ๋ฐ์ ์ฒ๋ฆฌํ์ง ๋ชปํ์ง๋ง, ์น ๋ธ๋ผ์ฐ์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๋ง๊ณ ๋ Web API, ์ด๋ฒคํธ ๋ฃจํ, ์ฝ๋ฐฑ ํ ๋ฑ์ ๊ฐ์ง๊ณ ์๋ค.
์ฐธ๊ณ ๋ก, ์๊น ๋ดค๋ setTimeout์ ํฌํจํด์ DOM ๋ฉ์๋, HTTP ์์ฒญ ๊ฐ์ ๊ฒ๋ค์ ์ ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฐ๊นฅ์ ์๋ Web API์์ ์ ๊ณตํ๋ ๋ฉ์๋๋ค์ด๋ค.
Web API ๋ฉ์๋๋ค์ ์๋์ ๋ง์น๋ฉด ์ด๋ค์ ๋น๋๊ธฐ ๋ฉ์๋๋ค์ด๊ธฐ ๋๋ฌธ์, ์๋์ ๋ง์น๊ณ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฝ๋ฐฑ ํ(= ํ ์คํฌ ํ)์ ์ง์ด๋ฃ๋๋ค. ์ฌ๊ธฐ์ ์ฝ๋ฐฑ ํจ์๋ค์ด ์คํ์ ๋๊ธฐํ๊ฒ ๋๋ค.
์ฆ, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ์์ฒด๋ ์ฑ๊ธ ์ค๋ ๋์ด์ง๋ง, ์ค์ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋์๋๋ ํ๊ฒฝ์ธ ์น ๋ธ๋ผ์ฐ์ ์๋ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๊ฐ ์ฌ์ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์์ธํ ๋งํ์๋ฉด, Web API๊ฐ ๋ฉํฐ ์ค๋ ๋๋ก ๋์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ด๊ฒ๋ค๊ณผ ์ํธ ์ฐ๋์ ํ๊ธฐ ์ํด์ ํ์ํ ์ฅ์น๊ฐ ์ฝ๋ฐฑ ํ์ ์ด๋ฒคํธ ๋ฃจํ๋ค.
8. ๋ธ๋ผ์ฐ์ ๊ด์ ์์ ๋ณด๋ ์ด๋ฒคํธ ๋ฃจํ ๋์ ๋ฐฉ์
์ด์ ์๊น ๋ดค๋ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ธ๋ผ์ฐ์ ์ ์ฒด์ ์ธ ๊ด์ ์์ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ๋ฒ ์ดํด๋ณด๋๋ก ํ์.
function second() {
setTimeout(function() {
console.log('๊ณ ๋
ํ๋ค');
}, 2000);
}
function first() {
console.log('์ ์ฐ๋ฝ์ด ์์ง');
second();
console.log('์ฝ๋ฉ์ด๋ ํด์ผ์ง');
}
first();
์ฒ์์ first ํจ์๊ฐ ์คํ๋๊ณ , '์ ์ฐ๋ฝ์ด ์์ง..' ๋ผ๊ณ second ์คํ → setTImeout ๊น์ง๋ ์ด์ ๊ณผ ๋๊ฐ๋ค. ์ฌ๊ธฐ์ ์๊น ์ ์ setTimeout()์ Web API์์ ์คํ์ด ๋๋ค๊ณ ํ๋ค. ๊ทธ๋์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ ์ฝ๋ฐฑํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ํ์ด๋จธ๋ฅผ Web API์์ ์์ฑํ๊ฒ ๋๋ค.
ํ์ด๋จธ๋ฅผ ์์ฑํ๋ ๊ฒ์ผ๋ก setTimeout์ ์ญํ ์ ๋์ด ๋๊ณ setTimeout์ return → second ํจ์๋ return → ๊ทธ ๋ค์์ '์ฝ๋ฉ์ด๋ ํด์ผ์ง’๋ผ๋ console.log ๋ฌธ์ด ์ถ๋ ฅ → ์ดํ first ํจ์๋ returnํ๋ค. (console.log๋ฅผ ์ ๋ถ ์ถ๋ ฅ์ ํ์ผ๋)
์ด์ Web API์์ ์คํ ์ค์ธ ํ์ด๋จธ๋ง ๋จ์ ์ํ์ธ๋ฐ, ํ์ด๋จธ๊ฐ ์ ํด์ง ์๊ฐ์ ๋ชจ๋ ์ธ๊ณ ๋๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋ ๊น? ํ์ด๋จธ ๊ฐ์ฒด๋ ์ ํด์ง ์๊ฐ ๋๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฝ๋ฐฑ ํ์ ๋ฃ๊ณ ์๊ธฐ๋ ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ์ฝ๋ฐฑ ํ์์ ์คํ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค. ์ด ์ฝ๋ฐฑ ํจ์๋ ๊ฒฐ๊ตญ์๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์คํ๋๋ ค๋ฉด ํธ์ถ ์คํ์ ๋ค์ด๊ฐ์ผ ํ๋ค.
์ด๋ ์ด์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ฌ๊ธฐ์ ๋์์ ํ๊ฒ ๋๋๋ฐ, ์ ์ ์ด๋ฒคํธ ๋ฃจํ์ ์ญํ ์ ๋ํด์ ์์๋ณด๊ณ ๊ฐ๊ฒ ๋ค.
9. ์ด๋ฒคํธ ๋ฃจํ์ ์ญํ
์ด๋ฒคํธ ๋ฃจํ๋ ํธ์ถ ์คํ๊ณผ ์ฝ๋ฐฑ ํ๋ฅผ ๊ณ์ํด์ ์ฃผ์ํ๊ณ ์๋ค. ๊ทธ๋ฌ๋ค๊ฐ ํธ์ถ ์คํ์ด ๋น์ด์๋ค๊ณ ํ๋ฉด, ์ฝ๋ฐฑ ํ์ ๋จผ์ ๋ค์ด์จ ์์๋๋ก ์ฝ๋ฐฑ ํ ์๋ ์ฝ๋ฐฑ ํจ์ ๋ค์ ํธ์ถ ์คํ์ผ๋ก ์ฐจ๋ก์ฐจ๋ก ์ง์ด๋ฃ๋ ์ญํ ์ ํ๊ณ ์๋ค.
์ฝ๋ฐฑ ํ๋ฅผ ์ง์ผ๋ณด๋ค๊ฐ '์ฝ๋ฐฑ ํจ์๊ฐ ์๋ค?' & 'ํธ์ถ ์คํ์ด ๋น์ด์๋ค?' → ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถ ์คํ์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๋ฒคํธ ๋ฃจํ์ ์ญํ ์ด๋ค. ์ด๋ ํธ์ถ ์คํ์ด ๋น์ด์์ด์ผ๋ง ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ ์คํ์ผ๋ก ์ด๋ํ ์ ์๋ค๋ ์ฌ์ค๋ ์์ง ๋ง์.
function second() {
setTimeout(function() {
console.log('๊ณ ๋
ํ๋ค');
}, 2000);
}
function first() {
console.log('์ ์ฐ๋ฝ์ด ์์ง');
second();
console.log('์ฝ๋ฉ์ด๋ ํด์ผ์ง');
}
first();
์๋ ์ผ์ชฝ ๊ทธ๋ฆผ์์๋ ์ฝ๋ฐฑ ํ์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋๊ธฐ์ค์ด๋ค. ๊ทผ๋ฐ first ํจ์๊ฐ ์คํ์ ๋ง์ณค๊ธฐ ๋๋ฌธ์ ์ง๊ธ ์ง๊ธ ํธ์ถ ์คํ์ด ๋น์ด์๋ ์ํฉ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ด๋ฒคํธ๋ฅผ ๋๋ฌ๋ณด๊ณ ์๋ค๊ฐ ์ฝ๋ฐฑ ํ๊ฐ '์ฝ๋ฐฑ ํจ์๊ฐ ์์ด' & 'ํธ์ถ ์คํ์ด ๋น์ด์์ด' ํ๋ฉด ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฎ๊ฒจ์ค๋ค.
๊ทธ๋ฌ๊ณ ๋์ ์๊น ๋ดค๋ '๊ณ ๋ ํ๋ค'๋ฅผ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด console.log๊ฐ ์ถ๋ ฅ์ด ๋๊ณ return๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด์ ์ธ ์ฝ๋๊ฐ ์ข ๋ฃ๊ฐ ๋๋ ๊ฒ์ด๋ค.
10. ์์ฉ ์์ : ๋น๋๊ธฐ์ try-catch
์ด์ ์ด๋ฒคํธ ๋ฃจํ ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ๋๋ต์ ์ผ๋ก ํ๋ฒ ์ดํด ๋ณด์์ผ๋, ๋๋จธ์ง ์ผ์ด์ค๋ฅผ ํตํด ๋ ์์ฉ์ ํด ๋ณด๊ฒ ๋ค. ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์คํํ๋ค ๋ณด๋ฉด try-catch๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ฌ๋ฅผ ์ก์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
$('.btn').click(function() { // (A)
try {
$.getJSON('/์ด๋ฐ์ ๋ฐ ์ฃผ์', function(res) { // (B)
// ์ฌ๊ธฐ์ Error ๋ฐ์
});
} catch (e) {
console.log('์๋ณด! ์๋ฌ ๋ฐ์:' + e.message);
}
});
์ ์ฝ๋์์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ฝ๋ฐฑ ํจ์ A๋ฅผ ์คํํ๋๋ก ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํด ๋๊ณ , A ์์ try-catch ๋ฌธ์ ์ฌ์ฉํ๊ณ ์๊ธฐ๋ ํ๋ค. ๊ทธ๋ฆฌ๊ณ try๋ฌธ ์์์ getJSON ์ด๋ผ๋, HTTP ์์ฒญ์ ๋ณด๋ด์ JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, getJSON์ ์ฝ๋ฐฑํจ์์ธ (B) ์์์ ์๋ฌ ๋ฐ์ ํ๊ณ ์๋ค.
์ธ๋ป ๋ณด๊ธฐ์๋ ์ฝ๋ฐฑํจ์ (A) ๋ด๋ถ์์ ์ฝ๋ฐฑ ํจ์ (B)๊ฐ ์๋ ๋ชจ์์ด๋, ์ฝ๋ฐฑํจ์ (A)์ try-catch ๋ฌธ์ด ์ฝ๋ฐฑ ํจ์ (B)์์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ก์ ์ ์์ง ์์๊น ์๊ฐํ ์ ๋ ์๊ฒ ๋ค.
ํ์ง๋ง ์ฌ์ค ์ด try-catch๋ฌธ์ B์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ๋ชปํ๋ค. ์ ๊ทธ๋ฐ์ง ๋ด๋ถ ๋์์ ์ดํด๋ณด๋ฉด์ ํจ๊ป ์์๋ณด๋๋ก ํ์.
11. try-catch๋ฌธ ๋ด๋ถ ๋์ ์ดํด๋ณด๊ธฐ
์ฐ์ ์๋์ ๊ฐ์ด ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ๋ฑ๋ก๋ผ ์๋ ์ํฉ์์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ฝ๋ฐฑํจ์ A๊ฐ ์ฝ๋ฐฑ ํ๋ก ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ํธ์ถ ์คํ์ด ๋น์ด ์์ผ๋, ์๋์ ๊ฐ์ด A๊ฐ ์ด๋ฒคํธ๋ฃจํ์ ์ํด ํธ์ถ ์คํ์ผ๋ก ์ด๋ํ๋ค. A์ ๋ด๋ถ์์ getJSON ๋ฉ์๋๊ฐ ์คํ๋๋ฉด
HTTP ์์ฒญ์ ๋ณด๋ด๋ XMLHTTPRequest ๊ฐ์ฒด๊ฐ ์ฝ๋ฐฑ ํจ์์ ํจ๊ป webAPI ์์ฑ์ด ๋๋ค. ๊ทธ๋ผ getJSON ๋ฉ์๋๋ HTTP ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ผ๋ก ์๊ธฐ ํ ์ผ์ ๋ง์ณค์ผ๋ ๋ฆฌํด์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ A ํจ์ ์ญ์ ๋ด๋ถ์ getJSON๋ง ์์์ผ๋ getJSON์ด ์๊ธฐ์ ์คํ์ ๋ง์น๊ณ return ํ๋ฉด, A๋ returnํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ Web API์ XMLHTTPRequest ๊ฐ์ฒด๋ง ๋จ์ ์ํฉ์ด๋ค.
์๋์ ์ผ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด, XMLHTTPRequest ๊ฐ์ฒด๋ HTTP ์์ฒญ์ ๋ณด๋ด๋ฉด ์๊ธฐ๋ ์ฌ๋ผ์ง๊ณ , ์ฝ๋ฐฑ ํจ์ B๊ฐ ์ฝ๋ฐฑ ํ์ ์๋์ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด, ์ญ์๋ ํธ์ถ ์คํ์ด ๋น์ด ์์ ๋ B๊ฐ ์ด๋ฒคํธ ๋ฃจํ์ ์ํด ํธ์ถ์คํ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ B๊ฐ ํธ์ถ์คํ์ผ๋ก ์ฎ๊ฒจ์ง๋ ์ ์์ ์์๋ A๊ฐ ์ด๋ฏธ ์คํ์ ๋ง์น๊ณ return์ ํ ์ํฉ์ด๋ค.
์ฆ, A์ B๋ ์์ ํ ๋ค๋ฅธ ๋ฌธ๋งฅ ์์์ ๊ฐ๊ฐ ๋์์ ํ๊ณ ์๋ค ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
๊ทธ๋์ A ๋ด๋ถ์ ์๋ try-catch ๋ฌธ์ด B์์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ก์๋ด์ง ๋ชปํ๋ ๊ฒฐ๋ก ์ด ๋์ค๋ ๊ฒ์ด๋ค.
12. try-catch๋ฌธ ์๋ฌ๋ฅผ ์ก๊ณ ์ถ๋ค๋ฉด
๋ง์ฝ, B์์ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ try-catch๋ก ์ก์๋ด๊ณ ์ถ๋ค๋ฉด ํด๋ต์ ๊ฐ๋จํ๋ค. ์๋์ ๊ฐ์ด B ์์ try-catch๋ฌธ์ ์ง์ด ๋ฃ์ด ์ฃผ๋ฉด ๋๋ค.
$('.btn').click(function() { // (A)
$.getJSON('/์ด๋ฐ์ ๋ฐ ์ฃผ์', function(res) { // (B)
try {
} catch (e) {
console.log('์๋ณด! ์๋ฌ ๋ฐ์:' + e.message);
}
});
});
13. setTimeout(callback, 0)
๋ง์ง๋ง์ผ๋ก setTimeout 0์ด์ ๋ํด ์์๋ณด๊ฒ ๋ค. setTimeout 0์ด๋ ํ๋ก ํธ์๋ ํ๊ฒฝ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ ์ข ์ข ๋ณผ ์ ์๋ ์ฝ๋๋ค. 0์ด ํ์ ์คํ๋๋ค๋ ๋ง์ ๋ฌธ๋งฅ์์ผ๋ก ์ฆ์ ์คํ ๋๋ค๋ ๋ง ๊ฐ๋ค. ๊ทธ๋์ ์ฝ๋๊ฐ ์ ํ์๋ ์์๋๋ก ์คํ ๋์ง ์์๊น? ๋ผ๊ณ ์๊ฐํ ์ ์๊ฒ ์ง๋ง, ์ฌ์ค์ ๊ทธ๋ ์ง ์๋ค.
์๋ ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด์.
console.log('ํธ๋์ด');
setTimeout(function() {
console.log('์ดํฅ!');
}, 0);
console.log('๋ก ํ๋๋ง ์ค!');
์ผ๋จ ์ฒ์์ 'ํธ๋์ด'๊ฐ ์ถ๋ ฅ์ด ๋๋ค. ๊ทธ ๋ค์์ returnํ๊ณ setTimeout์ด ์คํ์ด ๋๋ค. ๊ทธ ๋ค์์ return์ ํ๊ณ setTimeout์ด ์คํ์ด ๋๋ค.
์ฌ๊ธฐ์ setTimeout์ 0์ด์ด๋, 0์ด๋ฅผ ์นด์ดํธํ๋ ํ์ด๋จธ ๊ฐ์ฒด๋ฅผ Web API์ ์์ฑ์ ํ๋ค. ์ด๋, ํ์ด๋จธ๋ 0์ด๋ฅผ ์นด์ดํธ ํ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ฐ๋ก ์ฝ๋ฐฑ ํ์ ๋ค์ด๊ฐ์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋, ํธ์ถ ์คํ์ด ๋น์ด์์๊น?
์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋น์ด์์ง ์๋ค. ์๋ํ๋ฉด console.log('๋ก ํ๋๋ง ์ค!’)๊ฐ ๋จ์ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ '๋ก ํ๋๋ง ์ค!' ๊ฐ ๋จผ์ ์ถ๋ ฅ์ด ๋๊ณ , ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ ์คํ์ผ๋ก ์ด๋ํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ด์ '์ดํฅ!' ์ ์ถ๋ ฅํ๊ณ , ์คํ์ ๋ง์น๊ฒ ๋๋ ๊ฒ์ด๋ค.
14. ๋ง์น๋ฉฐ,
์ด๋ฒคํธ ๋ฃจํ์ ๋์ ์๋ฆฌ์ ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ๋ ๋ค์ ๊ฑธ์ณ ์ค๋ช ํด ๋ณด์๋ค. ํ๋ฒ์ ์ดํดํ๊ธฐ ์ด๋ ต๊ณ ์กฐ๊ธ ๋ณต์กํด ๋ณด์ผ ์ ์์ง๋ง, ๊ทธ๋ฆผ๊ณผ ํจ๊ป ๋ฐ๋ณต์ ์ผ๋ก ์ฝ๋ค๋ณด๋ฉด ์ฐจ์ธฐ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
๐ ๋ด์ฉ ์ฐธ์กฐ
- Youtube ์ฐ์ํํ ํฌ: [10๋ถ ํ ์ฝํก] ๐ ํผํฐ์ ์ด๋ฒคํธ๋ฃจํ
'๐ Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์๋๋ฉด ์ฌ๋ฏธ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ญ์ฌ (1) | 2023.09.10 |
---|---|
์ ES6๋ถํฐ ํด๋์ค ๊ฐ๋ ์ด ์ถ๊ฐ๋๊ฑธ๊น? (0) | 2023.09.07 |
JavaScript ์์ ์๋ฃํ๊ณผ ์ฐธ์กฐ ์๋ฃํ์ ๋ํด ์ฝ๊ฒ ์ดํดํด ๋ณด์. (1) | 2023.03.02 |
JavaScript ๊ฐ์ฒด ๊ธฐ์ด ๊ฐ๋ - ๊ตฌ๋ถ, ์กฐํ, ๊ฐ์ฒด ๋ค๋ฃจ๊ธฐ (0) | 2023.03.01 |
JavaScript ๋ฐฐ์ด ๊ธฐ์ด ๊ฐ๋ - ์ธ๋ฑ์ค, ๋ฐ๋ณต, ๋ฉ์๋ (0) | 2023.02.27 |
๋๊ธ