๐โโ๏ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์๋ ์ฑ๊ธ ์ค๋ ๋์ด๋ค. ์ด๋ ํ ์์ ์ ์ฒ๋ฆฌํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ๋ blocking์ด ๋ฐ์ํ ์ ์๋ค.
ํ์ง๋ง ๋คํธ์ํฌ ์์ฒญ, ํ์ด๋จธ ๋ฑ ์์ ์ด ๋ฐ์ํ์ ๋, ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ์ง ์๊ณ ๋ค๋ฅธ ์์ ๋ค์ด ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ setTimeout, Promise ๋ฑ Web APIs ์ค ๋น๋๊ธฐ ์์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๋นํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฅ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ๊ณผ์

Call Stack: ํจ์ ํธ์ถ ์ ํจ์ ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์ ํธ์๋๊ณ ์์ฐจ์ ์คํ ๋๋ค. ์คํ์ด ์๋ฃ๋๋ฉด ์ฝ ์คํ์์ ์ ๊ฑฐ๋๋ค.
Web APIs: setTimeout, Promise ๋ฑ ๋น๋๊ธฐ ์์ ์ ์ฝ ์คํ์์ ๊ฐ์ ธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๋นํ๋๋ก ํ๋ค.
Task Queue: setTimeout๊ณผ ๊ฐ์ ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์ ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ผ์์ ์ผ๋ก ๋ณด๊ด๋๋ ์์ญ
Microtask Queue: ํ๋ก๋ฏธ์ค ํ์ ์ฒ๋ฆฌ ๋ฉ์๋ โthenโ, โcatchโ, โfinallyโ์ ์ฝ๋ฐฑ ํจ์, await ์ดํ ์ฝ๋ ๋ฑ์ด ์ผ์์ ์ผ๋ก ๋ณด๊ด๋๋ ์์ญ์ด๋ค. Task Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค.
Event Loop: ์ฝ ์คํ์ด ๋น์ด์๋์ง, (micro)task queue์ ๋๊ธฐ ์ค์ธ ํจ์๊ฐ ์๋์ง ํ์ธํ์ฌ, ๋๊ธฐ ์ค์ธ ํจ์๋ฅผ ์ฝ ์คํ์ผ๋ก ์ด๋์ํจ๋ค.
์ด๋ฏธ์ง ๋ฐ ์์ ์ฐธ๊ณ
https://www.lydiahallie.com/blog/event-loop
https://www.youtube.com/watch?v=eiC58R16hb8
- Call Stack์ ํจ์๊ฐ ํธ์๋๊ณ ์์ฐจ์ ์ผ๋ก ์คํ๋ ํ ์ ๊ฑฐ๋๋ค.
- ๋ง์ฝ ๋น๋๊ธฐ ํจ์ setTimeout ์ด ํธ์๋๋ฉด, Web APIs ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- ์ง์ ๋ ๋๋ ์ด ์๊ฐ์ด ์ง๋ ํ, setTimeout์ ์ฝ๋ฐฑํจ์๊ฐ Task Queue ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- EventLoop๊ฐ ์ฝ ์คํ์ด ๋น์๋์ง ํ์ธ ํ, Task Queue์ ๋๊ธฐ ์ค์ด๋ setTimeout์ ์ฝ๋ฐฑํจ์๊ฐ Call Stack์ผ๋ก ์ด๋ํ๋ค.
- SetTimeout์ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ค.
๐ ์ผ๋ํ ์
Event Loop๋ Queue์ ๋๊ธฐ ์ค์ธ ํจ์๋ฅผ Call Stack์ด ๋น์ด์์ ๋๋ง ๋ณด๋ธ๋ค. ๋ง์ฝ Call Stack์ด ๋น์ด์์ง ์๋ค๋ฉด, setTimeout์ ์ง์ ๋ ๋๋ ์ด ์๊ฐ๋ณด๋ค ๋ ์ค๋ ์ง์ฐ๋ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ Microtask Queue๊ฐ Task Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค. Microtask Queue์ ๋๊ธฐ์ค์ธ ํจ์๊ฐ ์์๋๊น์ง Task Queue์ ํจ์๋ Call Stack์ผ๋ก ์ด๋ํ์ง ๋ชปํ๋ค.
๐งท ์ฐธ๊ณ
https://www.lydiahallie.com/blog/event-loop
https://www.youtube.com/watch?v=eiC58R16hb8
https://dkrnfls.tistory.com/362
๐โโ๏ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์๋ ์ฑ๊ธ ์ค๋ ๋์ด๋ค. ์ด๋ ํ ์์ ์ ์ฒ๋ฆฌํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ๋ blocking์ด ๋ฐ์ํ ์ ์๋ค.
ํ์ง๋ง ๋คํธ์ํฌ ์์ฒญ, ํ์ด๋จธ ๋ฑ ์์ ์ด ๋ฐ์ํ์ ๋, ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ์ง ์๊ณ ๋ค๋ฅธ ์์ ๋ค์ด ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ setTimeout, Promise ๋ฑ Web APIs ์ค ๋น๋๊ธฐ ์์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๋นํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฅ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ๊ณผ์

Call Stack: ํจ์ ํธ์ถ ์ ํจ์ ์คํ ์ปจํ ์คํธ๊ฐ ์ฝ ์คํ์ ํธ์๋๊ณ ์์ฐจ์ ์คํ ๋๋ค. ์คํ์ด ์๋ฃ๋๋ฉด ์ฝ ์คํ์์ ์ ๊ฑฐ๋๋ค.
Web APIs: setTimeout, Promise ๋ฑ ๋น๋๊ธฐ ์์ ์ ์ฝ ์คํ์์ ๊ฐ์ ธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๋นํ๋๋ก ํ๋ค.
Task Queue: setTimeout๊ณผ ๊ฐ์ ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์ ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ผ์์ ์ผ๋ก ๋ณด๊ด๋๋ ์์ญ
Microtask Queue: ํ๋ก๋ฏธ์ค ํ์ ์ฒ๋ฆฌ ๋ฉ์๋ โthenโ, โcatchโ, โfinallyโ์ ์ฝ๋ฐฑ ํจ์, await ์ดํ ์ฝ๋ ๋ฑ์ด ์ผ์์ ์ผ๋ก ๋ณด๊ด๋๋ ์์ญ์ด๋ค. Task Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค.
Event Loop: ์ฝ ์คํ์ด ๋น์ด์๋์ง, (micro)task queue์ ๋๊ธฐ ์ค์ธ ํจ์๊ฐ ์๋์ง ํ์ธํ์ฌ, ๋๊ธฐ ์ค์ธ ํจ์๋ฅผ ์ฝ ์คํ์ผ๋ก ์ด๋์ํจ๋ค.
์ด๋ฏธ์ง ๋ฐ ์์ ์ฐธ๊ณ
https://www.lydiahallie.com/blog/event-loop
https://www.youtube.com/watch?v=eiC58R16hb8
- Call Stack์ ํจ์๊ฐ ํธ์๋๊ณ ์์ฐจ์ ์ผ๋ก ์คํ๋ ํ ์ ๊ฑฐ๋๋ค.
- ๋ง์ฝ ๋น๋๊ธฐ ํจ์ setTimeout ์ด ํธ์๋๋ฉด, Web APIs ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- ์ง์ ๋ ๋๋ ์ด ์๊ฐ์ด ์ง๋ ํ, setTimeout์ ์ฝ๋ฐฑํจ์๊ฐ Task Queue ์์ญ์ผ๋ก ์ด๋ํ๋ค.
- EventLoop๊ฐ ์ฝ ์คํ์ด ๋น์๋์ง ํ์ธ ํ, Task Queue์ ๋๊ธฐ ์ค์ด๋ setTimeout์ ์ฝ๋ฐฑํจ์๊ฐ Call Stack์ผ๋ก ์ด๋ํ๋ค.
- SetTimeout์ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ค.
๐ ์ผ๋ํ ์
Event Loop๋ Queue์ ๋๊ธฐ ์ค์ธ ํจ์๋ฅผ Call Stack์ด ๋น์ด์์ ๋๋ง ๋ณด๋ธ๋ค. ๋ง์ฝ Call Stack์ด ๋น์ด์์ง ์๋ค๋ฉด, setTimeout์ ์ง์ ๋ ๋๋ ์ด ์๊ฐ๋ณด๋ค ๋ ์ค๋ ์ง์ฐ๋ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ Microtask Queue๊ฐ Task Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค. Microtask Queue์ ๋๊ธฐ์ค์ธ ํจ์๊ฐ ์์๋๊น์ง Task Queue์ ํจ์๋ Call Stack์ผ๋ก ์ด๋ํ์ง ๋ชปํ๋ค.
๐งท ์ฐธ๊ณ
https://www.lydiahallie.com/blog/event-loop
https://www.youtube.com/watch?v=eiC58R16hb8
https://dkrnfls.tistory.com/362