CSS-in-JS์ Shadow DOM์ ํ์ฉํ ์น ์ปดํฌ๋ํธ ์คํ์ผ๋ง ๊ธฐ๋ฒ์ ํ์ํฉ๋๋ค. ๊ธ๋ก๋ฒ ์น ๊ฐ๋ฐ์์ ์ฌ์ฌ์ฉ ๋ฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ฅ๋จ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์๋ณด์ธ์.
์น ์ปดํฌ๋ํธ ์คํ์ผ๋ง: CSS-in-JS vs. Shadow DOM โ ๊ธ๋ก๋ฒ ๊ด์
์น ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์๋ฅผ ๊ตฌ์ถํ๋ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ฉฐ, ์ด๋ ํ๋ ์น ๊ฐ๋ฐ, ํนํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๋์์ธ ์์คํ ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ ์ค๊ณ์ ํต์ฌ ์ธก๋ฉด์ ์คํ์ผ๋ง์ ๋๋ค. ์ฌ๋ฐ๋ฅธ ์คํ์ผ๋ง ์ ๋ต์ ์ ํํ๋ ๊ฒ์ ์ ์ง๋ณด์์ฑ, ์บก์ํ, ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด ๊ธ์์๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ธ CSS-in-JS์ Shadow DOM์ ์ฌ์ธต์ ์ผ๋ก ์ดํด๋ณด๊ณ , ๊ทธ ์ฅ์ ๊ณผ ๋จ์ , ๊ทธ๋ฆฌ๊ณ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํ ๊ธ๋ก๋ฒ ๊ด์ ์ ์ ๊ณตํฉ๋๋ค.
์น ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ๊ฐ?
์น ์ปดํฌ๋ํธ๋ ์บก์ํ๋ ์คํ์ผ๊ณผ ๋์์ ๊ฐ์ง ์ฌ์ฉ์ ์ ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ HTML ์์๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ์น ํ์ค ์งํฉ์ ๋๋ค. ์ด๋ ํ๋ซํผ์ ๊ตฌ์ ๋ฐ์ง ์์ผ๋ฏ๋ก, ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ(React, Angular, Vue.js)์ ํจ๊ป ์๋ํ๊ฑฐ๋ ์ฌ์ง์ด ํ๋ ์์ํฌ ์์ด๋ ์๋ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ์ ํต์ฌ ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฌ์ฉ์ ์ ์ ์์(Custom Elements): ์์ ๋ง์ HTML ํ๊ทธ์ ๊ทธ์ ์ฐ๊ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ก์ง์ ์ ์ํฉ๋๋ค.
- Shadow DOM: ์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌ์กฐ์ ์คํ์ผ๋ง์ ์บก์ํํ์ฌ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ์ ์คํ์ผ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- HTML ํ ํ๋ฆฟ: ํจ์จ์ ์ผ๋ก ๋ณต์ ํ๊ณ DOM์ ์ฝ์ ํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ HTML ์ค๋ํซ์ ์ ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ธ์. ๊ทธ๋ค์ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์คํ๋ ์ ํ ์นด๋๋ฅผ ๋ง๋ค์ด ์ฌ๋ฌ ์ง์ญ๊ณผ ์ธ์ด์ ๊ฑธ์ณ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด ์นด๋์๋ ์ ํ ์ด๋ฏธ์ง, ์ ๋ชฉ, ๊ฐ๊ฒฉ ๋ฐ ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐํ๋ ๋ฒํผ๊ณผ ๊ฐ์ ์์๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ์ ํ ์นด๋๋ฅผ ๋ค๋ฅธ ํ์ด์ง๋ ์ฌ์ง์ด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์น ์ปดํฌ๋ํธ ์คํ์ผ๋ง์ ์ค์์ฑ
์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ์ผ๋งํ๋ ๊ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ๋งค์ฐ ์ค์ํฉ๋๋ค:
- ์บก์ํ: ์คํ์ผ์ด ์ปดํฌ๋ํธ ์ํ์ผ๋ก ์์ด๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ์ผ๊ด๋ ๋์์ ๋ณด์ฅํ๊ณ ์๋ํ์ง ์์ ๋ถ์์ฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ: ๊ด๋ฒ์ํ ์์ ์์ด๋ ๋ค์ํ ์ปจํ ์คํธ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ ์ง๋ณด์์ฑ: ์ปดํฌ๋ํธ๋ณ ์คํ์ผ์ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์๋ฅผ ๋จ์ํํ๊ณ ์ ๋ฐ์ดํธ ๋ฐ ๋๋ฒ๊น ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์ฑ๋ฅ: ํจ์จ์ ์ธ ์คํ์ผ๋ง ๊ธฐ๋ฒ์ ํนํ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ๋๋ง ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
CSS-in-JS: ๋์ ์คํ์ผ๋ง ์ ๊ทผ ๋ฐฉ์
CSS-in-JS๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ๋ด์์ ์ง์ CSS ์คํ์ผ์ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ธ๋ถ CSS ํ์ผ์ ์ฌ์ฉํ๋ ๋์ , ์คํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ์ ์๋๊ณ ๋ฐํ์์ ์ปดํฌ๋ํธ์ ์์์ ๋์ ์ผ๋ก ์ ์ฉ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ธ๊ธฐ ์๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค:
- Styled Components: ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ CSS๋ฅผ ์์ฑํ๊ณ ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
- Emotion: Styled Components์ ์ ์ฌํ์ง๋ง ํ ๋ง ์ค์ ๋ฐ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ๊ฐ์ ๋ ๋ง์ ์ ์ฐ์ฑ๊ณผ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- JSS: ์คํ์ผ์ ์ ์ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ API๋ฅผ ์ ๊ณตํ๋ ๋ ๋ฎ์ ์์ค์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
CSS-in-JS์ ์ฅ์
- ์ปดํฌ๋ํธ ์์ค ์คํ์ผ๋ง: ์คํ์ผ์ด ์ปดํฌ๋ํธ์ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์์ด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ์ด๋ ํนํ ๋ค์ํ ์ฝ๋๋ฒ ์ด์ค์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํด์ผ ํ๋ ๋๊ท๋ชจ ๊ธ๋ก๋ฒ ๋ถ์ฐ ํ์ ์ ์ฉํฉ๋๋ค.
- ๋์ ์คํ์ผ๋ง: ์ปดํฌ๋ํธ์ props๋ ์ํ์ ๋ฐ๋ผ ์คํ์ผ์ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ด ์ํธ์์ฉ์ด ํ๋ถํ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฒํผ ์ปดํฌ๋ํธ๋ 'primary' ๋๋ 'secondary' prop์ ๋ฐ๋ผ ์์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ์๋ ๊ณต๊ธ์ ์ฒด ์ ๋์ฌ(Vendor Prefixing) ์ถ๊ฐ: CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณต๊ธ์ ์ฒด ์ ๋์ฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ์ฌ ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ๊ฐ์ ํธํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ํ ๋ง ์ง์: ๋ง์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด์ฅ๋ ํ ๋ง ์ง์์ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์ ๊ฑธ์ณ ์ผ๊ด๋ ์คํ์ผ์ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค์ํ ์ฌ์ฉ์ ์ ํธ๋์ ๋ง์ถฐ ์น์ฌ์ดํธ์ ๋ผ์ดํธ ๋ชจ๋์ ๋คํฌ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ ค๋ ๊ธ๋ก๋ฒ ๋ด์ค ๊ธฐ๊ด์ ์๊ฐํด ๋ณด์ธ์.
- ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐ: ์ฌ์ฉํ์ง ์๋ ์คํ์ผ์ ๋น๋ ๊ณผ์ ์์ ์๋์ผ๋ก ์ ๊ฑฐ๋์ด CSS์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
CSS-in-JS์ ๋จ์
- ๋ฐํ์ ์ค๋ฒํค๋: CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ์ผ์ ๋์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ ์ฉํด์ผ ํ๋ฏ๋ก ์ฝ๊ฐ์ ๋ฐํ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ธ๋ถ ์คํ์ผ์ํธ์์ ๋ก๋๋ ์ ์ ์ผ๋ก ์ ์๋ CSS๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง๋๋ค.
- ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ: CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ์ฌ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
- ํ์ต ๊ณก์ : CSS-in-JS๋ ์๋ก์ด ๊ตฌ๋ฌธ๊ณผ ๊ฐ๋ ์ ๋ฐฐ์์ผ ํ๋ฏ๋ก ์ผ๋ถ ๊ฐ๋ฐ์์๊ฒ๋ ์ง์ ์ฅ๋ฒฝ์ด ๋ ์ ์์ต๋๋ค.
- ๋๋ฒ๊น ์ ์ด๋ ค์: ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์๋ ์คํ์ผ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ๊ธฐ์กด CSS๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ๋ณด๋ค ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์ํฐ ํจํด์ ๊ฐ๋ฅ์ฑ: ์ ์คํ๊ฒ ์ฌ์ฉํ์ง ์์ผ๋ฉด CSS-in-JS๋ ์ง๋์น๊ฒ ๋ณต์กํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์ด ์คํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์์ : Styled Components
๋ค์์ Styled Components๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ์คํ์ผ๋งํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค:
import styled from 'styled-components';
const StyledButton = styled.button`
background-color: #4CAF50;
border: none;
color: white;
padding: 10px 20px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
cursor: pointer;
&:hover {
background-color: #3e8e41;
}
`;
class MyButton extends HTMLElement {
constructor() {
super();
this.shadow = this.attachShadow({ mode: 'open' });
const button = document.createElement('button');
button.textContent = 'Click Me!';
this.shadow.appendChild(button);
// Apply the styled component
StyledButton.render(button, this.shadow);
}
}
customElements.define('my-button', MyButton);
์ด ์์ ์์ `StyledButton`์ ๋ฒํผ์ ์คํ์ผ์ ์ ์ํ๋ ์คํ์ผ ์ปดํฌ๋ํธ์ ๋๋ค. ์คํ์ผ์ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ์ฌ ์์ฑ๋๋ฉฐ ๋ฒํผ ์์์ ์๋์ผ๋ก ์ ์ฉ๋ฉ๋๋ค. ํ์ง๋ง Styled Components(๋๋ ๋๋ถ๋ถ์ CSS-in-JS ์ ๊ทผ ๋ฐฉ์)๋ฅผ shadow DOM *๋ด๋ถ*์์ ์ฌ์ฉํ๋ ค๋ฉด ์คํ์ผ์ "๋ ๋๋ง"ํ๊ธฐ ์ํ ์ถ๊ฐ ๋จ๊ณ๊ฐ ํ์ํ๋ค๋ ์ ์ ์ ์ํ์ธ์. ์๋ํ๋ฉด shadow DOM์ ์ด๋ฌํ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๋์ผ๋ก ํต๊ณผํ์ง ๋ชปํ๋ ๊ฒฝ๊ณ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์ถ๊ฐ ๋จ๊ณ๋ ๋๋๋ก ํ๋ก์ธ์ค๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
Shadow DOM: ์บก์ํ์ ์คํ์ผ ๊ฒฉ๋ฆฌ
Shadow DOM์ ์น ์ปดํฌ๋ํธ์ ์บก์ํ๋ฅผ ์ ๊ณตํ๋ ์น ํ์ค์ ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ํ ๋ณ๋์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ๋ด๋ถ ๊ตฌ์กฐ์ ์คํ์ผ๋ง์ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌํฉ๋๋ค. ์ด๋ shadow DOM ๋ด์ ์ ์๋ ์คํ์ผ์ด shadow DOM ์ธ๋ถ์ ์์์ ์ํฅ์ ๋ฏธ์น์ง ์์ผ๋ฉฐ, ๊ทธ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Shadow DOM์ ์ฅ์
- ์คํ์ผ ์บก์ํ: ์คํ์ผ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ปดํฌ๋ํธ ์คํ์ผ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ๊ฐ์ญํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ (์: ๋ง์ถค ํ๋กํ)๊ฐ ๋ฉ์ธ ํ๋ซํผ ์คํ์ผ๊ณผ ์ ์์ ์ด๊ฑฐ๋ ์๋ํ์ง ์์ ์คํ์ผ ์ถฉ๋์ ์ผ์ผํค์ง ์๋๋ก ์๋๋ฐ์ค ์ฒ๋ฆฌํด์ผ ํ๋ ๊ธ๋ก๋ฒ ์์ ๋ฏธ๋์ด ํ๋ซํผ์ ์์ํด ๋ณด์ธ์.
- ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ: ๊ด๋ฒ์ํ ์์ ์์ด๋ ๋ค์ํ ์ปจํ ์คํธ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- ๋จ์ํ๋ ์คํ์ผ๋ง: ๋ช ์์ฑ ์ถฉ๋์ด๋ ์คํ์ผ ์์ ๋ฌธ์ ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ ์คํ์ผ๋ง์ด ๋ ์ฌ์์ง๋๋ค.
- ์ฑ๋ฅ ํฅ์: Shadow DOM์ ์คํ์ผ ๊ณ์ฐ ๋ฒ์๋ฅผ ์ค์ฌ ๋ ๋๋ง ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
Shadow DOM์ ๋จ์
- ์ ํ๋ ์คํ์ผ ์์: ๋ฉ์ธ ๋ฌธ์์ ์คํ์ผ์ด shadow DOM์ผ๋ก ์๋์ผ๋ก ์์๋์ง ์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ผ๊ด๋๊ฒ ์คํ์ผ๋งํ๋ ๋ฐ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ ์ ์์ต๋๋ค. CSS ์ฌ์ฉ์ ์ ์ ์์ฑ(๋ณ์)์ด ๋์์ด ๋ ์ ์์ง๋ง, ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค.
- ์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ: ํน์ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ด shadow DOM ๋ด์์ ์์๋๋ก ์๋ํ์ง ์์ ์ ์์ผ๋ฏ๋ก ์ ๊ทผ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
- ๋๋ฒ๊น ์ ์ด๋ ค์: shadow DOM ๋ด์ ์คํ์ผ์ ๋๋ฒ๊น ํ๋ ๊ฒ์ ๊ธฐ์กด CSS๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ๋ณด๋ค ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ ์ฆ๊ฐ: shadow DOM์ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ๊ฐ๋ฐ ๊ณผ์ ์ ์ฝ๊ฐ์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
Shadow DOM ๋ด๋ถ ์คํ์ผ๋ง
shadow DOM ๋ด์ ์์๋ฅผ ์คํ์ผ๋งํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค:
- ์ธ๋ผ์ธ ์คํ์ผ: `style` ์์ฑ์ ์ฌ์ฉํ์ฌ ์์์ ์ง์ ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๋ณต์กํ ์คํ์ผ์๋ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค.
- ๋ด๋ถ ์คํ์ผ ์ํธ: shadow DOM ๋ด์ `
Hello from MyElement!
This is a paragraph.
`; this.shadow.appendChild(template.content.cloneNode(true)); } } customElements.define('my-element', MyElement);
์ด ์์ ์์๋ ์คํ์ผ์ด shadow DOM ๋ด๋ถ์ `