JavaScript ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ ๋ฆฌ
๋ชฉ์ฐจ
1. ๋๊ธฐ vs ๋น๋๊ธฐ
๋๊ธฐ(Synchronous)
- ์ฝ๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ฉฐ, ํ๋์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ค์ ์์ ์ด ๋๊ธฐ
- ์ด์ ์์ ์ด ๋๋์ผ ๋ค์ ์์ ์์
๋น๋๊ธฐ(Asynchronous)
- ํน์ ์ฝ๋์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ์ฆ์ ์คํ
- ๋ธ๋กํน(Blocking) ์์: ์คํ ํ๋ฆ์ด ๋ฉ์ถ์ง ์์
- ์คํ ์์ ๋ณด์ฅ ์ ๋จ: ์ฝ๋ ์์ฑ ์์์ ์คํ ์๋ฃ ์์๊ฐ ๋ค๋ฅผ ์ ์์
๐ก ๋น๋๊ธฐ๊ฐ ํ์ํ ์ด์
- ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ : ๋ฐ์ดํฐ ๋ก๋ฉ ์ค์๋ UI๊ฐ ์๋ต ๊ฐ๋ฅ
- ํจ์จ์ฑ: ๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ฝ๊ธฐ ๋ฑ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ ์ค์๋ ๋ค๋ฅธ ์์ ์ํ ๊ฐ๋ฅ
2. ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ์งํ
2.1 ์ฝ๋ฐฑ ํจ์ ๋ฐฉ์
๋ฌธ์ ์ :
- ์ฝ๋ฐฑ ํฌ(Callback Hell): ์ค์ฒฉ๋ ์ฝ๋ฐฑ์ผ๋ก ์ฝ๋ ๋ณต์ก๋ ์ฆ๊ฐ
- ์๋ฌ ์ฒ๋ฆฌ ์ด๋ ค์: try-catch๋ก ๋น๋๊ธฐ ์๋ฌ๋ฅผ ์ก์ ์ ์์
- ๊ฒฐ๊ณผ๊ฐ ๋ฐํ ๋ถ๊ฐ: ๋น๋๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ถ ๋ณ์์ ํ ๋นํ๊ฑฐ๋ return์ผ๋ก ๋ฐํ ๋ถ๊ฐ
// ์ฝ๋ฐฑ ํฌ ์์
getData(function(a) {
getMoreData(a, function(b) {
getEvenMoreData(b, function(c) {
// ๊ณ์ ์ค์ฒฉ...
});
});
});
2.2 Promise (ES6)
Promise๋?
- ๋น๋๊ธฐ ์์ ์ ์ต์ข ์๋ฃ ๋๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด
- "๋ฏธ๋์ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฒ ๋ค"๋ ์ฝ์
Promise ์์ฑ ์ ๋์: Promise๋ฅผ ์์ฑํ๋ฉด executor ํจ์(์ฝ๋ฐฑ)๊ฐ ์ฆ์ ์คํ๋จ
Promise์ 3๊ฐ์ง ์ํ (State) โญ
- Pending(๋๊ธฐ): ์ด๊ธฐ ์ํ, ์์ง ์๋ฃ๋์ง ์์
- Fulfilled(์ดํ): ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ โ resolve() ํธ์ถ
- Rejected(์คํจ): ์์ ์ด ์คํจํจ โ reject() ํธ์ถ
const promise = new Promise((resolve, reject) => {
if (success) {
resolve(result); // Fulfilled
} else {
reject(error); // Rejected
}
});
promise
.then(result => console.log(result))
.catch(error => console.error(error))
.finally(() => console.log('์๋ฃ'));
2.3 async/await (ES8)
- Promise๋ฅผ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑ ๊ฐ๋ฅ (๊ฐ๋ ์ฑ ํฅ์)
- try-catch๋ก ์๋ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
async function fetchData() {
try {
const response = await fetch('/api/data');
const data = await response.json();
return data;
} catch (error) {
console.error('์๋ฌ ๋ฐ์:', error);
}
}
3. Promise ์ ํธ๋ฆฌํฐ ๋ฉ์๋
Promise.all()
- ์ฌ๋ฌ Promise๋ฅผ ๋ณ๋ ฌ ์คํํ๊ณ ๋ชจ๋ ์๋ฃ๋ ๋๊น์ง ๋๊ธฐ
- ๊ฒฐ๊ณผ ์์ ๋ณด์ฅ (์คํ ์์์ ๋์ผ)
- ํ๋๋ผ๋ ์คํจํ๋ฉด ์ฆ์ reject ๋ฐํ
Promise.race()
- ๊ฐ์ฅ ๋จผ์ ์๋ฃ๋๋ Promise์ ๊ฒฐ๊ณผ ๋ฐํ (์ฑ๊ณต/์คํจ ์๊ด์์)
โป ๋ชจ๋ Promise ์ ํธ๋ฆฌํฐ๋ ๋์์ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค (์์ฐจ ์คํ X).
4. ํต์ฌ ์ ๋ฆฌ
| ๋ฐฉ์ | ์ฅ์ | ๋จ์ |
|---|---|---|
| ์ฝ๋ฐฑ | ๊ฐ๋จํ ๋น๋๊ธฐ ์ฒ๋ฆฌ | ์ฝ๋ฐฑ ํฌ, ์๋ฌ ์ฒ๋ฆฌ ์ด๋ ค์ |
| Promise | ๊ฐ๋ ์ฑ ๋ฐ ์๋ฌ ์ฒ๋ฆฌ ์ฉ์ด | ์ฅํฉํ ์ฒด์ด๋(.then) |
| async/await | ์ต๊ณ ์ ๊ฐ๋ ์ฑ (๋๊ธฐ์ ์ฝ๋) | Promise ๊ธฐ๋ฐ ์ง์ ํ์ |
ํ์ต ํฌ์ธํธ ๐ก
- Promise์ 3๊ฐ์ง ์ํ(Pending, Fulfilled, Rejected) ์์ง
- Promise.all๊ณผ Promise.race์ ์ฐจ์ด ๋ช ํํ ๊ตฌ๋ถ
- async/await์ Promise์ syntactic sugar์ด๋ฏ๋ก ์๋ฆฌ ์ดํด ์ ํ ํ์
'๐จ Frontend > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JavaScript] Event Loop (0) | 2026.03.30 |
|---|---|
| [JavaScript] ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (0) | 2026.03.30 |