์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Algorithm
- C++
- Python
- sw expert academy
- ์ด์ฝํ
- react-router
- ํญํด99
- SW
- ํ๋ก๊ทธ๋๋จธ์ค
- ์๋ฐ
- axios
- ๋งค์ผ๋ฉ์ผ
- JavaScript
- ๋ฆฌ์กํธ
- ํญํดํ๋ฌ์ค
- redux
- json-server
- ํ ์ฝํ ์ฝ
- react
- Get
- maeil-mail
- createSlice
- useDispatch
- ์ฝ๋ฉํ ์คํธํฉ๊ฒฉ์๋๊ธฐ
- react-redux
- redux-saga
- programmers
- redux-toolkit
- java
- ์๊ณ ๋ฆฌ์ฆ
- Today
- Total
Binary Journey
[๋งค์ผ๋ฉ์ผ] ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ธ๋ฐ, ์ด๋ป๊ฒ ๋์์ ์ฌ๋ฌ ์์ ๋ค์ ์ํํ๋์? ๋ณธ๋ฌธ
[๋งค์ผ๋ฉ์ผ] ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ธ๋ฐ, ์ด๋ป๊ฒ ๋์์ ์ฌ๋ฌ ์์ ๋ค์ ์ํํ๋์?
binaryJournalist 2025. 1. 22. 16:28๐ก ๋งค์ผ๋ฉ์ผ์ ๊ธฐ์ ๋ฉด์ ๊ด๋ จ ์ง๋ฌธ์ ๋ฉ์ผ๋ก ๋งค์ผ ๋ณด๋ด์ฃผ๋ ๊ตฌ๋ ์๋น์ค์ ๋๋ค.
๐ก๋งค์ผ๋ฉ์ผ ์ฑ๋ฆฐ์ง๋ ์ ๊ฐ์ธ์ ์ธ ์ฑ๋ฆฐ์ง๋ก ๋งค์ผ๋ฉ์ผ์์ ๋ณด๋ด์ฃผ๋ ํ๋ฃจ์น ๋ฉ์ผ์ ๋ํ ๋ต๋ณ์ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ก ์์ฑํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ธ๋ฐ, ์ด๋ป๊ฒ ๋์์ ์ฌ๋ฌ ์์ ๋ค์ ์ํํ๋์?
(2024.12.24)
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ์ ์ธ์ด์ด์ง๋ง, ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ํ์คํฌ ํ(Task Queue)๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
setTimeout
,Promise
,fetch
๋ฑ์ ๋น๋๊ธฐ ํจ์๋ Web APIs์์ ์ฒ๋ฆฌํ ํ, Task Queue ๋๋ Microtask Queue์ ๋ฑ๋ก- ์ด๋ฒคํธ ๋ฃจํ(Event Loop) ๊ฐ Call Stack์ด ๋น์์ ๋ Task Queue์์ ์์ ์ ๊ฐ์ ธ์ ์คํ
- Microtask Queue(Promise, MutationObserver) ๋ ์ผ๋ฐ Task Queue๋ณด๋ค ๋จผ์ ์คํ๋จ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ฝ๋ฐฑ(Callback), ํ๋ก๋ฏธ์ค(Promise), async/await์ ์ฌ์ฉํ ์ ์์
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋์ง๋ง, ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ์ฌ๋ฌ ์์ ์ ๋์์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ๋ต์
1๏ธโฃ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋(Single Thread) ์ธ์ด์ด๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋(Single Thread) ๊ธฐ๋ฐ์ ์ธ์ด์ ๋๋ค.
- ์ฆ, ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์คํ ๊ฐ๋ฅํ๋ฉฐ, ํ๋์ ํธ์ถ ์คํ(Call Stack)์์ ์์ฐจ์ ์ผ๋ก ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
- ์ด๋ฌํ ๋์ ๋ฐฉ์ ๋๋ฌธ์ ๋ฉํฐ ์ค๋ ๋์ฒ๋ผ ๋์์ ์ฌ๋ฌ ์์ ์ ์ํํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด ๋ณด์ผ ์๋ ์์ต๋๋ค.
2๏ธโฃ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ํ์คํฌ ํ(Task Queue)
๊ทธ๋ ๋ค๋ฉด ์ฑ๊ธ ์ค๋ ๋์ธ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ๋์์ ์ฌ๋ฌ ์์
์ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ๊น?
๊ทธ ๋น๋ฐ์ ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ํ์คํฌ ํ(Task Queue) ์ ์์ต๋๋ค.
๐ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์๋ฆฌ
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ (Web APIs) ๋๋ Node.js ๋ฐํ์๊ณผ ํ๋ ฅํ์ฌ ๋์ํฉ๋๋ค.
- Call Stack(์ฝ ์คํ)
- ํ์ฌ ์คํ ์ค์ธ ํจ์๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ
- ์คํ์ด ๋๋ ํจ์๋ ์คํ์์ ์ ๊ฑฐ๋จ (LIFO ๊ตฌ์กฐ)
- Web APIs (๋ธ๋ผ์ฐ์ ๋๋ Node.js ๋ฐํ์ ์ ๊ณต ๊ธฐ๋ฅ)
setTimeout
,setInterval
,fetch
,XMLHttpRequest
, ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ ๋น๋๊ธฐ API ์ ๊ณต- ์คํ ํ ๋ฐ๋ก Call Stack์์ ์ ๊ฑฐ๋จ
- Task Queue (์ฝ๋ฐฑ ํ, Callback Queue ๋๋ ๋ฉ์์ง ํ, Message Queue)
- Web APIs๊ฐ ์๋ฃ๋ ํ ์คํํ ์ฝ๋ฐฑ ํจ์๋ค์ ์ ์ฅํ๋ ๊ณต๊ฐ
setTimeout
,setInterval
๋ฑ์ ๋น๋๊ธฐ ์์ ์ด ๋๋๋ฉด ์ฌ๊ธฐ์ ๋ค์ด๊ฐ
- Microtask Queue (๋ง์ดํฌ๋กํ์คํฌ ํ)
Promise.then()
,MutationObserver
,queueMicrotask()
๋ฑ์ด ์ ์ฅ๋จ- Task Queue๋ณด๋ค ๋จผ์ ์คํ๋จ!
- Event Loop (์ด๋ฒคํธ ๋ฃจํ)
- Call Stack์ด ๋น์์ ๋ Task Queue ๋๋ Microtask Queue์์ ํ์คํฌ๋ฅผ ๊ฐ์ ธ์ ์คํ
โ๏ธ ์ด๋ฒคํธ ๋ฃจํ(Event Loop) ๋์ ๋ฐฉ์
๐ ์์ 1: ๋๊ธฐ(Synchronous) ์ฝ๋ ์คํ
console.log("A");
console.log("B");
console.log("C");
โ ์ถ๋ ฅ ๊ฒฐ๊ณผ
A
B
C
- ๋ชจ๋ ์์ ์ด Call Stack์์ ์์ฐจ์ ์ผ๋ก ์คํ๋จ.
๐ ์์ 2: ๋น๋๊ธฐ ์ฝ๋ ์คํ (setTimeout
)
console.log("A");
setTimeout(() => {
console.log("B");
}, 1000);
console.log("C");
โ ์ถ๋ ฅ ๊ฒฐ๊ณผ
A
C
B
๐ ์คํ ๊ณผ์
1๏ธโฃ "A"
์ถ๋ ฅ (Call Stack์์ ์คํ)
2๏ธโฃ setTimeout
์คํ → Web API๊ฐ ์ฒ๋ฆฌ ํ 1์ด ํ Task Queue์ ์ฝ๋ฐฑ ํจ์ ๋ฑ๋ก
3๏ธโฃ "C"
์ถ๋ ฅ (Call Stack์์ ์คํ)
4๏ธโฃ 1์ด ํ Event Loop๊ฐ Task Queue์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ฐ์ ธ์ ์คํ → "B"
์ถ๋ ฅ
๐ ์์ 3: Promise
์ setTimeout
์ ์คํ ์์ ๋น๊ต
console.log("A");
setTimeout(() => {
console.log("B");
}, 0);
Promise.resolve().then(() => {
console.log("C");
});
console.log("D");
โ ์ถ๋ ฅ ๊ฒฐ๊ณผ
A
D
C
B
๐ ์คํ ๊ณผ์
1๏ธโฃ "A"
์ถ๋ ฅ
2๏ธโฃ setTimeout
์คํ → Web API์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ํ Task Queue์ ์ถ๊ฐ
3๏ธโฃ Promise.resolve().then()
์คํ → Microtask Queue์ ์ถ๊ฐ
4๏ธโฃ "D"
์ถ๋ ฅ
5๏ธโฃ Microtask Queue ์ฐ์ ์คํ → "C"
์ถ๋ ฅ
6๏ธโฃ Task Queue ์คํ → "B"
์ถ๋ ฅ
๐ฅ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์์ฑ(Concurrency)๊ณผ ๋ณ๋ ฌ์ฑ(Parallelism)
โ ๋์์ฑ(Concurrency)
- ์ฑ๊ธ ์ค๋ ๋์์๋ ์ฌ๋ฌ ์์ ์ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์คํํ๋ ๊ฒ
- ์ด๋ฒคํธ ๋ฃจํ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํตํด ๋ง์น ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ฆ
โ ๋ณ๋ ฌ์ฑ(Parallelism)
- ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์ ์ ์์ ํ ๋์์ ์คํํ๋ ๊ฒ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋์ด๋ฏ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๊ฐ๋ฅ
ํ์ง๋ง ์น ์์ปค(Web Worker) ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ผ๋ถ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํจ.
๐ฏ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ค
โ
1. ์ฝ๋ฐฑ ํจ์(Callback)
โ
2. ํ๋ก๋ฏธ์ค(Promise)
โ
3. async/await (ES2017 ์ถ๊ฐ)
๐ 1๏ธโฃ ์ฝ๋ฐฑ ํจ์(Callback)
function fetchData(callback) {
setTimeout(() => {
callback("๋ฐ์ดํฐ ๋ก๋ ์๋ฃ!");
}, 1000);
}
fetchData((message) => {
console.log(message);
});
โ
๋จ์ : ์ฝ๋ฐฑ ์ง์ฅ(Callback Hell) ๋ฐ์ ๊ฐ๋ฅ
๐ 2๏ธโฃ ํ๋ก๋ฏธ์ค(Promise)
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("๋ฐ์ดํฐ ๋ก๋ ์๋ฃ!");
}, 1000);
});
}
fetchData().then((message) => {
console.log(message);
});
โ ์ฅ์ : ์ฝ๋๊ฐ ๋ ์ฝ๊ธฐ ์ฌ์์ง
๐ 3๏ธโฃ async/await (ES2017 ์ถ๊ฐ)
async function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve("๋ฐ์ดํฐ ๋ก๋ ์๋ฃ!");
}, 1000);
});
}
async function main() {
console.log("๋ฐ์ดํฐ ์์ฒญ ์ค...");
const data = await fetchData();
console.log(data);
}
main();
โ
์ฅ์ : async/await
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑ ๊ฐ๋ฅ