https://www.freecodecamp.org/news/synchronous-vs-asynchronous-in-javascript/
Synchronous vs Asynchronous JavaScript – Call Stack, Promises, and More
Let me start this article by asking, "What is JavaScript"? Well, here's the most confusing yet to-the-point answer I have found so far: > JavaScript is a single-threaded, non-blocking, asynchronous, concurrent programming language with lots of flexibility.
www.freecodecamp.org
https://poiemaweb.com/js-event
Event | PoiemaWeb
์ด๋ฒคํธ(event)๋ ์ด๋ค ์ฌ๊ฑด์ ์๋ฏธํ๋ค. ๋ธ๋ผ์ฐ์ ์์์ ์ด๋ฒคํธ๋ ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ์ ๋, ์นํ์ด์ง๊ฐ ๋ก๋๋์์ ๋์ ๊ฐ์ ๊ฒ์ธ๋ฐ ์ด๊ฒ์ DOM ์์์ ๊ด๋ จ์ด ์๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ
poiemaweb.com
์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ๋์์ฑ(Concurrency)
๋ธ๋ผ์ฐ์ ๋ ๋จ์ผ ์ฐ๋ ๋(single-thread)์์ ์ด๋ฒคํธ ๋๋ฆฌ๋ธ(event-driven) ๋ฐฉ์์ผ๋ก ๋์๋จ์ผ ์ฐ๋ ๋๋ ์ฐ๋ ๋๊ฐ ํ๋๋ฟ์ด๋ผ๋ ์๋ฏธ์ด๋ฉฐ ์ด๋ง์ ๊ณง ํ๋์ ์์ (task)๋ง์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํ์ง๋ง ์ค์ ๋ก ๋์ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์ task๊ฐ ๋์์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋ค. ์ด์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ(Concurrency)์ ์ง์ํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ด๋ค.
๋ธ๋ผ์ฐ์ ์ ํ๊ฒฝ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
๊ตฌ๊ธ์ V8์ ๋น๋กฏํ ๋๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํฌ๊ฒ 2๊ฐ์ ์์ญ์ผ๋ก ๋๋๋ค.
Call Stack(ํธ์ถ ์คํ)์์ ์ด ์์ฒญ๋๋ฉด(ํจ์๊ฐ ํธ์ถ๋๋ฉด) ์์ฒญ๋ ์์ ์ ์์ฐจ์ ์ผ๋ก Call Stack์ ์์ด๊ฒ ๋๊ณ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋จ ํ๋์ Call Stack์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํด๋น task๊ฐ ์ข ๋ฃํ๊ธฐ ์ ๊น์ง๋ ๋ค๋ฅธ ์ด๋ค task๋ ์ํ๋ ์ ์๋ค.Heap๋์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค๊ฐ ํ ๋น๋๋ ์์ญ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋จ์ํ ์์ ์ด ์์ฒญ๋๋ฉด Call Stack์ ์ฌ์ฉํ์ฌ ์์ฒญ๋ ์์ ์ ์์ฐจ์ ์ผ๋ก ์คํํ ๋ฟ์ด๋ค. ์์์ ์ธ๊ธํ ๋์์ฑ(Concurrency)์ ์ง์ํ๊ธฐ ์ํด ํ์ํ ๋น๋๊ธฐ ์์ฒญ(์ด๋ฒคํธ๋ฅผ ํฌํจ) ์ฒ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌ๋ํ๋ ํ๊ฒฝ ์ฆ ๋ธ๋ผ์ฐ์ (๋๋ Node.js)๊ฐ ๋ด๋นํ๋ค.
Event Queue(Task Queue)๋น๋๊ธฐ ์ฒ๋ฆฌ ํจ์์ ์ฝ๋ฐฑ ํจ์, ๋น๋๊ธฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ, Timer ํจ์(setTimeout(), setInterval())์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ณด๊ด๋๋ ์์ญ์ผ๋ก ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ์ํด ํน์ ์์ (Call Stack์ด ๋น์ด์ก์ ๋)์ ์์ฐจ์ ์ผ๋ก Call Stack์ผ๋ก ์ด๋๋์ด ์คํ๋๋ค.Event Loop(์ด๋ฒคํธ ๋ฃจํ)Call Stack ๋ด์์ ํ์ฌ ์คํ์ค์ธ task๊ฐ ์๋์ง ๊ทธ๋ฆฌ๊ณ Event Queue์ task๊ฐ ์๋์ง ๋ฐ๋ณตํ์ฌ ํ์ธํ๋ค. ๋ง์ฝ Call Stack์ด ๋น์ด์๋ค๋ฉด Event Queue ๋ด์ task๊ฐ Call Stack์ผ๋ก ์ด๋ํ๊ณ ์คํ๋๋ค.
function func1() {
console.log('func1');
func2();
}
function func2() {
setTimeout(function () {
console.log('func2');
}, 0);
func3();
}
function func3() {
console.log('func3');
}
func1();
ํจ์ func1์ด ํธ์ถ๋๋ฉด ํจ์ func1์ Call Stack์ ์์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ func1์ ํจ์ func2์ ํธ์ถํ๋ฏ๋ก ํจ์ func2๊ฐ Call Stack์ ์์ด๊ณ setTimeout๊ฐ ํธ์ถ๋๋ค. setTimeout์ ์ฝ๋ฐฑํจ์๋ ์ฆ์ ์คํ๋์ง ์๊ณ ์ง์ ๋๊ธฐ ์๊ฐ๋งํผ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ “tick” ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํ์คํฌ ํ๋ก ์ด๋ํ ํ Call Stack์ด ๋น์ด์ก์ ๋ Call Stack์ผ๋ก ์ด๋๋์ด ์คํ๋๋ค.
๋๊ธฐ (Synchronous)์ ๋น๋๊ธฐ(Asynchronous)
- ๋๊ธฐ ๋ฐฉ์์ ์๋ฒ์์ ์์ฒญ์ ๋ณด๋์ ๋ ์๋ต์ด ๋์์์ผ ๋ค์ ๋์์ ์ํํ ์ ์๋ค. ์ฆ A์์ ์ด ๋ชจ๋ ์งํ ๋ ๋๊น์ง B์์ ์ ๋๊ธฐํด์ผํ๋ค.
- ๋น๋๊ธฐ ๋ฐฉ์์ ๋ฐ๋๋ก ์์ฒญ์ ๋ณด๋์ ๋ ์๋ต ์ํ์ ์๊ด์์ด ๋ค์ ๋์์ ์ํ ํ ์ ์๋ค. ์ฆ A์์ ์ด ์์ํ๋ฉด ๋์์ B์์ ์ด ์คํ๋๋ค. A์์ ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค๋๋๋ก ์ถ๋ ฅ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์๋๋ก ์คํํ๋ฉด ์ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋๋ก ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ฑฐ๋ ์์ํ์ง ๋ชปํ ์ง์ฐ์ด ์๋ ๊ธฐ๋ฅ์ ์คํํด์ผ ํ ์๋ ์์ต๋๋ค NOW. ๋ฐ๋ผ์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค asynchronously.
https://poiemaweb.com/js-async
Asynchronous processing model | PoiemaWeb
๋๊ธฐ์ ์ฒ๋ฆฌ ๋ชจ๋ธ(Synchronous processing model)์ ์ง๋ ฌ์ ์ผ๋ก ์์ ์ ์ํํ๋ค. ์ฆ, ์์ ์ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ฉฐ ์ด๋ค ์์ ์ด ์ํ ์ค์ด๋ฉด ๋ค์ ์์ ์ ๋๊ธฐํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ
poiemaweb.com
'Javascript > Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Js] ๋ฐฐ์ด ์์ฑ (0) | 2022.07.22 |
---|---|
Bind (0) | 2022.07.19 |
[์๋ฐ์คํฌ๋ฆฝํธ] ๋งค๊ฐ๋ณ์, ์ธ์ ์ฉ์ด ์ฐจ์ด (0) | 2022.05.27 |
[์๋ฐ์คํฌ๋ฆฝํธ] ์ต๋ช ํจ์, ํ์ดํ ํจ์, ์ฝ๋ฐฑํจ์ (0) | 2022.05.22 |
[์๋ฐ์คํฌ๋ฆฝํธ] crazy this, ํท๊ฐ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ this ์์ ์ด์ ๋ฆฌ (0) | 2022.05.22 |