Javascript/Javascript

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ, ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ, ์ฝœ๋ฐฑํ•จ์ˆ˜

Rainbow๐ŸŒˆCoder 2022. 5. 29. 17:08
728x90

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

 

728x90