Language/JavaScript (WEB)

๐ŸŒ ํ•œ๋ฐฉ์— ์ดํ•ดํ•˜๋Š” attribute ์™€ property ์†์„ฑ ์ฐจ์ด

์ธํŒŒ_ 2023. 4. 17. 08:12

attribute-property

Attribute vs Property ์ •์˜ ์ฐจ์ด

attribute ์™€ property ๋ฅผ ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•˜์ž๋ฉด ๋‘˜๋‹ค '์†์„ฑ' ์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋‹จ์–ด๋ช…์ด ๊ฐ™์€ ๊ฒƒ์„ ๋– ๋‚˜์„œ ์‹ค์ œ๋กœ ๋‘˜์€ html ์š”์†Œ์— ๋Œ€ํ•œ ํด๋ž˜์Šค์™€ ์•„์ด๋””์™€ ๊ฐ™์€ ์†์„ฑ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด์ฒ˜๋Ÿผ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ”„๋กœํผํ‹ฐ์˜ ๋‘˜์€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๋‚ดํฌํ•˜์ง€๋งŒ, ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ด ๋‘˜์€ ๊ตฌ์ฒด์ ์ธ ์ฐจ์ด์ ์ด ์กด์žฌ ํ•œ๋‹ค.

 

HTML์˜ Attribute

์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” HTML์˜ ์†์„ฑ์ด๋‹ค. ์—˜๋ฆฌ๋จผํŠธ์— ์•„์ด๋””๋‚˜ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ผ์ปซ๋Š”๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค

<!-- div ์—˜๋ฆฌ๋จผํŠธ์˜ id์™€ class ์†์„ฑ์€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋‹ค -->
<div id="inpa" class="bold"></div>

<!-- input ์—˜๋ฆฌ๋จผํŠธ์˜ type๊ณผ value ์†์„ฑ์€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์ด๋‹ค -->
<input type="text" value="0">

 

DOM์˜ Property

ํ”„๋กœํผํ‹ฐ๋Š” DOM์˜ ์†์„ฑ์ด๋‹ค. ์ฆ‰, html์˜ attribute๋ฅผ DOM ๋‚ด์—์„œ ๋Œ€์‹ ํ•ด์„œ ํ‘œํ˜„์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

<div class='my-class' style="color: red;"></div>

<script>
    // className๊ณผ style์€ ํ”„๋กœํผํ‹ฐ์ด๋‹ค
    document.querySelector('div').className; // "my-class"
    document.querySelector('div').style.color; // "red"
</script>

DOM์˜ Property

์œ„ ํŠธ๋ฆฌ๋Š” <div class= ‘my-class’></div> ํƒœ๊ทธ๋ฅผ DOM ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ธ๋ฐ ์œ„์—์„œ className์ด property๊ฐ€ ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค. div ํƒœ๊ทธ ์•ˆ์— class="์ด๋ฆ„" ์œผ๋กœ ๋˜์–ด์žˆ๋Š”๋ฐ className ์†์„ฑ๋ช…์œผ๋กœ ์ ‘๊ทผํ•ด์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋น„๋ก ์ด๋ฆ„์€ ๋‹ค๋ฅผ์ง€๋ผ๋„ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์–ด์„œ ๊ทธ๋ ‡๋‹ค.

DOM์€ HTML์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด(Object)๋กœ ํ‘œํ˜„ํ•œ ๋ฌธ์„œ ๋ชจ๋ธ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ HTML ๊ตฌ์กฐ์˜ ๋ถ€๋ถ„๊ณผ ํ†ต์‹ ํ•˜๊ณ , ์—…๋ฐ์ดํŠธํ•˜๊ณ , ์ƒ์„ฑํ•˜๊ณ , ์‚ญ์ œํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[JS] ๐Ÿ“š ๋ธŒ๋ผ์šฐ์ € DOM ๋‹ค๋ฃจ๊ธฐ ๋ฌธ๋ฒ• ๐Ÿ’ฏ ์ด์ •๋ฆฌ

๋ธŒ๋ผ์šฐ์ € DOM ์ข…๋ฅ˜ ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ๋ฌธ์„œ๋ฅผ ๋กœ๋“œํ•œ ํ›„, ํ•ด๋‹น ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋ชจ๋ธ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ ๋ชจ๋ธ์€ ๊ฐ์ฒด์˜ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์„ DOM tree๋ผ ํ•œ๋‹ค. ๋ฌธ์„œ ๋…ธ๋“œ(Document Node) ํŠธ๋ฆฌ์˜

inpa.tistory.com


Attribute vs Property ๊ธฐ๋Šฅ ์ฐจ์ด

 

์—˜๋ฆฌ๋จผํŠธ ์†์„ฑ ์ ‘๊ทผ ์ฐจ์ด

attribute๋Š” html ์•ˆ์—์„œ property ๋Š” DOM tree ์•ˆ์—์„œ ์กด์žฌํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋œปํ•˜๋Š” ๋ฐ”๋Š” attribute๋Š” ์ •์ ์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  property๋Š” ๋™์ ์œผ๋กœ ๊ทธ ๊ฐ’์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฒดํฌ ๋ฐ•์Šค ํƒœ๊ทธ๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์ €๊ฐ€ ์ฒดํฌ๋ฐ•์Šค์— ์ฒดํฌ๋ฅผ ํ•˜๋ฉด attribute์˜ ์ƒํƒœ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์ง€๋งŒ property์˜ ์ƒํƒœ๋Š” checked๋กœ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค.

์‹ค์ „ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž. ์•„๋ž˜ input ํƒœ๊ทธ๊ฐ€ ์žˆ๊ณ  value ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋กœ 0 ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

<input type="text" value="0">

์ด๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ DOM ๋ฌธ๋ฒ•์„ ํ†ตํ•ด์„œ input ์—˜๋ฆฌ๋จผํŠธ์— ์ ‘๊ทผํ•ด value ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ input.value ๋Š” ํ”„๋กœํผํ‹ฐ์ด๋‹ค.

const input = document.querySelector('input');
console.log(input.value); // '0'

์ด๋ฒˆ์—” value ์†์„ฑ๊ฐ’์„ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด์ž. input.value ์˜ ๊ฐ’์„ ์žฌ์„ค์ •ํ•˜๊ณ  ๋‹ค์‹œ ํ™•์ธํ•ด ๋ณด๋ฉด ๋ณ€๊ฒฝ๋œ ๊ฐ’์œผ๋กœ ์„ค์ • ๋˜์—ˆ์Œ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

input.value = 66;
console.log(input.value); // '66'

๊ทธ๋Ÿฐ๋ฐ HTML ํƒœ๊ทธ๋ฅผ ๋ณด๋ฉด ์—ฌ์ „ํžˆ value์˜ ๊ฐ’์€ 0 ์ธ์ฑ„ ๊ทธ๋Œ€๋กœ ์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

attribute-property

์œ„์—์„œ ๋งํ•œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์ •์ ์ด๊ณ  ํ”„๋กœํผํ‹ฐ๋Š” ๋™์  ์ด๋ผ๋Š” ๋ง์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค. ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์™€ ํ”„๋กœํผํ‹ฐ๋Š” ๋‘˜์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธด ํ•˜์ง€๋งŒ ์—„๋ฐ€ํžˆ ๋‹ค๋ฅธ ๋…€์„์ด๋ผ, ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ DOM ๊ฐ์ฒด๋งŒ ์—…๋ฐ์ดํŠธ ๋˜๊ณ  HTML์€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์•„ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์˜ ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์ธ ๊ฒƒ์ด๋‹ค.

DOM์€ JavaScript ๋ชจ๋ธ์ด๋ฏ€๋กœ ๊ตณ์ด HTML ์†์„ฑ์„ ๊ณ„์† ์—…๋ฐ์ดํŠธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์‹ค์ œ๋กœ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด ์ด๋Ÿฐ์‹์œผ๋กœ ์„ค๊ณ„ ๋˜์—ˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ DOM๊ณผ HTML ๋‘˜๋‹ค ํŠน์ • ์†์„ฑ์— ๋Œ€ํ•ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, setAttribute() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

const input = document.querySelector('input');

input.setAttribute('value', 99);

console.log(input.value); // '99'

attribute-property

 

์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ ์ ‘๊ทผ ์ฐจ์ด

HTML์— ๋ฏธ๋ฆฌ ์ •์˜๋œ ํƒœ๊ทธ์˜ ์†์„ฑ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž„์˜๋กœ ์—˜๋ฆฌ๋จผํŠธ์— ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ๋งŒ๋“ค์–ด ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

<!-- ์‹ค์ œ html์— ์—†๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์ž„์˜ ์†์„ฑ custom -->
<input type="text" value="0" custom="9999">

๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœํผํ‹ฐ์˜ ํŠน์ง•์œผ๋ก  ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ์†์„ฑ์ด ํ”„๋กœํผํ‹ฐ๋กœ ๋˜์ง€๋Š” ์•Š๋‹ค๋Š” ์ ์ด๋‹ค. HTML์— ์ง€์ •๋œ ์†์„ฑ๋“ค์€ ํ”„๋กœํผํ‹ฐ๋กœ๋„ ํ‘œํ˜„๋˜์ง€๋งŒ, ์—˜๋ฆฌ๋จผํŠธ์— ์ž„์˜๋กœ ์ง€์ •ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์€ ํ”„๋กœํผํ‹ฐ๋กœ ์ž๋™์œผ๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹ค์ œ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผํ•ด๋ณด๋ฉด 9999 ๊ฐ€ ์•„๋‹Œ undefined ๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚ด๋ฑ‰๋Š”๋‹ค.

const input = document.querySelector('input');
console.log(input.custom); // undefined

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ ค๋ฉด getAttribute() ์™€ setAttribute()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

console.log(input.getAttribute('custom')); // '9999'

 

์†์„ฑ ์ด๋ฆ„ ์ œ์•ฝ์‚ฌํ•ญ

ํ”„๋กœํผํ‹ฐ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„์€ ์ (.)์—ฐ์‚ฐ์ž ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์‹๋ณ„์ž๋กœ ๊ฐ„์ฃผ๋˜๊ณ , ์‹๋ณ„์ž ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผํ•ด์„œ ํ”„๋กœํผํ‹ฐ๋ช…์„ ์ด๋ฆ„ ์ง“๋Š”๋ฐ ์ œ์•ฝ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” background-image ์™€ ๊ฐ™์ด - ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ํ”„๋กœํผํ‹ฐ๋Š” ๋ณ€์ˆ˜๋ช… ๊ทœ์น™์— ๋”ฐ๋ผ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— backgroundImage ๋กœ ์ ‘๊ทผํ•ด์•ผ ๋œ๋‹ค.

const div = document.querySelector('div');

// ํ”„๋กœํผํ‹ฐ
div.style.backgroundImage = 'url()';

// ์–ดํŠธ๋ฆฌ๋ทฐํŠธ
div.setAttribute('style', 'background-image: url()');

ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๊ณผ ์†์„ฑ ์ด๋ฆ„์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ช‡๋ช‡ ์˜ˆ๋กœ๋Š”, class/className , readonly/readOnly, maxlength/maxLength ๋“ฑ์ด ์žˆ๋‹ค. ์˜ˆ์•ฝ์–ด์ธ ๊ฒฝ์šฐ className ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ์ด๋ฆ„์ด ์กด์žฌํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋‹จ์–ด๋กœ ์ด๋ฃจ์–ด์ง„ ์†์„ฑ์ด๋ฆ„์ธ ๊ฒฝ์šฐ ๋‚™ํƒ€ ํ‘œ๊ธฐ๋ฒ•(CamelCase)์„ ์‚ฌ์šฉํ•ด์„œ ํ‘œํ˜„๋œ๋‹ค.

 

์„ฑ๋Šฅ ์ฐจ์ด

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ์ด getAttribute() ์™€ setAttribute() ๋ฉ”์„œ๋“œ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋น ๋ฅด๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ๊ณผ ๊ฐ™์ด ๋ณ„๋„์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๊ณ  ๊ทธ์™ธ์—๋Š” ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ด์ƒ์ ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


# ์ฐธ๊ณ ์ž๋ฃŒ

https://ultimatecourses.com/blog/attributes-versus-properties-in-javascript

https://medium.com/hexlant/attribute-%EC%99%80-property-%EC%9D%98-%EC%B0%A8%EC%9D%B4-c6f1c91ba91