๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฐ ์–ธ์–ด/JS

์ด๋ฒคํŠธ

์ฑ… <๋Ÿฌ๋‹์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ>๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ฐฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

๋ชฉ์ฐจ

  • 1. ์ด๋ฒคํŠธ
  • 2. ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)์™€ ๋™์‹œ์„ฑ(Concurrency)
  • 2-1) ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ
  • 2-2) ์ด๋ฒคํŠธ ์˜ˆ์ œ
  • 3. ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜(์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฒคํŠธ)

๋” ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์˜ MDN์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

https://developer.mozilla.org/en-US/docs/Web/Events

 

<์ด๋ฒคํŠธ>

1. ์ด๋ฒคํŠธ

  • ์ด๋ฒคํŠธ(event)๋Š” DOM ์š”์†Œ์™€ ๊ด€๋ จ๋œ ์–ด๋–ค ์‚ฌ๊ฑด์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๊ทธ์— ๋Œ€์‘ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์—๋Š” ํ†ต์ง€ํ•ด ์ค€๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์›นํŽ˜์ด์ง€๋Š” ์ƒํ˜ธ์ž‘์šฉ(Interaction)์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ์— ๋งž๋Š” ๋ฐ˜์‘์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ผ๋Š” ํ•จ์ˆ˜์— ์—ฐ๊ฒฐ๋œ๋‹ค. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์—๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋‹ค๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ์‹คํ–‰๋œ๋‹ค. 

 

 

2. ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)์™€ ๋™์‹œ์„ฑ(Concurrency)

  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ(single-thread)์—์„œ ์ด๋ฒคํŠธ ๋“œ๋ฆฌ๋ธ(event-driven) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…(task)๋งŒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋งŽ์€ task๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง„๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์‹œ์„ฑ(Concurrency)์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)์ด๋‹ค.

 

2-1) ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ

  • ๋Œ€๋ถ€๋ถ„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํฌ๊ฒŒ Call Stack๊ณผ Heap์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
  • 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์œผ๋กœ ์ด๋™ํ•˜๊ณ  ์‹คํ–‰๋œ๋‹ค.

 

2-2) ์ด๋ฒคํŠธ ์˜ˆ์ œ

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

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

  func3();
}

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

func1();

์œ„ ์ฝ”๋“œ ์‹คํ–‰ ์ˆœ์„œ

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

 

 

3. ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฒคํŠธ

EVENT  EVENT ๋‚ด์šฉ 
OnLoad  ํ˜„์žฌ์˜ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋”ฉ๋˜์—ˆ์„ ๊ฒฝ์šฐ 
OnUnload  ํ˜„์žฌ์˜ ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๊ฒฝ์šฐ 
OnError  ํ˜„์žฌ์˜ ํŽ˜์ด์ง€๋ฅผ ์ฝ๋Š” ์ค‘์— JavaScript Error๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ 
OnAbort  ์ด๋ฏธ์ง€๋ฅผ ์ฝ๋Š” ๋„์ค‘ ์ค‘์ง€ํ•˜์˜€์„ ๊ฒฝ์šฐ 
OnMouseOver  ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ๊ฐœ์ฒด ์œ„์— ๋‘์—ˆ์„ ๊ฒฝ์šฐ 
OnMouseOut  ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ๊ฐœ์ฒด ์œ„์— ๋‘์—ˆ๋‹ค๊ฐ€ ๋ฐ–์œผ๋กœ ์ด๋™ํ–ˆ์„ ๊ฒฝ์šฐ 
OnClick  ๋งํฌ ๋ถ€๋ถ„์ด๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๊ฒฝ์šฐ 
OnDbclick  ๋งํฌ ๋ถ€๋ถ„์ด๋‚˜ ๋ฒ„ํŠผ์„ ๋”๋ธ”ํด๋ฆญํ–ˆ์„ ๊ฒฝ์šฐ 
OnMouseDown  ๋งํฌ ๋ถ€๋ถ„์ด๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๊ฒฝ์šฐ(OnClick๊ณผ ๋™์ผ) 
OnMouseUp 
๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ๋‹ค๊ฐ€ ๋–ผ์—ˆ์„ ๊ฒฝ์šฐ 
OnKeyDown  ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ 
OnKeyPress  ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅด๊ณ  ์žˆ์„ ๊ฒฝ์šฐ 
OnKeyUp  ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆŒ๋ €๋‹ค ๋–ผ์—ˆ์„ ๊ฒฝ์šฐ 
OnFocus  ํผ ์–‘์‹ ์ž…๋ ฅํ•„๋“œ์—์„œ ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์œ„์น˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ 
OnBlur  ํผ ์–‘์‹ ์ž…๋ ฅํ•„๋“œ์—์„œ ๋‹ค๋ฅธ๊ณณ์œผ๋กœ ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์œ„์น˜ ํ•˜์˜€์„ ๊ฒฝ์šฐ 
OnChange  ํผ ์–‘์‹ ์†์˜ ์ž…๋ ฅํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ 
OnSelect  ํผ ์–‘์‹ ์†์˜ ์ž…๋ ฅํ•„๋“œ ๋‚ด์— ํ…์ŠคํŠธ๋ฅผ ์„ ํƒํ•˜์˜€์„ ๊ฒฝ์šฐ 
Onsubmit  ํผ ์–‘์‹์„ ์ „์†กํ•  ๊ฒฝ์šฐ 
OnReset  ํผ ์–‘์‹์„ ์žฌ์„ค์ • ํ–ˆ์„ ๊ฒฝ์šฐ 
OnHelp  Help Key๋ฅผ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ 
OnReadyStateChange  ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๊ฒฝ์šฐ 
OnAfterUpdate  ํผ ์–‘์‹์†์˜ ์ž…๋ ฅ ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๊ฒฝ์šฐ 
OnBeforeUpdate  ํผ ์–‘์‹ ์†์˜ ํ•ญ๋ชฉ์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ 
OnScroll  ์Šคํฌ๋กค ๋ง‰๋Œ€๋ฅผ ์Šคํฌ๋กคํ•  ๊ฒฝ์šฐ