μΉ μ»΄ν¬λνΈ μλμ° DOM μ±λ₯μ λν ν¬κ΄μ μΈ λΆμμΌλ‘, μ€νμΌ κ²©λ¦¬κ° λΈλΌμ°μ λ λλ§, μ€νμΌ κ³μ° λΉμ© λ° μ λ°μ μΈ μ ν리μΌμ΄μ μλμ λ―ΈμΉλ μν₯μ μ΄μ μ λ§μΆ₯λλ€.
μΉ μ»΄ν¬λνΈ μλμ° DOM μ±λ₯: μ€νμΌ κ²©λ¦¬ μν₯μ λν μ¬μΈ΅ λΆμ
μΉ μ»΄ν¬λνΈλ νλ‘ νΈμλ κ°λ°μ νμ , μ¦ μ§μ ν μΊ‘μνλ₯Ό μ½μν©λλ€. μλ‘μ΄ νκ²½μ μ μ©ν΄λ μμλμ§ μλ λ 립μ μ΄κ³ μ¬μ¬μ© κ°λ₯ν μ¬μ©μ μΈν°νμ΄μ€ μμλ₯Ό ꡬμΆνλ λ₯λ ₯μ λκ·λͺ¨ μ ν리μΌμ΄μ κ³Ό λμμΈ μμ€ν μ κΆκ·Ήμ μΈ λͺ©νμ λλ€. μ΄ μΊ‘μνμ μ€μ¬μλ μλμ° DOM(Shadow DOM)μ΄ μμΌλ©°, μ΄ κΈ°μ μ λ²μκ° μ§μ λ DOM νΈλ¦¬μ κ²°μ μ μΌλ‘ 격리λ CSSλ₯Ό μ 곡ν©λλ€. μ΄λ¬ν μ€νμΌ κ²©λ¦¬λ μμ λ λμ CSS κ°λ°μ κ΄΄λ‘ν μ¨ μ€νμΌ μ μΆκ³Ό μ΄λ¦ μΆ©λμ λ°©μ§νμ¬ μ μ§λ³΄μμ± μΈ‘λ©΄μμ μμ²λ μ΄μ μ μ 곡ν©λλ€.
νμ§λ§ μ΄ κ°λ ₯ν κΈ°λ₯μ μ±λ₯μ μ€μνλ κ°λ°μλ€μκ² μ€μν μ§λ¬Έμ λμ§λλ€: μ€νμΌ κ²©λ¦¬μ μ±λ₯ λΉμ©μ μΌλ§μΌκΉ? μ΄ μΊ‘μνκ° '곡μ§' μ μ¬μΌκΉμ, μλλ©΄ μ°λ¦¬κ° κ΄λ¦¬ν΄μΌ ν μ€λ²ν€λλ₯Ό μ λ°ν κΉμ? μΉ μ±λ₯μμ νν κ·Έλ λ―μ΄, κ·Έ λ΅μ λ―Έλ¬ν©λλ€. μ΄λ μ΄κΈ° μ€μ λΉμ©, λ©λͺ¨λ¦¬ μ¬μ©λ, κ·Έλ¦¬κ³ λ°νμ λμ λ²μκ° μ§μ λ μ€νμΌ μ¬κ³μ°μ μμ²λ μ΄μ μ¬μ΄μ μ μΆ©μ μ ν¬ν¨ν©λλ€.
μ΄ μ¬μΈ΅ λΆμμμλ μλμ° DOMμ μ€νμΌ κ²©λ¦¬κ° μ±λ₯μ λ―ΈμΉλ μν₯μ μμΈν μ΄ν΄λ³Ό κ²μ λλ€. λΈλΌμ°μ κ° μ€νμΌλ§μ μ²λ¦¬νλ λ°©λ²μ νꡬνκ³ , μ ν΅μ μΈ μ μ μ€μ½νμ μΊ‘μνλ μλμ° DOM μ€μ½νλ₯Ό λΉκ΅νλ©°, μλμ° DOMμ΄ μλΉν μ±λ₯ ν₯μμ μ 곡νλ μλ리μ€μ μ€λ²ν€λλ₯Ό μ λ°ν μ μλ μλ리μ€λ₯Ό λΆμν κ²μ λλ€. μ΄ κΈμ λ€ μ½κ³ λλ©΄ μ±λ₯μ΄ μ€μν μ ν리μΌμ΄μ μμ μλμ° DOM μ¬μ©μ λν΄ μ 보μ μ κ°ν κ²°μ μ λ΄λ¦΄ μ μλ λͺ νν νλ μμν¬λ₯Ό κ°κ² λ κ²μ λλ€.
ν΅μ¬ κ°λ μ΄ν΄νκΈ°: μλμ° DOMκ³Ό μ€νμΌ μΊ‘μν
μ±λ₯μ λΆμνκΈ° μ μ, μ°λ¦¬λ μλμ° DOMμ΄ λ¬΄μμ΄λ©° μ΄λ»κ² μ€νμΌ κ²©λ¦¬λ₯Ό λ¬μ±νλμ§ νμ€ν μ΄ν΄ν΄μΌ ν©λλ€.
μλμ° DOMμ΄λ 무μμΈκ°?
'DOM μμ DOM'μΌλ‘ μλμ° DOMμ μκ°ν μ μμ΅λλ€. μ΄λ μλμ° νΈμ€νΈ(shadow host)λΌκ³ λΆλ¦¬λ μΌλ° DOM μμμ μ°κ²°λ μ¨κ²¨μ§ μΊ‘μνλ DOM νΈλ¦¬μ λλ€. μ΄ μλ‘μ΄ νΈλ¦¬λ μλμ° λ£¨νΈ(shadow root)λ‘ μμνλ©° λ©μΈ λ¬Έμμ DOMκ³Ό λ³λλ‘ λ λλ§λ©λλ€. μ’ μ’ λΌμ΄νΈ DOM(Light DOM)μ΄λΌκ³ λΆλ¦¬λ λ©μΈ DOMκ³Ό μλμ° DOM μ¬μ΄μ κ²½κ³μ μ μλμ° κ²½κ³(shadow boundary)λ‘ μλ €μ Έ μμ΅λλ€.
μ΄ κ²½κ³λ λ§€μ° μ€μν©λλ€. μ΄λ μΈλΆ μΈκ³κ° μ»΄ν¬λνΈμ λ΄λΆ ꡬ쑰μ μνΈ μμ©νλ λ°©μμ μ μ΄νλ μ₯λ²½ μν μ ν©λλ€. μ°λ¦¬μ λ Όμμμ κ°μ₯ μ€μν κΈ°λ₯μ CSSλ₯Ό 격리νλ κ²μ λλ€.
μ€νμΌ κ²©λ¦¬μ ν
μλμ° DOMμ μ€νμΌ κ²©λ¦¬λ λ κ°μ§λ₯Ό μλ―Έν©λλ€:
- μλμ° λ£¨νΈ λ΄μ μ μλ μ€νμΌμ λ°μΌλ‘ μ μΆλμ§ μμΌλ©° λΌμ΄νΈ DOMμ μμμ μν₯μ μ£Όμ§ μμ΅λλ€. νμ΄μ§μ λ€λ₯Έ μμμ μΆ©λν κ±±μ μμ΄ μ»΄ν¬λνΈ λ΄μμ
h3λ.titleκ³Ό κ°μ κ°λ¨ν μ νμλ₯Ό μ¬μ©ν μ μμ΅λλ€. - λΌμ΄νΈ DOMμ μ€νμΌ(μ μ CSS)μ μλμ° λ£¨νΈ μμΌλ‘ μ μ
λμ§ μμ΅λλ€.
p { color: blue; }μ κ°μ μ μ κ·μΉμ μ»΄ν¬λνΈμ μλμ° νΈλ¦¬ λ΄μ<p>νκ·Έμ μν₯μ μ£Όμ§ μμ΅λλ€.
μ΄λ BEM(Block, Element, Modifier)κ³Ό κ°μ 볡μ‘ν μ΄λ¦ κ·μΉμ΄λ κ³ μ ν ν΄λμ€ μ΄λ¦μ μμ±νλ CSS-in-JS μ루μ μ νμμ±μ μμ μ€λλ€. λΈλΌμ°μ κ° λ€μ΄ν°λΈλ‘ μ€μ½νλ₯Ό μ²λ¦¬ν΄ μ€λλ€. μ΄λ λ κΉ¨λνκ³ μμΈ‘ κ°λ₯νλ©° μ΄μμ±μ΄ λμ μ»΄ν¬λνΈλ‘ μ΄μ΄μ§λλ€.
λ€μμ κ°λ¨ν μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
μ μ μ€νμΌμνΈ (λΌμ΄νΈ DOM):
<style>
p { color: red; font-family: sans-serif; }
</style>
HTML λ³Έλ¬Έ:
<p>This is a paragraph in the Light DOM.</p>
<my-component></my-component>
μΉ μ»΄ν¬λνΈμ μλ°μ€ν¬λ¦½νΈ:
class MyComponent extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = `
<style>
p { color: green; font-family: monospace; }
</style>
<p>This is a paragraph inside the Shadow DOM.</p>
`;
}
}
customElements.define('my-component', MyComponent);
μ΄ μλ리μ€μμ 첫 λ²μ§Έ λ¬Έλ¨μ λΉ¨κ°μκ³Ό sans-serif κΈκΌ΄λ‘ νμλ©λλ€. <my-component> μμ λ¬Έλ¨μ λ
Ήμκ³Ό monospace κΈκΌ΄λ‘ νμλ©λλ€. λ μ€νμΌ κ·μΉμ μλ‘ κ°μνμ§ μμ΅λλ€. μ΄κ²μ΄ λ°λ‘ μ€νμΌ κ²©λ¦¬μ λ§λ²μ
λλ€.
μ±λ₯ λ¬Έμ : μ€νμΌ κ²©λ¦¬λ λΈλΌμ°μ μ μ΄λ€ μν₯μ λ―ΈμΉλκ°?
μ±λ₯ μν₯μ μ΄ν΄νκΈ° μν΄, λΈλΌμ°μ κ° νμ΄μ§λ₯Ό λ λλ§νλ λ΄λΆ λμμ μ΄ν΄λ³Ό νμκ° μμ΅λλ€. νΉν, ν¬λ¦¬ν°μ»¬ λ λλ§ κ²½λ‘μ 'μ€νμΌ κ³μ°' λ¨κ³μ μ£Όλͺ©ν΄μΌ ν©λλ€.
λΈλΌμ°μ λ λλ§ νμ΄νλΌμΈ μ΄ν΄λ³΄κΈ°
μμ£Ό κ°λ¨νκ², λΈλΌμ°μ κ° νμ΄μ§λ₯Ό λ λλ§ν λ μ¬λ¬ λ¨κ³λ₯Ό κ±°μΉ©λλ€:
- DOM μμ±: HTMLμ΄ νμ±λμ΄ λ¬Έμ κ°μ²΄ λͺ¨λΈ(DOM)μ΄ λ©λλ€.
- CSSOM μμ±: CSSκ° νμ±λμ΄ CSS κ°μ²΄ λͺ¨λΈ(CSSOM)μ΄ λ©λλ€.
- λ λ νΈλ¦¬: DOMκ³Ό CSSOMμ΄ κ²°ν©λμ΄ λ λλ§μ νμν λ Έλλ§ ν¬ν¨νλ λ λ νΈλ¦¬κ° μμ±λ©λλ€.
- λ μ΄μμ (λλ 리νλ‘μ°): λΈλΌμ°μ κ° λ λ νΈλ¦¬μ κ° λ Έλμ λν μ νν ν¬κΈ°μ μμΉλ₯Ό κ³μ°ν©λλ€.
- νμΈνΈ: λΈλΌμ°μ κ° κ° λ Έλμ ν½μ μ λ μ΄μ΄μ μ±μλλ€.
- ν©μ±: λ μ΄μ΄λ€μ΄ μ¬λ°λ₯Έ μμλ‘ νλ©΄μ κ·Έλ €μ§λλ€.
DOMκ³Ό CSSOMμ κ²°ν©νλ κ³Όμ μ μ’ μ’ μ€νμΌ κ³μ°(Style Calculation) λλ μ€νμΌ μ¬κ³μ°(Recalculate Style)μ΄λΌκ³ ν©λλ€. μ΄ λ¨κ³μμ λΈλΌμ°μ λ CSS μ νμλ₯Ό DOM μμμ μΌμΉμμΌ μ΅μ’ κ³μ°λ μ€νμΌμ κ²°μ ν©λλ€. μ΄ λ¨κ³λ μ°λ¦¬μ μ±λ₯ λΆμμμ μ£Όμ μ΄μ μ λλ€.
λΌμ΄νΈ DOMμμμ μ€νμΌ κ³μ° (μ ν΅μ μΈ λ°©μ)
μλμ° DOMμ΄ μλ μ ν΅μ μΈ μ ν리μΌμ΄μ μμλ λͺ¨λ CSSκ° λ¨μΌ μ μ μ€μ½νμ μ‘΄μ¬ν©λλ€. λΈλΌμ°μ κ° μ€νμΌμ κ³μ°ν΄μΌ ν λ, μ μ¬μ μΌλ‘ λͺ¨λ DOM μμμ λν΄ λͺ¨λ μ€νμΌ κ·μΉμ κ³ λ €ν΄μΌ ν©λλ€.
μ±λ₯μ λ―ΈμΉλ μν₯μ μλΉν©λλ€:
- ν° λ²μ: 볡μ‘ν νμ΄μ§μμ λΈλΌμ°μ λ κ±°λν μμ νΈλ¦¬μ λ°©λν κ·μΉ μΈνΈλ₯Ό λ€λ£¨μ΄μΌ ν©λλ€.
- μ νμ 볡μ‘μ±:
.main-nav > li:nth-child(2n) .sub-menu a:hoverμ κ°μ 볡μ‘ν μ νμλ λΈλΌμ°μ κ° κ·μΉμ΄ μμμ μΌμΉνλμ§ νλ¨νκΈ° μν΄ λ λ§μ μμ μ μννλλ‘ ν©λλ€. - λμ 무ν¨ν λΉμ©: (μ: μλ°μ€ν¬λ¦½νΈλ₯Ό ν΅ν΄) λ¨μΌ μμμ ν΄λμ€λ₯Ό λ³κ²½νλ©΄, λΈλΌμ°μ λ κ·Έ μν₯μ μ 체 λ²μλ₯Ό νμ μμ§ λͺ»ν©λλ€. μ΄ λ³κ²½μ΄ λ€λ₯Έ μμμ μν₯μ λ―ΈμΉλμ§ νμΈνκΈ° μν΄ DOM νΈλ¦¬μ μλΉ λΆλΆμ λν μ€νμΌμ μ¬νκ°ν΄μΌ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, `` μμμ ν΄λμ€λ₯Ό λ³κ²½νλ©΄ νμ΄μ§μ λ€λ₯Έ λͺ¨λ μμμ μ μ¬μ μΌλ‘ μν₯μ μ€ μ μμ΅λλ€.
μλμ° DOMμ μ¬μ©ν μ€νμΌ κ³μ° (μΊ‘μνλ λ°©μ)
μλμ° DOMμ μ΄λ¬ν μνμ κ·Όλ³Έμ μΌλ‘ λ°κΏλλ€. 격리λ μ€νμΌ μ€μ½νλ₯Ό μμ±ν¨μΌλ‘μ¨, κ±°λν λ¨μΌ μ μ μ€μ½νλ₯Ό μ¬λ¬ κ°μ μκ³ κ΄λ¦¬ κ°λ₯ν μ€μ½νλ‘ λλλλ€.
μ΄κ²μ΄ μ±λ₯μ λ―ΈμΉλ μν₯μ λ€μκ³Ό κ°μ΅λλ€:
- λ²μκ° μ§μ λ κ³μ°: μ»΄ν¬λνΈμ μλμ° λ£¨νΈ λ΄λΆμμ λ³κ²½μ΄ λ°μνλ©΄(μ: ν΄λμ€ μΆκ°), λΈλΌμ°μ λ μ€νμΌ λ³κ²½μ΄ ν΄λΉ μλμ° λ£¨νΈ λ΄μ κ΅νλλ€λ κ²μ νμ€ν μλλ€. λΈλΌμ°μ λ *ν΄λΉ μ»΄ν¬λνΈ λ΄μ* λ Έλμ λν΄μλ§ μ€νμΌ μ¬κ³μ°μ μννλ©΄ λ©λλ€.
- 무ν¨ν κ°μ: μ€νμΌ μμ§μ μ»΄ν¬λνΈ A λ΄λΆμ λ³κ²½μ΄ μ»΄ν¬λνΈ Bλ λΌμ΄νΈ DOMμ λ€λ₯Έ λΆλΆμ μν₯μ λ―ΈμΉλμ§ νμΈν νμκ° μμ΅λλ€. 무ν¨νμ λ²μκ° λν μ€μ΄λλλ€. μ΄κ²μ΄ μλμ° DOM μ€νμΌ κ²©λ¦¬μ κ°μ₯ μ€μν λ¨μΌ μ±λ₯ μ΄μ μ λλ€.
볡μ‘ν λ°μ΄ν° 그리λ μ»΄ν¬λνΈλ₯Ό μμν΄ λ³΄μμμ€. μ ν΅μ μΈ λ°©μμμλ λ¨μΌ μ μ μ λ°μ΄νΈνλ©΄ λΈλΌμ°μ κ° μ 체 그리λ λλ μ¬μ§μ΄ μ 체 νμ΄μ§μ μ€νμΌμ λ€μ νμΈνκ² λ μ μμ΅λλ€. μλμ° DOMμ μ¬μ©νλ©΄, κ° μ μ΄ μ체 μΉ μ»΄ν¬λνΈμΈ κ²½μ°, ν μ μ μ€νμΌμ μ λ°μ΄νΈνλ©΄ ν΄λΉ μ μ κ²½κ³ λ΄μμλ§ μκ³ κ΅μ§μ μΈ μ€νμΌ μ¬κ³μ°μ΄ νΈλ¦¬κ±°λ©λλ€.
μ±λ₯ λΆμ: μ μΆ©μ κ³Ό λ―Έλ¬ν μ°¨μ΄
λ²μκ° μ§μ λ μ€νμΌ μ¬κ³μ°μ μ΄μ μ λΆλͺ νμ§λ§, κ·Έκ²μ΄ μ λΆλ μλλλ€. μ°λ¦¬λ λν μ΄λ¬ν 격리λ μ€μ½νλ₯Ό μμ±νκ³ κ΄λ¦¬νλ λ° λλ λΉμ©λ κ³ λ €ν΄μΌ ν©λλ€.
μ₯μ : λ²μκ° μ§μ λ μ€νμΌ μ¬κ³μ°
μ΄κ²μ΄ μλμ° DOMμ΄ λΉμ λ°νλ μ§μ μ λλ€. μ±λ₯ ν₯μμ λμ μ΄κ³ 볡μ‘ν μ ν리μΌμ΄μ μμ κ°μ₯ λλλ¬μ§λλ€.
- λμ μ ν리μΌμ΄μ : Angular, React λλ Vueμ κ°μ νλ μμν¬λ‘ ꡬμΆλ λ¨μΌ νμ΄μ§ μ ν리μΌμ΄μ (SPA)μμλ UIκ° λμμμ΄ λ³κ²½λ©λλ€. μ»΄ν¬λνΈκ° μΆκ°, μ κ±° λ° μ λ°μ΄νΈλ©λλ€. μλμ° DOMμ μ΄λ¬ν λΉλ²ν λ³κ²½μ΄ ν¨μ¨μ μΌλ‘ μ²λ¦¬λλλ‘ λ³΄μ₯νλ©°, κ° μ»΄ν¬λνΈ μ λ°μ΄νΈλ μκ³ κ΅μ§μ μΈ μ€νμΌ μ¬κ³μ°λ§μ νΈλ¦¬κ±°ν©λλ€. μ΄λ λ λΆλλ¬μ΄ μ λλ©μ΄μ κ³Ό λ λ°μμ μΈ μ¬μ©μ κ²½νμΌλ‘ μ΄μ΄μ§λλ€.
- λκ·λͺ¨ μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬: λκ·λͺ¨ μ‘°μ§ μ 체μμ μ¬μ©λλ μλ°± κ°μ μ»΄ν¬λνΈλ₯Ό κ°μΆ λμμΈ μμ€ν μ κ²½μ°, μλμ° DOMμ μ±λ₯μ μ μ½ν΄ μ€λλ€. ν νμ μ»΄ν¬λνΈ CSSκ° λ€λ₯Έ νμ μ»΄ν¬λνΈμ μν₯μ λ―ΈμΉλ μ€νμΌ μ¬κ³μ° ννμ μΌμΌν€λ κ²μ λ°©μ§ν©λλ€. μ ν리μΌμ΄μ μ 체μ μ±λ₯μ΄ λ μμΈ‘ κ°λ₯νκ³ νμ₯ κ°λ₯ν΄μ§λλ€.
λ¨μ : μ΄κΈ° νμ± λ° λ©λͺ¨λ¦¬ μ€λ²ν€λ
λ°νμ μ λ°μ΄νΈλ λ λΉ λ₯΄μ§λ§, μλμ° DOMμ μ¬μ©νλ λ°λ μ ν λΉμ©μ΄ μμ΅λλ€.
- μ΄κΈ° μ€μ λΉμ©: μλμ° λ£¨νΈλ₯Ό μμ±νλ κ²μ λΉμ©μ΄ μλ μμ μ΄ μλλλ€. κ° μ»΄ν¬λνΈ μΈμ€ν΄μ€μ λν΄ λΈλΌμ°μ λ μλ‘μ΄ μλμ° λ£¨νΈλ₯Ό λ§λ€κ³ , κ·Έ μμ μ€νμΌμ νμ±νκ³ , ν΄λΉ μ€μ½νμ λν λ³λμ CSSOMμ ꡬμΆν΄μΌ ν©λλ€. μμμ 볡μ‘ν μ»΄ν¬λνΈκ° μλ νμ΄μ§μμλ μ΄κ²μ΄ 무μν λ§ν©λλ€. νμ§λ§ μμ² κ°μ κ°λ¨ν μ»΄ν¬λνΈκ° μλ νμ΄μ§μμλ μ΄ μ΄κΈ° μ€μ μ΄ λμ λ μ μμ΅λλ€.
- μ€λ³΅λ μ€νμΌ λ° λ©λͺ¨λ¦¬ μ¬μ©λ: μ΄κ²μ΄ κ°μ₯ λ§μ΄ μΈκΈλλ μ±λ₯ μ°λ € μ¬νμ
λλ€. νμ΄μ§μ
<custom-button>μ»΄ν¬λνΈμ μΈμ€ν΄μ€κ° 1,000κ° μκ³ , κ° μΈμ€ν΄μ€κ°<style>νκ·Έλ₯Ό ν΅ν΄ μλμ° λ£¨νΈ λ΄λΆμ μ€νμΌμ μ μνλ€λ©΄, μ¬μ€μ λμΌν CSS κ·μΉμ λ©λͺ¨λ¦¬μμ 1,000λ² νμ±νκ³ μ μ₯νλ κ²μ λλ€. κ° μλμ° λ£¨νΈλ μ체 CSSOM μΈμ€ν΄μ€λ₯Ό κ°κ² λ©λλ€. μ΄λ λ¨μΌ μ μ μ€νμΌμνΈμ λΉκ΅νμ¬ ν¨μ¬ λ ν° λ©λͺ¨λ¦¬ μ¬μ©λμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
"κ²½μ°μ λ°λΌ λ€λ¦" μμΈ: μΈμ μ€μ λ‘ μ€μνκ°?
μ±λ₯ μ μΆ©μ μ¬μ© μ¬λ‘μ λ°λΌ ν¬κ² λ¬λΌμ§λλ€:
- μμμ 볡μ‘ν μ»΄ν¬λνΈ: λ¦¬μΉ ν μ€νΈ νΈμ§κΈ°, λΉλμ€ νλ μ΄μ΄ λλ μΈν°λν°λΈ λ°μ΄ν° μκ°νμ κ°μ μ»΄ν¬λνΈμ κ²½μ°, μλμ° DOMμ κ±°μ νμ μμν μ±λ₯ μ΄λμ λλ€. μ΄λ¬ν μ»΄ν¬λνΈλ€μ 볡μ‘ν λ΄λΆ μνμ λΉλ²ν μ λ°μ΄νΈλ₯Ό κ°μ§λλ€. μ¬μ©μ μνΈ μμ© μ€ λ²μκ° μ§μ λ μ€νμΌ μ¬κ³μ°μ λ§λν μ΄μ μ μΌνμ± μ€μ λΉμ©μ ν¨μ¬ λ₯κ°ν©λλ€.
- λ€μμ κ°λ¨ν μ»΄ν¬λνΈ: μ¬κΈ°μ μ μΆ©μ΄ λ λ―Έλ¬ν΄μ§λλ€. 10,000κ°μ κ°λ¨ν νλͺ©(μ: μμ΄μ½ μ»΄ν¬λνΈ)μ΄ μλ λͺ©λ‘μ λ λλ§νλ κ²½μ°, 10,000κ°μ μ€λ³΅λ μ€νμΌμνΈλ‘ μΈν λ©λͺ¨λ¦¬ μ€λ²ν€λκ° μ€μ λ¬Έμ κ° λ μ μμΌλ©°, μ μ¬μ μΌλ‘ μ΄κΈ° λ λλ§ μλλ₯Ό μ νμν¬ μ μμ΅λλ€. μ΄κ²μ΄ λ°λ‘ μ΅μ μ루μ μ΄ ν΄κ²°νλλ‘ μ€κ³λ λ¬Έμ μ λλ€.
μ€μ©μ μΈ λ²€μΉλ§νΉκ³Ό μ΅μ μ루μ
μ΄λ‘ μ μ μ©νμ§λ§, μ€μ μΈ‘μ μ νμμ μ λλ€. λ€ννλ, μ΅μ λΈλΌμ°μ λꡬμ μλ‘μ΄ νλ«νΌ κΈ°λ₯μ μ°λ¦¬μκ² μν₯μ μΈ‘μ νκ³ λ¨μ μ μνν μ μλ λ₯λ ₯μ μ 곡ν©λλ€.
μ€νμΌ μ±λ₯ μΈ‘μ λ°©λ²
μ¬κΈ°μ κ°μ₯ μ’μ μΉκ΅¬λ λΈλΌμ°μ κ°λ°μ λꡬ(μ: Chrome DevTools)μ Performance νμ λλ€.
- μ ν리μΌμ΄μ κ³Ό μνΈ μμ©νλ λμ(μ: μμ μλ‘ λ§μ°μ€λ₯Ό κ°μ Έκ°κ±°λ, λͺ©λ‘μ νλͺ© μΆκ°) μ±λ₯ νλ‘νμ κΈ°λ‘ν©λλ€.
- νλ μ μ°¨νΈμμ "Recalculate Style"μ΄λΌκ³ νμλ κΈ΄ 보λΌμ λ§λλ₯Ό μ°Ύμ΅λλ€.
- μ΄ μ΄λ²€νΈ μ€ νλλ₯Ό ν΄λ¦ν©λλ€. μμ½ νμμ μμ μκ°, μν₯μ λ°μ μμ μ, μ¬κ³μ°μ νΈλ¦¬κ±°ν μμΈμ μλ €μ€λλ€.
μ»΄ν¬λνΈμ λ κ°μ§ λ²μ (νλλ μλμ° DOM μ¬μ©, λ€λ₯Έ νλλ λ―Έμ¬μ©)μ λ§λ€μ΄ λμΌν μνΈ μμ©μ μ€ννκ³ "Recalculate Style" μ΄λ²€νΈμ μ§μ μκ°κ³Ό λ²μλ₯Ό λΉκ΅ν μ μμ΅λλ€. λμ μλ리μ€μμλ μλμ° DOM λ²μ μ΄ λ§μ μκ³ λΉ λ₯Έ μ€νμΌ κ³μ°μ μμ±νλ λ°λ©΄, λΌμ΄νΈ DOM λ²μ μ λ μ μ§λ§ ν¨μ¬ μ€λ μ€νλλ κ³μ°μ μμ±νλ κ²μ μ’ μ’ λ³Ό μ μμ΅λλ€.
κ²μ 체μΈμ : Constructable Stylesheets
μ€λ³΅λ μ€νμΌκ³Ό λ©λͺ¨λ¦¬ μ€λ²ν€λ λ¬Έμ μλ κ°λ ₯νκ³ νλμ μΈ ν΄κ²°μ± μ΄ μμ΅λλ€: Constructable Stylesheets. μ΄ APIλ₯Ό μ¬μ©νλ©΄ μλ°μ€ν¬λ¦½νΈμμ `CSSStyleSheet` κ°μ²΄λ₯Ό λ§λ€κ³ , μ΄λ₯Ό μ¬λ¬ μλμ° λ£¨νΈμμ 곡μ ν μ μμ΅λλ€.
κ° μ»΄ν¬λνΈκ° μ체 <style> νκ·Έλ₯Ό κ°λ λμ , μ€νμΌμ ν λ² μ μνκ³ λͺ¨λ κ³³μ μ μ©ν©λλ€.
Constructable Stylesheets μ¬μ© μμ:
// 1. μ€νμΌμνΈ κ°μ²΄λ₯Ό ν λ²λ§ μμ±ν©λλ€
const sheet = new CSSStyleSheet();
sheet.replaceSync(`
:host { display: inline-block; }
button { background-color: blue; color: white; border: none; padding: 10px; }
`);
// 2. μ»΄ν¬λνΈλ₯Ό μ μν©λλ€
class SharedStyleButton extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({ mode: 'open' });
// 3. μ΄ μΈμ€ν΄μ€μ 곡μ μ€νμΌμνΈλ₯Ό μ μ©ν©λλ€
shadowRoot.adoptedStyleSheets = [sheet];
shadowRoot.innerHTML = `<button>Click Me</button>`;
}
}
customElements.define('shared-style-button', SharedStyleButton);
μ΄μ <shared-style-button>μ μΈμ€ν΄μ€κ° 1,000κ° μλ€λ©΄, 1,000κ°μ λͺ¨λ μλμ° λ£¨νΈλ λ©λͺ¨λ¦¬μμ μ νν λμΌν μ€νμΌμνΈ κ°μ²΄λ₯Ό μ°Έμ‘°νκ² λ©λλ€. CSSλ λ¨ ν λ²λ§ νμ±λ©λλ€. μ΄κ²μ λ κ°μ§ μ₯μ μ λͺ¨λ μ 곡ν©λλ€: μ€λ³΅λ μ€νμΌμ λ©λͺ¨λ¦¬ λ° νμ± μκ° λΉμ© μμ΄ λ²μκ° μ§μ λ μ€νμΌ μ¬κ³μ°μ λ°νμ μ±λ₯ μ΄μ μ λ릴 μ μμ΅λλ€. νμ΄μ§μ μ¬λ¬ λ² μΈμ€ν΄μ€νλ μ μλ λͺ¨λ μ»΄ν¬λνΈμ κΆμ₯λλ μ κ·Ό λ°©μμ
λλ€.
μ μΈμ μλμ° DOM (DSD)
λ λ€λ₯Έ μ€μν λ°μ μ μ μΈμ μλμ° DOMμ λλ€. μ΄λ₯Ό ν΅ν΄ μλ²μμ λ λλ§λ HTMLμ μ§μ μλμ° λ£¨νΈλ₯Ό μ μν μ μμ΅λλ€. μ£Όμ μ±λ₯ μ΄μ μ μ΄κΈ° νμ΄μ§ λ‘λμ μμ΅λλ€. DSDκ° μμΌλ©΄, μΉ μ»΄ν¬λνΈκ° ν¬ν¨λ μλ² λ λλ§ νμ΄μ§λ λͺ¨λ μλμ° λ£¨νΈλ₯Ό μ°κ²°νκΈ° μν΄ μλ°μ€ν¬λ¦½νΈκ° μ€νλ λκΉμ§ κΈ°λ€λ €μΌ νλ©°, μ΄λ μ€νμΌμ΄ μ μ©λμ§ μμ μ½ν μΈ μ κΉλ°μ(flash of unstyled content)μ΄λ λ μ΄μμ μ΄λ(layout shift)μ μ λ°ν μ μμ΅λλ€. DSDλ₯Ό μ¬μ©νλ©΄ λΈλΌμ°μ λ HTML μ€νΈλ¦Όμμ μ§μ μλμ° DOMμ ν¬ν¨ν μ»΄ν¬λνΈλ₯Ό νμ±νκ³ λ λλ§ν μ μμ΄, μ΅μ΄ μ½ν μΈ ν νμΈνΈ(FCP) λ° μ΅λ μ½ν μΈ ν νμΈνΈ(LCP)μ κ°μ μ§νλ₯Ό κ°μ ν μ μμ΅λλ€.
μ€μ©μ μΈ ν΅μ°°κ³Ό λͺ¨λ² μ¬λ‘
κ·Έλ λ€λ©΄ μ΄ μ§μμ μ΄λ»κ² μ μ©ν μ μμκΉμ? λ€μμ λͺ κ°μ§ μ€μ©μ μΈ κ°μ΄λλΌμΈμ λλ€.
μ±λ₯μ μν΄ μλμ° DOMμ μ¬μ©ν΄μΌ ν λ
- μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈ: λΌμ΄λΈλ¬λ¦¬λ λμμΈ μμ€ν μ μν μ»΄ν¬λνΈμ κ²½μ°, μλμ° DOMμ μμΈ‘ κ°λ₯μ±κ³Ό μ€νμΌ λ²μ μ§μ μ μν€ν μ² λ° μ±λ₯ μΈ‘λ©΄μμ ν° μ΄μ μ λλ€.
- 볡μ‘νκ³ λ 립μ μΈ μμ ―: λ μ§ μ νκΈ°λ μΈν°λν°λΈ μ°¨νΈμ κ°μ΄ λ΄λΆ λ‘μ§κ³Ό μνκ° λ§μ μ»΄ν¬λνΈλ₯Ό ꡬμΆνλ κ²½μ°, μλμ° DOMμ λλ¨Έμ§ μ ν리μΌμ΄μ μΌλ‘λΆν° ν΄λΉ μ»΄ν¬λνΈμ μ±λ₯μ 보νΈν©λλ€.
- λμ μ ν리μΌμ΄μ : DOMμ΄ λμμμ΄ λ³ννλ SPAμμ μλμ° DOMμ λ²μκ° μ§μ λ μ¬κ³μ°μ UIλ₯Ό λΉ λ₯΄κ³ λ°μμ± μκ² μ μ§ν©λλ€.
μ£Όμν΄μΌ ν λ
- λ§€μ° κ°λ¨ν μ μ μ¬μ΄νΈ: κ°λ¨ν μ½ν μΈ μ¬μ΄νΈλ₯Ό ꡬμΆνλ κ²½μ°, μλμ° DOMμ μ€λ²ν€λλ λΆνμν μ μμ΅λλ€. μ ꡬ쑰νλ μ μ μ€νμΌμνΈκ° μ’ μ’ μΆ©λΆνκ³ λ κ°λ¨ν©λλ€.
- λ κ±°μ λΈλΌμ°μ μ§μ: μΉ μ»΄ν¬λνΈλ Constructable Stylesheetsλ₯Ό μ§μνμ§ μλ μ€λλ λΈλΌμ°μ λ₯Ό μ§μν΄μΌ νλ κ²½μ°, λ§μ μ΄μ μ μκ² λλ©° λ λ¬΄κ±°μ΄ ν΄λ¦¬νμ μμ‘΄ν΄μΌ ν μ μμ΅λλ€.
νλμ μΈ μν¬νλ‘μ° κΆμ₯ μ¬ν
- κΈ°λ³Έμ μΌλ‘ Constructable Stylesheets μ¬μ©: μλ‘μ΄ μ»΄ν¬λνΈ κ°λ° μμλ Constructable Stylesheetsλ₯Ό μ¬μ©νμμμ€. μ΄λ μλμ° DOMμ μ£Όμ μ±λ₯ λ¨μ μ ν΄κ²°νλ©° κΈ°λ³Έ μ νμ΄ λμ΄μΌ ν©λλ€.
- ν
λ§ μ€μ μ μν΄ CSS μ¬μ©μ μ μ μμ± μ¬μ©: μ¬μ©μκ° μ»΄ν¬λνΈλ₯Ό μ¬μ©μ μ μν μ μλλ‘ CSS μ¬μ©μ μ μ μμ±(
--my-color: blue;)μ μ¬μ©νμμμ€. μ΄λ μ μ΄λ λ°©μμΌλ‘ μλμ° κ²½κ³λ₯Ό ν΅κ³Όνλ W3C νμ€ λ°©λ²μ΄λ©°, ν λ§ μ€μ μ μν κΉλν APIλ₯Ό μ 곡ν©λλ€. ::partλ°::slottedνμ©: μΈλΆμμ λ μΈλΆμ μΈ μ€νμΌλ§ μ μ΄λ₯Ό μν΄partμμ±μ μ¬μ©νμ¬ νΉμ μμλ₯Ό λ ΈμΆνκ³::part()μμ¬ μμλ₯Ό μ¬μ©νμ¬ μ€νμΌμ μ§μ νμμμ€. λΌμ΄νΈ DOMμμ μ»΄ν¬λνΈλ‘ μ λ¬λ μ½ν μΈ μ μ€νμΌμ μ§μ νλ €λ©΄::slotted()λ₯Ό μ¬μ©νμμμ€.- κ°μ νμ§ λ§κ³ νλ‘νμΌλ§νκΈ°: μ£Όμ μ΅μ ν μμ μ μμνκΈ° μ μ λΈλΌμ°μ κ°λ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ€νμΌ κ³μ°μ΄ μ€μ λ‘ μ ν리μΌμ΄μ μ λ³λͺ© νμμΈμ§ νμΈνμμμ€. μ£λΆλ₯Έ μ΅μ νλ λ§μ λ¬Έμ μ κ·Όμμ λλ€.
κ²°λ‘ : μ±λ₯μ λν κ· ν μ‘ν μκ°
μλμ° DOMμ΄ μ 곡νλ μ€νμΌ κ²©λ¦¬λ μ±λ₯μ λ§λ³ν΅μΉμ½λ μλκ³ , λΉμ©μ΄ λ§μ΄ λλ μμμλ μλλλ€. κ·Έκ²μ λͺ νν μ±λ₯ νΉμ±μ κ°μ§ κ°λ ₯ν μν€ν μ² κΈ°λ₯μ λλ€. μ£Όμ μ±λ₯ μ΄μ μΈ λ²μκ° μ§μ λ μ€νμΌ μ¬κ³μ°μ νλμ μ΄κ³ λμ μΈ μΉ μ ν리μΌμ΄μ μ μν κ²μ 체μΈμ μ΄λ©°, λ λΉ λ₯Έ μ λ°μ΄νΈμ λ νλ ₯μ μΈ UIλ‘ μ΄μ΄μ§λλ€.
μ±λ₯μ λν μμ¬μ μΈ μ°λ €, μ¦ μ€λ³΅λ μ€νμΌλ‘ μΈν λ©λͺ¨λ¦¬ μ€λ²ν€λλ Constructable Stylesheetsμ λμ μΌλ‘ ν¬κ² ν΄κ²°λμμ΅λλ€. μ΄λ μ€νμΌ κ²©λ¦¬μ λ©λͺ¨λ¦¬ ν¨μ¨μ±μ μ΄μμ μΈ μ‘°ν©μ μ 곡ν©λλ€.
λΈλΌμ°μ μ λ λλ§ κ³Όμ κ³Ό κ΄λ ¨λ μ μΆ©μ μ μ΄ν΄ν¨μΌλ‘μ¨, κ°λ°μλ μλμ° DOMμ νμ©νμ¬ μ μ§ κ΄λ¦¬κ° μ©μ΄νκ³ νμ₯ κ°λ₯ν λΏλ§ μλλΌ μ±λ₯λ λ°μ΄λ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€. ν΅μ¬μ μμ μ μ ν©ν λꡬλ₯Ό μ¬μ©νκ³ , μν₯μ μΈ‘μ νλ©°, μΉ νλ«νΌμ κΈ°λ₯μ λν νλμ μΈ μ΄ν΄λ₯Ό λ°νμΌλ‘ ꡬμΆνλ κ²μ λλ€.