์žฌ๋ฐŒ๊ฒŒ ํ•ฉ์‹œ๋‹ค

๊ธฐ๋กํ•˜๊ธฐ, ๊ฐ€์‹œํ™”ํ•˜๊ธฐ

Vanilla JS

“DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•œ๋‹ค” ์˜ ์˜๋ฏธ์™€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณธ์งˆ

์€๋˜๋”” 2022. 10. 8. 20:09

Vanilla Javascript๋กœ ์›น ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ | ๊ฐœ๋ฐœ์ž ํ™ฉ์ค€์ผ
์œ„ ๊ธ€์„ ์ฝ๋‹ค๊ฐ€ ํ•œ ๊ฐ€์ง€ ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค.

 

์ด์ œ๋Š” ์ง์ ‘์ ์œผ๋กœ DOM์„ ๋‹ค๋ฃจ๋Š” ํ–‰์œ„๊ฐ€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๊ฐ์†Œํ–ˆ๊ณ , ์ƒํƒœ(State) ๋ฅผ ๊ธฐ์ค€์œผ๋กœ DOM์„ ๋ Œ๋”๋ง ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐœ์ „ํ•œ ๊ฒƒ์ด๋‹ค. DOM์ด ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ State์— ์ข…์† ๋˜์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด, State๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ DOM์ด ๋ณ€ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๊ธ€์€ DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๊ณผ state์— ๋”ฐ๋ผ DOM์„ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ์„œ๋กœ ๋Œ€์ฒ™์ ์— ์žˆ๋Š” ๋ฐ˜๋Œ€ ๊ฐœ๋…์œผ๋กœ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค. ๋‚œ ์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์–ด์งธ์„œ ๋ฐ˜๋Œ€ ๊ฐœ๋…์ด ๋˜๋Š” ๊ฒƒ์ธ์ง€ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•˜๋‹ค. state์— ๋”ฐ๋ผ DOM์„ ๋ Œ๋”๋งํ•˜๋Š” ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋„, innerHTML API๋ฅผ ์‚ฌ์šฉํ•ด DOM์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋‚˜?

 

์ถœ์ฒ˜ ํ™ฉ์ค€์ผ ๋ธ”๋กœ๊ทธ

 

์ด ์˜๋ฌธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, DOM์— ์ง์ ‘ ์ ‘๊ทผํ•œ๋‹ค ๋ž€ ๋ง์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿ˜ˆ “DOM์— ์ง์ ‘ ์ ‘๊ทผํ•œ๋‹ค”์˜ ์˜๋ฏธ

์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ์›น๊ฐœ๋ฐœ์ด ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ๋ฐœ์ „ํ•ด์™”๋Š”์ง€๋ฅผ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

์šฐ์„  ์งš๊ณ  ๊ฐ€์ž. ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชฉ์ ์€, ์ •์ ์ธ HTML ๋ฌธ์„œ๋ฅผ ์กฐ์ž‘ํ•ด ๋Œ€ํ™”ํ˜• ์›น(interactive web)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ์˜ˆ๋‚˜ ์ง€๊ธˆ์ด๋‚˜ ๋ณ€์น˜์•Š๋Š” ๋Œ€์ „์ œ์ด๋‹ค.


์œ„ ๋ชฉ์ ์„ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ DOM API๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. DOM API๋Š” ๋ง๊ทธ๋Œ€๋กœ DOM ์š”์†Œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” API์ด๋‹ค. getElementById, innerHTML, ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” appendChild , ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” createElement ๋“ฑ์ด DOM API์— ํ•ด๋‹นํ•œ๋‹ค. ํ•œ ๋•Œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์—ˆ๋˜ JQuery๋Š” ์ด๋Ÿฌํ•œ DOM ์กฐ์ž‘์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

โœ… JQuery์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹

JQuery๋ฅผ ํ•„๋‘๋กœ ํ•œ DOM ์ œ์–ด ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.

์ถœ์ฒ˜ NaverD2 TECH CONCERT: FRONT END 2019

 

Element A,B,C๋Š” ๊ฐ DOM ์š”์†Œ๋ฅผ ์˜๋ฏธํ•˜๊ณ , DOM ์š”์†Œ์˜ data ์†์„ฑ๊ฐ’์œผ๋กœ ์ƒํƒœ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

์ƒํƒœ๊ด€๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์ด๋ค„์ง„๋‹ค.

  1. ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ DOM์„ ์„ ํƒํ•œ๋‹ค.
  2. ์„ ํƒํ•œ DOM์œผ๋กœ๋ถ€ํ„ฐ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
    ์ฆ‰ DOM์ด ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์šฐ๋ฆฐ DOM ์š”์†Œ๊ฐ€ ๊ฐ€์ง„ ์ƒํƒœ๊ฐ’์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

 

โœ… JQuery ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

DOM์ด ๊ฐ€์ง„ ์ƒํƒœ ๋ฐ์ดํ„ฐ์— ์˜์กดํ•˜๋Š” ๊ฑด ์–ด๋–ค ๋ฌธ์ œ์ ์ด ์žˆ์„๊นŒ? ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž.

์ถœ์ฒ˜ NaverD2 TECH CONCERT: FRONT END 2019

 


์ด ์ƒํ™ฉ์—์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋„์ค‘์— Element A์˜ ์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? Element B๋Š” ์ž˜๋ชป๋œ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋  ๊ฒƒ์ด๋‹ค. ๊ฐœ๋ณ„ DOM ์š”์†Œ๊ฐ€ ์ƒํƒœ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ด๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†๋‹ค. ์›นํŽ˜์ด์ง€๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  UI๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์–ด๋Š ์ง€์ ์—์„œ ์–ด๋Š ์‹œ์ ์— ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ์ถ”์ ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ด๋Š” ์˜ค๋ฅ˜๋ฅผ ๋‚ณ๋Š”๋‹ค.


JQuery ์ƒํƒœ๊ด€๋ฆฌ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ state์— ๋”ฐ๋ผ DOM์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ƒํƒœ๊ด€๋ฆฌ์˜ ์ฃผ๋„๊ถŒ์„ DOM์œผ๋กœ๋ถ€ํ„ฐ ๋นผ์•—์•„์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

 

โœ… DOM ์ œ์–ด ๋ฐฉ์‹ ์ •๋ฆฌ

state์— ๋”ฐ๋ผ DOM์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹(=์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ)์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…์œผ๋กœ์„œ์˜ DOM ์ œ์–ด ๋ฐฉ์‹์€, ๋‹จ์ˆœํžˆ “DOM API๋ฅผ ์‚ฌ์šฉํ•ด DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ”๋งŒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค. DOM ์š”์†Œ๊ฐ€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , DOM API๋ฅผ ์ด์šฉํ•ด DOM ์š”์†Œ๋กœ๋ถ€ํ„ฐ ์ƒํƒœ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ , ์ƒํƒœ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

 

๐Ÿ˜‡ ์ปดํฌ๋„ŒํŠธ

๊ทธ๋Ÿผ ์ด์ œ DOM ์ œ์–ด ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์ž. ์ปดํฌ๋„ŒํŠธ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์š”์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • state: ์ƒํƒœ๊ฐ€ ์—ฌ๋Ÿฌ DOM ์š”์†Œ์— ๋ถ„์‚ฐ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ , state๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.
  • setState: ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์€ setState๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ด๋ค„์ง„๋‹ค. ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ ์ง€์ ๊ณผ ์‹œ์ ์ด ๋ช…ํ™•ํ•ด์ง„๋‹ค.
  • render: state์— ๋งž๊ฒŒ DOM์„ ๋ Œ๋”๋งํ•œ๋‹ค. DOM์€ ์ด์ œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ๊ทธ์ € state๋ฅผ ๋ฐ˜์˜ํ•ด UI๋ฅผ ๊ทธ๋ฆฌ๋Š” ์—ญํ• ์„ ํ•  ๋ฟ์ด๋‹ค.

๐Ÿ™€ ์ด์ œ DOM์€ ๋ชจ๋“  ์ฃผ๋„๊ถŒ์„ ๋นผ์•—๊ฒผ๋‹ค! ๐Ÿ™€


์•„๋ž˜๋Š” ํ™ฉ์ค€์ผ๋‹˜ ๋ธ”๋กœ๊ทธ์—์„œ ๊ฐ€์ ธ์˜จ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด์ž. DOM ์š”์†Œ(button ํƒœ๊ทธ)์— ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ถ™์ด๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ UI(DOM ์š”์†Œ)๋ฅผ ํด๋ฆญํ•˜๋ฉด setState ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚œ๋‹ค. ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚œ ํ›„, render ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ๋ฐ˜์˜๋œ DOM์ด ๋ Œ๋”๋ง๋œ๋‹ค. DOM์€ ์ƒํƒœ ๋ณ€๊ฒฝ์— ์ง์ ‘์ ์œผ๋กœ ๊ด€์—ฌํ•˜๋Š” ๋ฐ”๊ฐ€ ์—†๋‹ค. ๋˜ render ํ•จ์ˆ˜์™€ setEvent ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š”, ๊ฐœ๋ณ„ DOM ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ์ผ๋„ ์—†๋‹ค.

 

๐Ÿ‘๐Ÿป ๋งˆ๋ฌด๋ฆฌ

์‚ฌ์‹ค ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณผ์ œ๊ด€ ํ•ด์„ค์„ ๋ณผ ๋•Œ๋„ ๋น„์Šทํ•œ ๊ถ๊ธˆ์ฆ์„ ๊ฐ€์กŒ์—ˆ๋‹ค.

๊ณผ์ œ๊ด€ ํ•ด์„ค ์บก์ณ


DOM ์ ‘๊ทผ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ์ปดํฌ๋„ŒํŠธ ํ˜•ํƒœ๋กœ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒŒ ๋Œ€์ฒด ๋ฌด์Šจ ์ƒ๊ด€์ด์ง€? DOM ์ ‘๊ทผ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค๋Š” ๊ฑด ๋˜ ๋ญ์•ผ?


์ด ์ง€์ ์„ ๋“œ๋””์–ด ์ดํ•ดํ•ด๋ƒˆ๋‹ค.


๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹Œ ๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœ์— ์ž…๋ฌธํ•œ ์‚ฌ๋žŒ์œผ๋กœ์„œ, ๋‚ด๊ฒ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์ด ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ๋‹น์—ฐํ–ˆ๋‹ค. ํ•ด๋‹น ๋ฐฉ์‹์˜ ์กด์žฌ ์ด์œ ์™€ ๋ชฉ์ ์— ๋Œ€ํ•ด ๊ณ ๋ฏผ ํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๋“ฑ์žฅ ์ด์ „์˜ ์ƒํƒœ๊ด€๋ฆฌ ๋ฐฉ์‹๊ณผ JQuery๋ฅผ ์‚ดํŽด๋ด„์œผ๋กœ์จ, ์ปดํฌ๋„ŒํŠธ์˜ ๋ณธ์งˆ์— ๋Œ€ํ•ด ๋ณด๋‹ค ์ž˜ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


์ด๋ฒˆ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณธ์งˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๊ธฐ์กด์— DOM ์š”์†Œ์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ ์ƒํƒœ๋ฅผ, ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ state๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
  • state์— ๋”ฐ๋ผ UI๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค. UI๋Š” state์˜ ๋ณ€๊ฒฝ์— ์˜ํ•ด์„œ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • state๋Š” setState ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค.
    ์ •๋ฆฌํ•˜์ž๋ฉด ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ๊ฐ’์„ state๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ, UI์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ์„ ๋ณด์žฅํ•œ๋‹ค.

 

Reference

Vanilla Javascript๋กœ ์›น ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ | ๊ฐœ๋ฐœ์ž ํ™ฉ์ค€์ผ

TECH CONCERT: FRONT END 2019 - ๋ฐ์ดํ„ฐ ์ƒํƒœ ๊ด€๋ฆฌ. ๊ทธ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋งˆ

‘2021 Dev-Matching: ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž(์ƒ๋ฐ˜๊ธฐ)’ ๊ธฐ์ถœ ๋ฌธ์ œ ํ•ด์„ค :: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๊ณต์‹ ๋ธ”๋กœ๊ทธ