๐Ÿ“† 2025.04.14 - clientโ€side JS, DOM, node types [๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ๋ถ€ํŠธ์บ ํ”„ ํ”„๋ก ํŠธ์—”๋“œ13๊ธฐ]

rogieยท2025๋…„ 4์›” 15์ผ

likelion-posting

๋ชฉ๋ก ๋ณด๊ธฐ
4/10

๐Ÿง  ๋ฐฐ์šด ์  & ์ •๋ฆฌ

์˜ค๋Š˜ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ธ์‚ฌ์ดํŠธ, ๊ฐœ๋… ์š”์•ฝ ๋“ฑ

  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ž€?

    • ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ
      ECMAScript: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์— ๋Œ€ํ•œ ํ‘œ์ค€
      patrick Charollais | ECMA-262 - Ecma lnternational

    • DOM(Document Object Model): ์›นํŽ˜์ด์ง€ ์ œ์–ด๋ฅผ ์œ„ํ•œ ํ‘œ์ค€

    • BOM(Browser Object Model): ์›นํŽ˜์ด์ง€ ์™ธ๋ถ€์˜ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ ์ œ์–ด๋ฅผ ์œ„ํ•œ ํ‘œ์ค€

      • HTML ํ‘œ์ค€ : https://html.spec.whatwg.org
      • window. navigator: ๋ธŒ๋ผ์šฐ์ €์™€ ์šด์˜์ฒด์ œ์— ๋Œ€ํ•œ ์ •๋ณด ์ œ๊ณต
      • window.location: ํ˜„์žฌ ํŽ˜์ด์ง€์˜ URL ์— ๋Œ€ํ•œ ์ œ์–ด ์ฝ๊ธฐ , ์ˆ˜์ •
      • window.history: ๋ธŒ๋ผ์šฐ์ €์˜ ๊ณผ๊ฑฐ ํŽ˜์ด์ง€ ์ด๋™ ์ •๋ณด์— ๋Œ€ํ•œ ์ œ์–ด ์ฝ๊ธฐ , ์ˆ˜์ •
      • alert, setTimeout ๋“ฑ
    • Web APIs: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์›น ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ํ‘œ์ค€

      • https://spec.whatwg.org
      • XMLHttpRequest: ์„œ๋ฒ„์™€ ํ†ต์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด (Ajax)
      • Web Storage, Notifications API, WebSocket ๋“ฑ

        image
        1. DOM / 2. BOM / 3. WEB APls
      • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ vs ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ
        • ๐ŸŒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ (Client-side)

          • โœ… ์ •์˜

            ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ณด๋Š” ๋ธŒ๋ผ์šฐ์ € ์ชฝ์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”.
            ์ฆ‰, HTML, CSS, JavaScript๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜์–ด, ํ™”๋ฉด์— ๋ณด์ด๊ณ  ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋ฐ˜์‘ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.

          • โœ… ํŠน์ง•

            • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋จ
            • ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘ ์ œ๊ณต (์˜ˆ: ๋ฒ„ํŠผ ํด๋ฆญ โ†’ ํŒ์—… ์—ด๊ธฐ)
            • ์ฃผ๋กœ UI ์ฒ˜๋ฆฌ, ์ž…๋ ฅ ๊ฒ€์ฆ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์„ ๋‹ด๋‹น
          • โœ… ์˜ˆ์‹œ

            ์‡ผํ•‘๋ชฐ ์›น์‚ฌ์ดํŠธ์—์„œ ์ œํ’ˆ ๋ชฉ๋ก์„ ๋ณด๊ณ , "์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ" ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ˆซ์ž๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ธฐ๋Šฅ

            โ†’ ์ด๊ฑด ๋ธŒ๋ผ์šฐ์ €์—์„œ JavaScript๊ฐ€ ์‹คํ–‰๋œ ๊ฒฐ๊ณผ = ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ


        • ๐Ÿ–ฅ๏ธ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ (Server-side)

          • โœ… ์ •์˜

          ์„œ๋ฒ„์‚ฌ์ด๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์™€๋Š” ๋–จ์–ด์ง„ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์˜ˆ์š”.

          Node.js ๊ฐ™์€ ๋ฐฑ์—”๋“œ ๊ธฐ์ˆ ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹น๋ผ์š”. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ(request)์„ ๋ณด๋‚ด๋ฉด, ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์„œ ์‘๋‹ต(response)์„ ๋Œ๋ ค์ค˜์š”.

          • โœ… ํŠน์ง•

            • ์„œ๋ฒ„์—์„œ ์‹คํ–‰
            • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ, ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ, ํŒŒ์ผ ์ €์žฅ ๋“ฑ ๋ณด์•ˆ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ๊ฐ•ํ•จ
            • ์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„ ์ฝ”๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
          • โœ… ์˜ˆ์‹œ

            ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์„œ๋ฒ„์— ์ „๋‹ฌ๋˜๊ณ , ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™•์ธํ•œ ํ›„ ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ

            โ†’ ์ด๊ฑด ์„œ๋ฒ„์—์„œ Node.js๊ฐ€ ๋™์ž‘ํ•œ ๊ฒฐ๊ณผ = ์„œ๋ฒ„ ์‚ฌ์ด๋“œ


          • ๐ŸŽฏ ๋น„์œ ๋กœ ์ดํ•ดํ•ด๋ณด๊ธฐ
            | ์—ญํ•  | ์„ค๋ช… | ๋น„์œ  |
            | --- | --- | --- |
            | ํด๋ผ์ด์–ธํŠธ์‚ฌ์ด๋“œ | ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ํ™”๋ฉด์„ ๊พธ๋ฏธ๊ณ  ๋ฐ˜์‘ | ๋ ˆ์Šคํ† ๋ž‘์˜ ๋ฉ”๋‰ดํŒ๊ณผ ์ข…์—…์› |
            | ์„œ๋ฒ„์‚ฌ์ด๋“œ | ์‚ฌ์šฉ์ž์˜ ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์š”๋ฆฌ๋ฅผ ์ œ๊ณต | ์ฃผ๋ฐฉ์—์„œ ์š”๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ์…ฐํ”„์™€ ์ฃผ๋ฐฉ ์‹œ์Šคํ…œ |

  • DOM(Document Object Model)

    • ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ
    • HTML, XML ๋“ฑ์˜ ๋ฌธ์„œ๋ฅผ ์ œ์–ด ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ •์˜
    • JavaScript๋กœ HTML์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค
    • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์˜ HTML, XML ๋ฌธ์„œ๋ฅผ ์ผ์ •ํ•œ ๊ทœ์น™์— ์˜ํ•ด ๊ฐ์ฒด๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์ œ์–ด ํŠน์ • ์š”์†Œ๋ฅผ ์ถ”์ถœ , ์‚ฝ์ž… , ์‚ญ์ œ , ์ด๋™ ๋“ฑ

  • ๋…ธ๋“œ์˜ ์ข…๋ฅ˜

    ๋…ธ๋“œ (Node)
    DOM ํŠธ๋ฆฌ๊ตฌ์กฐ๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ์›์ด ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋กœ ์ธ์‹๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ฐ์ฒด ํ•˜๋‚˜ ํ•˜๋‚˜๋ฅผ ๋…ธ๋“œ๋ผ๊ณ  ํ•จ
    • ๋…ธ๋“œ์˜ ์ข…๋ฅ˜ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋…ธ๋“œ

      • ๋ฌธ์„œ๋…ธ๋“œ (document Node)
      • ์š”์†Œ ๋…ธ๋“œ (element Node)
      • ์†์„ฑ ๋…ธ๋“œ (attribute Node)
      • ํ…์ŠคํŠธ ๋…ธ๋“œ (text Node)
      ์ข…๋ฅ˜์„ค๋ช…nodeNamenodeTypenodeValue
      ๋ฌธ์„œ ๋…ธ๋“œ๋ฌธ์„œ#document9null
      ์š”์†Œ ๋…ธ๋“œํƒœ๊ทธํƒœ๊ทธ์˜ ์ด๋ฆ„1null
      ์†์„ฑ ๋…ธ๋“œ์š”์†Œ์˜ ์†์„ฑ์†์„ฑ์˜ ์ด๋ฆ„2์†์„ฑ์˜ ๊ฐ’
      ํ…์ŠคํŠธ ๋…ธ๋“œ์š”์†Œ์˜ ๋‚ด์šฉ#text3๋ฌธ์ž์—ด ๊ฐ’
    • ๋…ธ๋“œ ์ฐพ๊ธฐ

      • ํƒœ๊ทธ์˜ id ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋…ธ๋“œ ์ฐพ๊ธฐ
        document.getElementById (id): id ์†์„ฑ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜

        const purchases = document.getElementById("purchases");
      • ํƒœ๊ทธ๋ช…์„ ์ด์šฉํ•˜์—ฌ ๋…ธ๋“œ ์ฐพ๊ธฐ
        ์š”์†Œ๋…ธ๋“œ getElementsByTagName(tagName)
        ์ง€์ •ํ•œ ์š”์†Œ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํƒœ๊ทธ๋ช… (tagName) ์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋…ธ๋“œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ tagName ์— โ€œ*โ€์„ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜

        const liList = purchases.getElementsByTagName("li");
      • ํŠธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋…ธ๋“œ ์ฐพ๊ธฐ

        • ๋ถ€๋ชจ ์ž์‹ ๋…ธ๋“œ ์ฐพ๊ธฐ

          ์š”์†Œ๋…ธ๋“œ์˜ ์†์„ฑ์„ค๋ช…
          childNodes์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ €์žฅ โ‡’ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด
          firstChild์ฒซ๋ฒˆ์งธ ์ž์‹ ๋…ธ๋“œ(์š”์†Œ, ํ…์ŠคํŠธ, ์ฃผ์„)
          firstElementChild์ฒซ๋ฒˆ์งธ ์ž์‹ ์š”์†Œ ๋…ธ๋“œ
          lastChild๋งˆ์ง€๋ง‰ ์ž์‹ ๋…ธ๋“œ(์š”์†Œ, ํ…์ŠคํŠธ, ์ฃผ์„)
          lastElementChild๋งˆ์ง€๋ง‰ ์ž์‹ ์š”์†Œ ๋…ธ๋“œ
          parentNode๋ถ€๋ชจ ๋…ธ๋“œ
          const purchases = document.getElementById('purchases'); // id๋ฅผ ์ถ”์ถœํ•˜๋Š” ์ฝ”๋“œ
          const firstItem = purchases.firstElementChild; // ์ฒซ๋ฒˆ์งธ ์ž์‹๋งŒ ์„ ํƒํ•จ
          const lastItem = purchases.lastElementChild; // ๋งˆ์ง€๋ง‰ ์ž์‹๋งŒ ์„ ํƒ
          const liList = purchases.childNodes; // ์œ ์‚ฌ๋ฐฐ์—ด ๊ฐ์ฒด ์ถ”์ถœ
          • ํ˜•์ œ ๋…ธ๋“œ ์ฐพ๊ธฐ

            ์†์„ฑ์„ค๋ช…
            previousSibling๋ฐ”๋กœ ์•ž์˜ ํ˜•์ œ ๋…ธ๋“œ(์š”์†Œ, ํ…์ŠคํŠธ, ์ฃผ์„)
            previousElementSibling๋ฐ”๋กœ ์•ž์˜ ํ˜•์ œ ์š”์†Œ ๋…ธ๋“œ
            nextSibling๋ฐ”๋กœ ๋’ค์˜ ํ˜•์ œ ๋…ธ๋“œ(์š”์†Œ, ํ…์ŠคํŠธ, ์ฃผ์„)
            nextElementSibling๋ฐ”๋กœ ๋’ค์˜ ํ˜•์ œ ์š”์†Œ ๋…ธ๋“œ
            const purchases = document.getElementById("purchases");
            const secondItem = purchases.childNodes[3];
            const firstItem = secondItem.previousElementSibling;
            const lastItem = secondItem.nextElementSibling;
            
      • class ์†์„ฑ์œผ๋กœ ๋…ธ๋“œ ์ฐพ๊ธฐ
        document.getElementsByClassName(className): class ์†์„ฑ๊ฐ’์ด className ์ธ ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜

        const purchases = document.getElementsByClassName("list")[0];
      • CSS ์…€๋ ‰ํ„ฐ ์ด์šฉ

        • Selector: CSS ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ์„ ํƒ ๊ตฌ๋ฌธ
        • document.querySelector (selector)
          • ์ง€์ •ํ•œ selector ๊ตฌ๋ฌธ์— ๋งค์นญ๋˜๋Š” ๋…ธ๋“œ ๋ชฉ๋ก ์ค‘ ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜
        • document.querySelectorAll (selector)
          • ์ง€์ •ํ•œ selector ๊ตฌ๋ฌธ์— ๋งค์นญ๋˜๋Š” ๋…ธ๋“œ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜
        var purchases = document.querySelector(".list");
        var purchases = document.querySelector("#purchases");
        var purchases = document.querySelectorAll("ul")[0];

๐Ÿ”— ๋ฐฐ์› ๋˜ ํŒŒ์ผ


โ“ ์ƒ๊ธด ์งˆ๋ฌธ / ๋” ์•Œ์•„๋ณผ ๊ฒƒ

  • ์˜ค๋Š˜์€ ๊ทธ๋ž˜๋„ ์•„๋Š” ๋‚ด์šฉ์ด๋ผ์„œ ์ˆ˜์—…์„ ๋Œ€์ถฉ๋Œ€์ถฉ ๋“ค์—ˆ๋˜ ๊ธฐ๋ถ„์ด์—ˆ๋‹ค ๋‚ด์ผ์€ ์ข€ ๋” ์ง‘์ค‘ํ•ด์„œ ๋“ค์–ด์•ผ์ง€

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ

profile
front-end๋ฅผ ๊ฟˆ๊ฟ‰๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€