๋ธ๋ผ์ฐ์ ๋ ์ฒ๋ฆฌํด์ผ ํ ํน์  ์ฌ๊ฑด(event)์ด ๋ฐ์ํ๋ฉด ์ด๋ฅผ ๊ฐ์งํ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค. ์ด๋ฒคํธ์ ๋ํด ์ด๋ค ์ผ์ ํ๊ณ ์ถ๋ค๋ฉด ํด๋นํ๋ ํ์ ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋ ํจ์๋ฅผ ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ ค ํธ์ถ์ ์์ํ๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ: ์ด๋ฒคํธ๊ฐ ๋ฐ์๋์ ๋ ํธ์ถ๋๋ ํจ์
์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ๋ก: ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ํธ์ถ์ ์์ํ๋ ๊ฒ 
์ด๋ฒคํธ ํธ๋ค๋ฌ ์ดํธ๋ฆฌ๋ทฐํธ: ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ดํธ๋ฆฌ๋ทฐํธ ์ด๋ฆ์ ์ด๋ฒคํธ ์์ on ์ ๋์ฌ๋ฅผ ๋ถํ ํํ์ด๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ผ๋ก ํจ์ ํธ์ถ๋ฌธ์ ํ ๋นํ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋๋๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๊ฐ์ผ๋ก ํจ์ ์ฐธ์กฐ๊ฐ ์๋ ํจ์ ํธ์ถ๋ฌธ์ ํ ๋นํ๋ค๋ ์ ์ ์ฃผ์ํด์ผ ํ๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ดํธ๋ฆฌ๋ทฐํธ ๊ฐ์ ์๋ฌต์ ์ผ๋ก ์์ฑ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ํจ์ ๋ชธ์ฒด๋ฅผ ์๋ฏธํ๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐฉ์์ ์์๋๋ ๊ฒ์ ์ข์ผ๋ HTML๊ณผ ์๋ฐ ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
์ต๊ทผ์ ์ฌ์ฉ๋๋ Vue, React, Angular์ ๊ฐ์ ํ๋ ์์ํฌ/๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ์ฉ๋๋ CBD(Component Based Development) ๋ฐฉ์์์๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐฉ์์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ค.
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <button onclick="sayHi('hello')">Click me!</button>
    //์๋์ onclick ์ดํธ๋ฆฌ๋ทฐํธ๋ ํ์ฑ๋์ด ๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ์๋ฌต์ ์ผ๋ก ์์ฑํ๋ค.
    //function onclick(event) {
    //  console.log('hello');
    //  console.log('world');
    //}
    <button onclick="console.log('hello'); console.log('world');">Click me!</button>
    <script>
      function sayHi(name) {
        console.log(`${name} world!`);
      }
    </script>
  </body>
</html>์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ: window ๊ฐ์ฒด์ Document, HTMLElement ํ์
์ DOM ๋
ธ๋ ๊ฐ์ฒด๋ ์ด๋ฒคํธ์ ๋์ํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ๋ฅผ ๊ฐ๊ณ  ์๋๋ฐ ํด๋น ํ๋กํผํฐ์ ํจ์๋ฅผ ๋ฐ์ธ๋ฉํ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋๋ถ๋ถ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํฌ ์ด๋ฒคํธ ํ๊น์ ๋ฐ์ธ๋ฉ ํ์ง๋ง ๊ฐํน ์ ํ๋ ์ด๋ฒคํธ๋ฅผ ์บ์นํ DOM๋ ธ๋ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ํ๊ธฐ๋ ํ๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ค๋ฅด๊ฒ HTML๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์์ด๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ์๋ ํ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ง ๋ฐ์ธ๋ฉํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <button>Click me!</button>
    <script>
      //$button์ ์ด๋ฒคํธ ํ๊น์ด๋ค.
      const $button = document.querySelector("button");
      $button.onclick = function () {
        console.log("first");
      };
      // ๋ ๋ฒ์งธ๋ก ๋ฐ์ธ๋ฉ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ง ๋์๋๋ค.
      $button.onclick = function () {
        console.log("second");
      };
    </script>
  </body>
</html>
addEventListener ๋ฉ์๋: ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ๋กํผํฐ์ ๋ค๋ฅด๊ฒ addEventListener ๋ฉ์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ publish-subsribe pattern์ ํตํด ๋์ผํ ์ด๋ฒคํธ ํ์
์ ์ฌ๋ฌ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ  ์ ์๋ค. ์คํ์ ๋ฑ๋ก๋ ์์๋๋ก์ด๋ค.  EventTarget.addEventListener('eventType', eventHandler [, useCapture]);
  
  . EventTarget: ์ด๋ฒคํธ ๋ฐ์์ ๊ฐ์ํ  ์์ ๋
ธ๋
  . 'eventType': on ์ ๋์ฌ๋ฅผ ์ ์ธํ ์ด๋ฒคํธ ํ์
๋ช
  . eventHandler: ์ด๋ฒคํธ ๋ฐ์์ ๋ธ๋ผ์ฐ์ ์๊ฒ ์์ดํจ ์ด๋ฒคํธ ํธ๋ค๋ฌ
  . useCapture: ture(capturing ์ฌ์ฉ), false(bubbling ์ฌ์ฉ : ๊ธฐ๋ณธ๊ฐ)removeEventListener: addEventListener๋ฅผ ํตํด ์ ๋ฌ๋ ์ธ์๋ฅผ removeEventListener์ ๋น ์ง์์ด ์ ๋ฌํด์ผ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ ๊ฑฐ๋๋ค. ๋ํ ๋ฌด๋ช
ํจ์๋ฅผ ํธ๋ค๋ฌ๋ก ๋ฑ๋กํ  ๊ฒฝ์ฐ ์ ๊ฑฐํ  ์ ์์ผ๋ ํธ๋ค๋ฌ์ ์ฐธ์กฐ๋ฅผ ๋ณ์๋ ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํ๊ณ  ์์ด์ผ ํ๋ค.<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <button>Click me!</button>
    <script>
      const $button = document.querySelector("button");
      const handleClick = function () {
        console.log("click!");
      };
      $button.addEventListener("click", handleClick, true);
      
      // ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํ ๋นํ  ๋ ์ ๋ฌํ๋ ์ธ์๋ฅผ ๊ทธ๋๋ก ์ ๋ฌํ์ง ์์ผ๋ฉด ์ ๊ฑฐ๋์ง ์๋๋ค.
      $button.removeEventListener("click", handleClick);
      // ์ฌ๊ธฐ์ ์ ๋๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ ๊ฑฐ๋๋ค.
      $button.removeEventListener("click", handleClick, true);
    </script>
  </body>
</html>์ถ์ฒ: ๋ชจ๋ ์๋ฐ ์คํฌ๋ฆฝํธ Deep Dive-์ด์ ๋ชจ