Skip to content

Latest commit

ย 

History

History
147 lines (88 loc) ยท 6.31 KB

AsynchronousProcessingModel.md

File metadata and controls

147 lines (88 loc) ยท 6.31 KB

๋™๊ธฐ์™€ ๋น„๋™๊ธฐ

img

๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ทธ๋ฆผ์ด๋‹ค. (a)๋™๊ธฐ ๋ฐฉ์‹์—์„œ ์†๋‹˜๋“ค์€ ์•ž์‚ฌ๋žŒ์ด ์ฃผ๋ฌธํ•œ ์ปคํ”ผ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.

๊ทธ์— ๋ฐ˜ํ•ด (b)๋น„๋™๊ธฐ ๋ฐฉ์‹์—์„œ ์†๋‹˜๋“ค์€ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธ ํ•˜๋˜, ์•ž์‚ฌ๋žŒ ์ปคํ”ผ๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „๊นŒ์ง€ ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ž ํ•  ๊ฒƒ์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์ง„๋™๋ฒจ์ด ์šธ๋ฆฌ๋ฉด ๊ทธ๋•Œ ์ปคํ”ผ๋ฅผ ๊ฐ€์ง€๋Ÿฌ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ(Synchronous processing model)

์ง๋ ฌ์ ์œผ๋กœ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฆ‰, ํƒœ์Šคํฌ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์–ด๋–ค ์ž‘์—…์ด ์ˆ˜ํ–‰ ์ค‘์ด๋ฉด ๋‹ค์Œ ์ž‘์—…์€ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต๋  ๋•Œ๊นŒ์ง€ ์ดํ›„ ํƒœ์Šคํฌ๋“ค์€ ๋ธ”๋กœํ‚น(blocking, ์ž‘์—… ์ค‘๋‹จ)๋œ๋‹ค.

synchronous

์•„๋ž˜๋Š” ๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ. ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ์ฝ˜์†”์— ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

function func1() {
  console.log('func1');
  func2();
}

function func2() {
  console.log('func2');
  func3();
}

function func3() {
  console.log('func3');
}

func1();

โ€‹

๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ(Asynchronous processing model)

๋ณ‘๋ ฌ์ ์œผ๋กœ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฆ‰, ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ํ•˜๋”๋ผ๋„ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ ์ดํ›„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ (๋…ผ๋ธ”๋กœํ‚น, Non-Blocking) ์ฆ‰์‹œ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ดํ›„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต๋˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ˆ˜ํ–‰ํ•  ํƒœ์Šคํฌ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ DOM ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ Timer ํ•จ์ˆ˜(setTimeout, setInterval), Ajax ์š”์ฒญ์€ ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ๋กœ ๋™์ž‘ํ•œ๋‹ค.

asynchronous

์•„๋ž˜๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ. func2์—์„œ setTimeout๋กœ ์ธํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

function func1() {
  console.log('func1');
  func2();
}

function func2() {
  setTimeout(function() {
    console.log('func2');
  }, 0);

  func3();
}

function func3() {
  console.log('func3');
}

func1();

์œ„ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด setTimeout ๋ฉ”์†Œ๋“œ์— ๋‘๋ฒˆ์งธ ์ธ์ˆ˜ ์ธํ„ฐ๋ฒŒ์„ 0์ดˆ๋กœ ์„ค์ •ํ•˜์—ฌ๋„ ์ฝ˜์†”์— "func1 func2 func3"์˜ ์ˆœ์„œ๋กœ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด setTimeout ๋ฉ”์†Œ๋“œ๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

setTimeout

ํ•จ์ˆ˜ func1์ด ํ˜ธ์ถœ๋˜๋ฉด ํ•จ์ˆ˜ func1์€ Call Stack์— ์Œ“์ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ func1์€ ํ•จ์ˆ˜ func2๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ํ•จ์ˆ˜ func2๊ฐ€ Call Stack์— ์Œ“์ด๊ณ  setTimeout์ด ํ˜ธ์ถœ๋œ๋‹ค. setTimeout์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ง€์ • ๋Œ€๊ธฐ ์‹œ๊ฐ„๋งŒํผ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ "tick" ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํƒœ์Šคํฌ ํ๋กœ ์ด๋™ํ•œ ํ›„ Call Stack์ด ๋น„์–ด์กŒ์„ ๋•Œ Call Stack์œผ๋กœ ์ด๋™๋˜์–ด ์‹คํ–‰๋œ๋‹ค.

event-loop

โ€‹

๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ์ฐจ์ด์  ๋ฐ ์žฅ๋‹จ์ 

  • ๋™๊ธฐ์‹

    • ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚จ
      • ์š”์ฒญํ•œ ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ์ž๋ฆฌ์—์„œ ๋™์‹œ์— ์ผ์–ด๋‚จ (์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•œ๋‹ค๋ฉด ๊ทธ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ ์š”์ฒญ์— ๋”ฐ๋ฅธ ์‘๋‹ต์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์‹œ ๋ฆฌํ„ดํ•ด์ฃผ๊ธฐ ์ „๊นŒ์ง€ ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ํ™œ๋™์„ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ธฐ๋‹ค๋ ค์•ผ๋งŒํ•จ)
      • A๋…ธ๋“œ์™€ B๋…ธ๋“œ ์‚ฌ์ด์˜ ํŠธ๋žœ์žญ์…˜์„ ๋™์‹œ์— ๋งž์ถ˜๋‹ค๋Š” ์˜๋ฏธ
    • ์žฅ์ 
      • ์„ค๊ณ„๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ 
    • ๋‹จ์ 
      • ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐํ•ด์•ผ ํ•จ
  • ๋น„๋™๊ธฐ์‹

    • ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š์Œ
      • ์š”์ฒญํ•œ ๊ณณ์—์„œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Œ (์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ ํ›„ ์š”์ฒญ์— ๋”ฐ๋ฅธ ์‘๋‹ต์„ ๊ณ„์† ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„๋˜๋ฉฐ ๋‹ค๋ฅธ ์™ธ๋ถ€ ํ™œ๋™์„ ์ˆ˜ํ–‰ํ•˜์—ฌ๋„ ๋˜๊ณ  ์„œ๋ฒ„์—๊ฒŒ ๋‹ค๋ฅธ ์š”์ฒญ์‚ฌํ•ญ์„ ๋ณด๋‚ด๋„ ์ƒ๊ด€ ์—†์Œ)
      • ๋…ธ๋“œ ์‚ฌ์ด์˜ ์ž‘์—… ์ฒ˜๋ฆฌ ๋‹จ์œ„๋ฅผ ๋™์‹œ์— ํ•˜์ง€ ์•Š์•„๋„ ๋จ
    • ์žฅ์ 
      • ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ด ์ž์›์˜ ํšจ์œจ์ ์ธ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•จ
    • ๋‹จ์ 
      • ์„ค๊ณ„๊ฐ€ ๋™๊ธฐ์— ๋น„ํ•ด ๋ณต์žกํ•จ

โ€‹

๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น(Blocking / NonBlocking)

  • ๋ธ”๋กœํ‚น(Blocking)
    • ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ์ž‘์—…์„ ๋ชจ๋‘ ๋๋‚ผ๋•Œ๊นŒ์ง€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ๋Œ€๊ธฐํ•˜๋„๋ก ๋งŒ๋“ฆ
  • ๋…ผ๋ธ”๋กœํ‚น(NonBlocking)
    • ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ return ํ•ด์„œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ์ฃผ์–ด ๋‹ค๋ฅธ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
    • ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ return ํ•˜๋Š๋ƒ ๋งˆ๋Š๋ƒ๊ฐ€ ์ค‘์ 

ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ returnํ•ด์„œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๊ณ , ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉด NonBlocking์ด๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๊ณ  ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ์ž‘์—…์„ ๋ชจ๋‘ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด Blocking์ด๋‹ค.

โ€‹

๋™๊ธฐ==๋ธ”๋กœํ‚น, ๋น„๋™๊ธฐ==๋…ผ๋ธ”๋กœํ‚น ? ์•„๋‹ˆ๋‹ค !

๋™๊ธฐ/๋น„๋™๊ธฐ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฃผ์ฒด๊ฐ€ 2๊ฐœ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ž‘์—…์˜ ์‹œ๊ฐ„(์‹œ์ž‘, ์ข…๋ฃŒ ๋“ฑ)์„ ์„œ๋กœ ๋งž์ถ˜๋‹ค๋ฉด ์ด๋ฅผ ๋™๊ธฐ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์„œ๋กœ ์ž‘์—…์˜ ์‹œ๊ฐ„์ด ๊ด€๊ณ„์—†๋‹ค๋ฉด ์ด๋ฅผ ๋น„๋™๊ธฐ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋ธ”๋กœํ‚น/๋…ผ๋ธ”๋กœํ‚น์€ ์ž‘์—…์˜ ๋Œ€์ƒ์ด 2๊ฐœ ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ๋…์ด ์„œ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ๊ด€์ ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐ/๋ธ”๋กœํ‚น, ๋™๊ธฐ/๋…ผ๋ธ”๋กœํ‚น, ๋น„๋™๊ธฐ/๋ธ”๋กœํ‚น, ๋น„๋™๊ธฐ/๋…ผ๋ธ”๋กœํ‚น์˜ ๋‹ค์–‘ํ•œ ์กฐํ•ฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โ€‹

Reference & Additional Resources

https://poiemaweb.com/js-async

http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

https://deveric.tistory.com/99