๋๊ธฐ ์ฒ๋ฆฌ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
JavaScript ์์ง
- ์ฑ๊ธ ์ค๋ ๋(signle thread) ๋ฐฉ์
- cf. ๋ธ๋ผ์ฐ์ ๋ ๋ฉํฐ ์ค๋ ๋๋ก ๋์!
- ํ ๋ฒ์ ํ๋์ ํ์คํฌ๋ง ์คํ
- ์ฒ๋ฆฌ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ํ์คํฌ๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ ๋ธ๋กํน(์์ ์ค๋จ)์ด ๋ฐ์
๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์
๐ก ํ์ฌ ์คํ์ค์ธ ํ์คํฌ๊ฐ ์ข ๋ฃํ ๋ ๊น์ง ๋ค์์ ์คํ๋ ํ์คํฌ๊ฐ ๋๊ธฐํ๋ ๋ฐฉ์
- ํ์คํฌ๋ฅผ ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ฏ๋ก ์คํ ์์๊ฐ ๋ณด์ฅ๋จ
- ์์ ํ์คํฌ๊ฐ ์ข ๋ฃํ ๋๊น์ง ์ดํ ํ์คํฌ๋ค์ด ๋ธ๋กํน ๋จ
/* ๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์
* ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ๊ฐ ์ข
๋ฃํ ๋ ๊น์ง ๋ค์์ ์คํ๋ ํ์คํฌ๊ฐ ๋๊ธฐํ๋ ๋ฐฉ์
*/
//ํจ์ sleep์ delay๊ฐ ๊ฒฝ๊ณผํ ํ์ ์ฝ๋ฐฑํจ์(func) ํธ์ถ
function sleep(func, delay){
//Date.now()๋ ํ์ฌ ์๊ฐ์ ๋ฐํ
const delayUntil = Date.now() + delay
//ํ์ฌ ์๊ฐ์ delay๋ฅผ ๋ํ delayUntil์ด ํ์ฌ ์๊ฐ๋ณด๋ค ์์ผ๋ฉด ๊ณ์ ๋ฐ๋ณต
while(Date.now() < delayUntil)
//์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ ์ดํ์ ์ฝ๋ฐฑํจ์ ์คํ
func()
}
function foo(){
console.log('foo')
}
function bar(){
console.log('bar')
}
//slepp ํจ์๋ 3์ด ์ด์ ์คํ
sleep(foo,3*1000)
// bar ํจ์๋ sleep์ด ์ข
๋ฃ๋ ์ดํ์ ํธ์ถ๋จ (3์ด ์ด์ blocking)
bar()
//3์ด ์ด์ ๊ฒฝ๊ณผ ํ foo ํธ์ถ=>barํธ์ถ
๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์
๐ก ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ๊ฐ ์ข ๋ฃ๋์ง ์์ ์ํ๋ผ๋ ๋ค์ ํ์คํฌ๋ฅผ ๊ณง๋ฐ๋ก ์คํํ๋ ๋ฐฉ์
- ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ๊ฐ ์ข ๋ฃ๋์ง ์์ ์ํ๋ผ ํด๋ ๋ค์ ํ์คํฌ๋ฅผ ๊ณง๋ฐ๋ก ์คํํด ๋ธ๋กํน ๋ฐ์ํ์ง ์์
- ํ์คํฌ์ ์คํ ์์๊ฐ ๋ณด์ฅ๋์ง ์์
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๋น๋๊ธฐ ํจ์๋ ์ ํต์ ์ผ๋ก ์ฝ๋ฐฑ ํจํด์ ์ฌ์ฉ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฝ๋ฐฑ ํจํด์ ์ฝ๋ฐฑ ํฌ(callback hell)์ ๋ฐ์์ํด
- ๊ฐ๋ ์ฑ์ ๋์๊ฒ ํจ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ค ๋ฐ์ํ ์๋ฌ์ ์์ธ์ฒ๋ฆฌ ๊ณค๋
- ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ๊ณ
- setTimeout, setInterval, HTTP ์์ฒญ, ์ด๋ฒคํธ ํจ๋ค๋ฌ
- ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ํ์คํฌ ํ(Task Queue)์ ๊น์ ๊ด๊ณ
/* ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์
ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ๊ฐ ์ข
๋ฃ๋์ง ์์ ์ํ๋ผ ํด๋ ๋ค์ ํ์คํฌ๋ฅผ ๊ณง๋ฐ๋ก ์คํํ๋ ๋ฐฉ์
*/
//ํจ์ sleep์ delay๊ฐ ๊ฒฝ๊ณผํ ํ์ ์ฝ๋ฐฑํจ์(func) ํธ์ถ
function sleep(func, delay){
//Date.now()๋ ํ์ฌ ์๊ฐ์ ๋ฐํ
const delayUntil = Date.now() + delay
//ํ์ฌ ์๊ฐ์ delay๋ฅผ ๋ํ delayUntil์ด ํ์ฌ ์๊ฐ๋ณด๋ค ์์ผ๋ฉด ๊ณ์ ๋ฐ๋ณต
while(Date.now() < delayUntil)
//์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ ์ดํ์ ์ฝ๋ฐฑํจ์ ์คํ
func()
}
function foo(){
console.log('foo')
}
function bar(){
console.log('bar')
}
//ํ์ด๋จธ ํจ์ setTimeout์ ์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ ์ดํ์ ์ฝ๋ฐฑ ํจ์ foo๋ฅผ ํธ์ถ
// ํ์ด๋จธ ํจ์ setTimeout์ barํจ์๋ฅผ ๋ธ๋กํนํ์ง ์๋๋ค.
setTimeout(foo,3*1000)
bar()
//bar ํธ์ถ -> (3์ด ๊ฒฝ๊ณผํ) fooํธ์ถ
์ด๋ฒคํธ ๋ฃจํ์ ํ์คํฌ ํ
Task Queue๋ก ํ ๋น๋ ํ Event Loop๊ฐ Call Stack์ด ๋น ๊ฒ์ ํ์ธ ํ Call Stack์ผ๋ก ํ ๋น
์๋ฐ์คํฌ๋ฆฝํธ ์์ง
์ฝ ์คํ(Call Stack)
๐ก ์์ค์ฝ๋(์ ์ญ ์ฝ๋๋ ํจ์์ฝ๋ ๋ฑ) ํ๊ณผ ๊ณผ์ ์์ ์์ฑ๋ ์คํ ์ปจํ ์คํธ๊ฐ ์ถ๊ฐ๋๊ณ ์ ๊ฑฐ๋๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ธ ์ปจํ ์คํธ ์คํ
- ํจ์๋ฅผ ํธ์ถํ๋ฉด ํจ์ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฐจ์ ์ผ๋ก ์ฝ ์คํ์ ํธ์ฌ๋์ด ์์ฐจ์ ์ผ๋ก ์คํ
- ๋จ ํ๋์ ์ฝ์คํ์ ์ฌ์ฉ
- ์ต์์ ์คํ ์ปจํ์คํธ๊ฐ ์ข ๋ฃ๋์ด ์ฝ ์คํ์ ์ ๊ฑฐ๋๊ธฐ ์ ๊น์ง๋ ๋ค๋ฅธ ์ด๋ค ํ์คํฌ๋ ์คํ๋์ง ์์
ํ(Heap)
๐ก ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
- ์ฝ ์คํ์ ์์์ธ ์คํ ์ปจํ ์คํธ๋ ํ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
- ๊ฐ์ฒด๋ ์์ ๊ฐ๊ณผ๋ ๋ฌ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์์ง ์์ผ๋ฏ๋ก ํ ๋นํด์ผ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ๋ฐํ์์ ๊ฒฐ์ (๋์ ํ ๋น)
- ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ธ ํ์ ๊ตฌ์กฐํ ๋์ด์์ง ์์
ํ์คํฌ ํ(Task Queue/Event Queue/Callback Queue)
๐ก setTimeout์ด๋ setInterval๊ณผ ๊ฐ์ ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์ ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ผ์์ ์ผ๋ก ๋ณด๊ด๋๋ ์์ญ
- ํ์คํฌ ํ์๋ ๋ณ๋๋ก ํ๋ก๋ฏธ์ค์ ํ์ ์ฒ๋ฆฌ ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์๊ฐ ์ผ์์ ์ผ๋ก ๋ณด๊ด๋๋ ๋ง์ดํฌ๋กํ์คํฌ ํ๋ ์กด์ฌ
์ด๋ฒคํธ ๋ฃจํ(Event Loop)
๐ก ์ฝ ์คํ์ ํ์ฌ ์คํ ์ค์ธ ์คํ ์ปจํ ์คํธ๊ฐ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ํ์คํฌ ํ์ ๋๊ธฐ ์ค์ธ ํจ์(์ฝ๋ฐฑ ํจ์, ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ)๊ฐ ์๋์ง ๋ฐ๋ณตํด์ ํ์ธ
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ์ ์ง์
- ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ ๊ธฐ๋ฅ ์ค ํ๋
- ์ฝ ์คํ์ด ๋น์ด์๊ณ ํ์คํฌ ํ์ ๋๊ธฐ ์ค์ธ ํจ์๊ฐ ์๋ค๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ์์ฐจ์ (First In First Out)์ผ๋ก ํ์คํฌ ํ์ ๋๊ธฐ ์ค์ธ ํจ์๋ฅผ ์ฝ ์คํ์ผ๋ก ์ด๋
- ์ฝ ์คํ์ผ๋ก ์ด๋ํ ํจ์๋ ์คํ๋จ
- ํ์คํฌ ํ์ ์ผ์ ๋ณด๊ด๋ ํจ์๋ค์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ผ๋ก ๋์
Reference
์ด์ ๋ชจ ์ , ใ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ Deep Diveใ, ์ํค๋ถ์ค(2020)
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] Event-onChange (0) | 2023.01.22 |
---|---|
[JavaScript] Event-onFocus, onBlur (0) | 2023.01.20 |
[JavaScript] API (0) | 2023.01.16 |
[JavaScript] AJAX & JSON (0) | 2023.01.15 |
[FE/JavaScript] ๊ตฌ์กฐ ๋ถํด ํ ๋น(๋์คํธ๋ญ์ฒ๋ง ํ ๋น) (0) | 2022.07.06 |
๋๊ธ