๐ ํ๋ฐฉ์ ์ดํดํ๋ 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>
์ ํธ๋ฆฌ๋ <div class= ‘my-class’></div> ํ๊ทธ๋ฅผ DOM ์ผ๋ก ํํํ ๊ฒ์ธ๋ฐ ์์์ className์ด property๊ฐ ๋๋ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋๋ค. div ํ๊ทธ ์์ class="์ด๋ฆ" ์ผ๋ก ๋์ด์๋๋ฐ className ์์ฑ๋ช
์ผ๋ก ์ ๊ทผํด์ ์ค์ ํ ์ ์๋ ์ด์ ๋ ์ดํธ๋ฆฌ๋ทฐํธ์ ํ๋กํผํฐ๊ฐ ๋น๋ก ์ด๋ฆ์ ๋ค๋ฅผ์ง๋ผ๋ ์๋ก ์ฐ๊ฒฐ๋์ด์์ด์ ๊ทธ๋ ๋ค.
DOM์ HTML์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด(Object)๋ก ํํํ ๋ฌธ์ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก HTML ๊ตฌ์กฐ์ ๋ถ๋ถ๊ณผ ํต์ ํ๊ณ , ์ ๋ฐ์ดํธํ๊ณ , ์์ฑํ๊ณ , ์ญ์ ํ๋ ํ์๋ฅผ ํ ์ ์๋ค.
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 ์ธ์ฑ ๊ทธ๋๋ก ์๋๊ฑธ ๋ณผ ์ ์๋ค.
์์์ ๋งํ ์ดํธ๋ฆฌ๋ทฐํธ๋ ์ ์ ์ด๊ณ ํ๋กํผํฐ๋ ๋์ ์ด๋ผ๋ ๋ง์ด ๋ฐ๋ก ์ด๊ฒ์ด๋ค. ์ดํธ๋ฆฌ๋ทฐํธ์ ํ๋กํผํฐ๋ ๋์ด ์ฐ๊ฒฐ๋์ด ์๊ธด ํ์ง๋ง ์๋ฐํ ๋ค๋ฅธ ๋ ์์ด๋ผ, ํ๋กํผํฐ์ ๊ฐ์ ๋ณ๊ฒฝํด๋ DOM ๊ฐ์ฒด๋ง ์ ๋ฐ์ดํธ ๋๊ณ HTML์ ์ ๋ฐ์ดํธ ๋์ง ์์ ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ ๊ทธ๋๋ก ์ธ ๊ฒ์ด๋ค.
DOM์ JavaScript ๋ชจ๋ธ์ด๋ฏ๋ก ๊ตณ์ด HTML ์์ฑ์ ๊ณ์ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋ค. ์ค์ ๋ก ๋ฆฌ์์ค ๋ญ๋น๊ฐ ๋ ์ ์์ด ์ด๋ฐ์์ผ๋ก ์ค๊ณ ๋์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๋ฐ๋ผ์ DOM๊ณผ HTML ๋๋ค ํน์ ์์ฑ์ ๋ํด ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด, setAttribute() ๋ฉ์๋๋ฅผ ํตํด ์
๋ฐ์ดํธ ํด์ฃผ๋ฉด ๋๋ค.
const input = document.querySelector('input');
input.setAttribute('value', 99);
console.log(input.value); // '99'
์ฌ์ฉ์ ์ ์ ์์ฑ ์ ๊ทผ ์ฐจ์ด
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