Jieunny์ ๋ธ๋ก๊ทธ
[JS] JS์ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ ๋ณธ๋ฌธ
๐ ๊ธฐ์ ๋ฉด์ ์ง๋ฌธ์ ๋ํด ์์๋ณด๋ค๊ฐ ๋ด์ฉ์ด ๋ง์์ ๋ฐ๋ก ์ ๋ฆฌ
๐ฃ ๋๊ธฐ์ ์ฒ๋ฆฌ & ๋น๋๊ธฐ์ ์ฒ๋ฆฌ
โ๏ธ ๋๊ธฐ์ ์ฒ๋ฆฌ : ์๋ฒ์์ ์์ฒญ์ ๋ณด๋์ ๋ ์๋ต์ด ๋์์์ผ ๋ค์ ๋์์ ์คํํ ์ ์๋ค.
โ๏ธ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ : ์๋ฒ์์ ์์ฒญ์ ๋ณด๋์ ๋ ์๋ต ์ํ์ ์๊ด์์ด ๋ค์ ๋์์ ์คํํ ์ ์๋ค.
๐ฃ ์๋ฐ ์คํฌ๋ฆฝํธ๋ ์ด๋ค ์ธ์ด์ธ๊ฐ?
โ๏ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด(๋๊ธฐ์ ์ผ ์ฒ๋ฆฌ)
โ๏ธ ํ๋์ ํ ์์ญ๊ณผ ํ๋์ ์ฝ ์คํ์ ๊ฐ์ง๋ค. (ํ๋ฒ์ ํ๋์ ์ผ ๋ฐ์ ๋ชปํ๋ค๋ ์๋ฏธ)
function SignThreadTest() {
console.log(1);
for( let i=0; i<10000; i++ ) {
console.log('์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค.');
}
console.log(2);
}
// '์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ค.'๊ฐ 10,000๋ฒ ์คํ์ด ์๋ฃ ๋ ๋๊น์ง
// ์ฝ์ ์ฐฝ์ '2' ๊ฐ ์ฐํ๋ ๊ฒ์ ๊ธฐ๋ค๋ ค์ผํ๋ค.
SignThreadTest();
โ ์ฝ ์คํ์ด๋?
โฐ ์ฝ ์คํ์ ์ฝ๋๋ฅผ ์ฝ๊ณ ํจ์๊ฐ ์คํ๋๋ ์์๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค.
โฐ ํจ์๋ฅผ ์คํํ๋ ค๋ฉด ํจ์๋ฅผ ์คํ ๊ฐ์ฅ ์์ ๋ฃ๊ณ , ํจ์์์ ๋ฆฌํด์ด ์ผ์ด๋๋ฉด ์คํ์ ๊ฐ์ฅ ์์ชฝ์ผ๋ก ํจ์๋ฅผ ๊บผ๋ธ๋ค.
โ๏ธ ์ฑ๊ธ ์ค๋ ๋๋ ๋ธ๋กํน์ ๋ง๋ ๋ค.
โฐ ๋๊ธฐ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋ ์๋ต์ด ์๋ฃ๋ ๋๊น์ง ๋ฉ์ถฐ์๋๋ค.
โฐ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ์์ฒญ์ด ์ฝ ์คํ์ ๋ธ๋กํนํ์ฌ ๋ธ๋ผ์ฐ์ ๋ ๋ค๋ฅธ ์ผ์ ํ ์๊ฐ ์๋ค.
โ ๋ธ๋กํน์ด๋?
โฐ ๋๋ฆฌ๊ฒ ๋์๋๋ ์ฝ๋
โฐ ๋๋ฆฐ ๋์์ด ์คํ์ ๋จ์ ์๋ ๊ฒ
โฐ ์น ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๊ฐ ์คํ๋๋๋ฐ ์ฝ๋๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์ ์ ๊ฐ ํด๋ฆญ์ ํด๋ ์ด๋ ํ ๋ฐ์๋ ํ์ง ์๋ ์ํ
โฐ ์ฝ ์คํ์ด ๋ฉ์ถ ์ํ
๐ฃ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ์ ๋ ผ ๋ธ๋กํน
๐ ๋๊ธฐ์ ์ฒ๋ฆฌ์ ๋ฌธ์ ์ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ AJAX ์์ฒญ์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ๋ค.
โฐ ๋ฌธ์ ์ : ํจ์จ์ ์ด์ง ๋ชปํจ
โฐ ๋ธ๋ผ์ฐ์ : ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ํ๊ฒฝ(๋ฐํ์)
โ AJAX ๋?
โฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์์ฒญํ๋ ๊ฒ
โฐ ์ ์ฒด ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํ์ง ์์๋ ํ์ด์ง ์ผ๋ถ๋ง์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒ
โ๏ธ ์น ๋ธ๋ผ์ฐ์ ์ Web APIs๋ ๋น๋๊ธฐ์ ๋ก ์ฒ๋ฆฌํ๋ค.
โฐ ์น ๋ธ๋ผ์ฐ์ ์ Web APIs์๋ setTimeout, DOM, AJAX๊ฐ ์๋ค.
โฐ + ์ด๋ฒคํธ ๋ฃจํ์ ์ฝ๋ฐฑ ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
โฐ ์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด๋ ๋น๋๊ธฐ์ ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ด์ ๋ฐํ์ ์์ ์ง์ํ๋ API๋ก ๋น๋๊ธฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
โ ๋ฐํ์์ด๋?
โฐ ๋ฐํ์ ํ๊ฒฝ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๊ตฌ๋๋๋ ํ๊ฒฝ์ด๋ค.
โฐ Js๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ค๋ฉด ๋ฐํ์ ํ๊ฒฝ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋๊ณ , Node.js์์ ์คํ๋๋ค๋ฉด Node.js๊ฐ ๋๋ค.
โ Web API ๋?
โฐ ์น ์๋ฒ ๋๋ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ์ดํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค ์ด๋ค.
โฐ HTTP ์๋น์ค์ด๊ณ , ๋ค์ํ ํด๋ผ์ด์ธํธ์์ ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ์ค๊ณ๋์ด ์๋ค.
โ๏ธ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์์ ๋ธ๋กํน์ ํด๊ฒฐํ ์ ์๋ค. (๋
ผ ๋ธ๋กํน)
โฐ ์น ๋ธ๋ผ์ฐ์ ์ Node.js์๋ ๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ๋ธ๋กํน ๋ฉ์๋๊ฐ ๊ฑฐ์ ์๊ณ ๋๋ถ๋ถ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ๋ ๋ง๋ค์ด์ก๋ค.
โฐ ์ด๋ ์ด๋ค ์ฝ๋๋ฅผ ์คํํ๋ฉด ๊ฒฐ๊ตญ ์ฝ๋ฐฑ์ ๋ฐ๊ณ ๋์ค์ ์คํํ๋ค๋ ๋ป์ด๋ค.
โฐ ํจ์ ํธ์ถ ์ ๋น์ฅ ์คํ(๋๊ธฐ)ํ๋ ๊ฒ์ด ์๋๋ผ, ์ผ๋จ ์ด๋ ๊ณณ์ ์์๋๊ณ (๋น๋๊ธฐ) ๋์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ฒญ์ด ์๋ฃ๋ ์์๋๋ก ์ฒ๋ฆฌํ๋ค๋ ๋ป์ด๋ค.
โ ์ฝ๋ฐฑ ํจ์๋?
โฐ ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ค ํจ์์ด๋ค.
โฐ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ๋ฐ์ ํจ์๋ ์ผ๋จ ๋๊ฒจ๋ฐ๊ณ , ๋๊ฐ ๋๋ฉด ๋์ค์ ํธ์ถ(called back)ํ๋ค.
โฐ ์ฆ์ ์คํํ ์๋ ์๋ค.
๐ฃ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
๐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์์ ์ ๊ณตํ๋ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ ๋ง๋๋ ๊ฒ์ ์ด๋ฒคํธ ๋ฃจํ์ด๋ค.
โ๏ธ ์ด๋ฒคํธ ๋ฃจํ์ ๋น๋๊ธฐ ํจ์ ์คํ
โฐ ์ฝ ์คํ๊ณผ ์ฝ๋ฐฑ ํ๋ฅผ ์ฃผ์ํ๋ ์ญํ ์ ํ๋ค.
โฐ ์ฝ ์คํ์ด ๋น์ด์์ผ๋ฉด ํ์ ์ฒซ ๋ฒ์งธ ์ฝ๋ฐฑ์ ์คํ์ ์์ ์คํํ ์ ์๊ฒ ํ๋ค.
โฐ ์ด๋ฒคํธ ๋ฃจํ๋ ์ฝ ์คํ์ด ๋น์ด์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ์ฝ๋ฐฑ ํ์ ์๋ ์ฝ๋ฐฑ์ ์ฝ ์คํ์ ๋ฃ์ด ์ฃผ๋ ์ญํ ์ ํ๋ค.
โฐ Web API์ ์ฝ๋ฐฑ์ด ์๋ฃ๋์๋ค๋ฉด ์ฝ๋ฐฑ์ ํ์ ์์ด๊ฒ ๋๊ณ , ์ด๋ฒคํธ ๋ฃจํ์ ์ํด์ ์คํ๋๋ค.
โฐ ์ด ๊ณผ์ ์ ๋น๋๊ธฐ ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ด๋ค.
โ ์ฝ๋ฐฑ ํ๋?
โฐ ์ฝ๋ฐฑ ํ๋ Web API ๊ฒฐ๊ณผ๊ฐ์ ์์๋๋ ํ์ด๋ค.
โฐ ์๋ฅผ ๋ค์ด, ์๋ฐ์คํฌ๋ฆฝํธ์์ setTImeout(cd, 5000)์ ํธ์ถํ๋ฉด Web API๋ ํ์ด๋จธ๋ฅผ ๋์์์ผ 5์ด ํ์ ์ฝ๋ฐฑ ํ์ cd๋ฅผ ์๋๋ค.
โ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋ง์ง ๋ง๋ผ๋ ์๋ฏธ(๋ธ๋กํน)
โฐ ์คํ์ ํ์์์ด ๋๋ฆฐ ์ฝ๋๋ฅผ ์์์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ ์ผ์ ๋ชปํ๊ฒ ๋ง๋ค์ง ๋ง๋ผ๋ ๋ป์ด๋ค.
โ๏ธ ์ ๋ฆฌ
โ๏ธ JS ์์ง์ ๋น๋๊ธฐ ํจ์๊ฐ ์๋ค. (JS๋ ์ฑ๊ธ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๋ฏ๋ก)
โ๏ธ JS ๋ฐํ์(๋ธ๋ผ์ฐ์ , Node.js)์์ ์ ๊ณตํ๋ API๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
โ๏ธ JS๋ ์ฝ ์คํ์ด ํ๋๋ฐ์ ์๋ค.
โ๏ธ ๋ค์ ๋งํ๋ฉด, ๋น๋๊ธฐ ํจ์๋ฅผ ์ ๊ณตํ๊ณ ๋น๋๊ธฐ ํจ์๊ฐ ์ฝ ์คํ์ ์์ด๋๋ก ๋์์ฃผ๋ ๊ฒ์ JS ๋ฐํ์์์ ์ ๊ณต๋๋ ๊ฒ์ด๋ค.
๐ฃ ๋น๋๊ธฐ์ ์ฃผ์ ์ฌ๋ก
1๏ธโฃ DOM Element์ ์ด๋ฒคํธ ํธ๋ค๋ฌ
โฐ ๋ง์ฐ์ค, ํค๋ณด๋ ์
๋ ฅ (click, keydown ๋ฑ)
โฐ ํ์ด์ง ๋ก๋ฉ
2๏ธโฃ ํ์ด๋จธ
โฐ ํ์ด๋จธ API (setTImeout ๋ฑ)
โฐ ์ ๋๋ฉ์ด์
API
3๏ธโฃ ์๋ฒ์ ์์ ์์ฒญ ๋ฐ ์๋ต
โฐ Fetch API
โฐ AJAX
๐ฃ ๋น๋๊ธฐ ์ ์ดํ๋ ๋ฐฉ๋ฒ
1๏ธโฃ ์ฝ๋ฐฑ
โฐ ์ฝ๋ฐฑ์ ์ด์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์ฝ๋ฐฑ ์ง์ฅ์ ๋ง๋ค ์ ์๋ค.
โ ์ฝ๋ฐฑ์ง์ฅ
โฐ ์ฝ๋ฐฑ ์์ ํจ์ ํธ์ถ์ด ๋ฐ๋ณต๋์ด ์ฝ๋์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ด ๊ฐ๋นํ๊ธฐ ํ๋ค ์ ๋๋ก ๊น์ด์ง๋ ํ์
๐จ ์ฝ๋ฐฑ์ง์ฅ ํ์ถ ๋น๋๊ธฐ ์ ์ด ๋ฐฉ๋ฒ
1๏ธโฃ Promise
โฐ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๊ณ ์ธ์๋ก ์ฝ๋ฐฑ์ ๋ฐ๋๋ค.
โฐ Promise๋ฅผ ๋ฐํํ๋ค.
โฐ Promise๋ ํธ์ถ๋ ๋ ๋ฐ๋ก ์คํ๋์ง๋ง, ๊ทธ ์์ ์ฝ๋ฐฑ์ resolve, reject ๋ ์ค ํ๋๊ฐ ํธ์ถ ๋๊ธฐ ์ ์ then ๋๋ catch๋ก ๋์ด๊ฐ์ง ์๋๋ค.
โฐ resolve, reject ๋ก ์ฑ๊ณต ํน์ ์คํจ๋ก ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋ด์ด ๋ค์ ์์
์ ์ ์ดํ ์ ์๋ค. (๋น๋๊ธฐ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค)
โฐ then์ผ๋ก ์์
์ ์ด์ด๊ฐ๊ธฐ ์ํด์๋ resolve() ํจ์๋ฅผ ํธ์ถํ๋ค.
โฐ ์์
์ ์ค๋จ ๋๋ err์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์๋ reject() ํจ์๋ฅผ ํธ์ถํ๋ค.
// Promise ๊ธฐ๋ณธ ํจํด 1 : ์ฑ๊ณต์ธ ๊ฒฝ์ฐ
function fn() {
new Promise((resolve, reject) => {
console.log('ํ๋');
// ์คํจ์ธ ๊ฒฝ์ฐ reject() ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
// ๊ทธ๋ฌ๋ฉด then()์ ๊ฑด๋๋ฐ๊ณ catch()๊ฐ ์คํ๋๋ค.
resolve();
})
.then(() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('๋');
resolve();
}, 0);
});
})
.then(() => {
console.log('์
');
})
.catch((err) => {
console.log('err ', err);
});
}
1๏ธโฃ Promise + async/await
โฐ Promise๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ผ๋ then์์ promise...then์์ promise ์ฒ๋ผ ์ฝ๋ฐฑ์ง์ฅ ํ์์ด ๊ฐ๋ฅํจ์ ์ ์ ์๋ค.
โฐ ๋น๋๊ธฐ ์์
์ ์ํํ๊ณ ์ ํ๋ ํจ์ ์์ async๋ฅผ ํ๊ธฐํ๊ณ , ํจ์ ๋ด๋ถ์์ ์ค์ง์ ์ธ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์์น๋ง๋ค await๋ฅผ ํ๊ธฐํ๋ ๊ฒ๋ง์ผ๋ก ๋ค์ ๋ด์ฉ์ Promise๋ก ์๋ ์ ํํ๊ณ ํด๋น ๋ด์ฉ์ด resolve๋ ์ดํ์์ผ ๋ค์์ผ๋ก ์งํ๋๋ค.