๐Ÿš€ 14. ํ˜„๋Œ€์ ์ธ CSS: 'Nesting, Layers, ๊ทธ๋ฆฌ๊ณ  Scope์˜ ํ˜๋ช…'

2026๋…„ 3์›” 5์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

SASS ์—†์ด๋„ ๊ฐ€๋Šฅํ•œ ์ •๊ทœ Nesting๋ถ€ํ„ฐ ์Šคํƒ€์ผ ์šฐ์„ ์ˆœ์œ„์˜ ๊ตฌ์›ํˆฌ์ˆ˜์ธ Cascade Layers๊นŒ์ง€, CSS์˜ ํŒ๋„๋ฅผ ๋ฐ”๊พธ๊ณ  ์žˆ๋Š” ์ตœ์‹  ๋„๊ตฌ๋“ค์„ ์˜์ฒ ์ด์™€ ํ•จ๊ป˜ ๋งˆ์Šคํ„ฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 8๋ถ„(์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 4๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
[๋„ค์ดํ‹ฐ๋ธŒ Nesting์˜ ๋“ฑ์žฅ] โ†’ [Cascade Layers(@layer)] โ†’ [Scoped CSS(@scope)]

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • ์ „์ฒ˜๋ฆฌ๊ธฐ(SASS) ์—†์ด ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋งŒ์œผ๋กœ ๊น”๋”ํ•œ ์ค‘์ฒฉ ๊ตฌ์กฐ๋ฅผ ์งญ๋‹ˆ๋‹ค.
  • @layer๋ฅผ ํ™œ์šฉํ•ด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‚ด ์Šคํƒ€์ผ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • @scope๋ฅผ ํ†ตํ•ด ํŠน์ • ์˜์—ญ ์•ˆ์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ์•ˆ์ „ํ•œ ์Šคํƒ€์ผ๋ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "์˜ํ˜ธ ๋‹˜! ์‹ ์ž… ๋•Œ ๋ฐฐ์šด CSS๋ž‘ ์ง€๊ธˆ CSS๊ฐ€ ๋„ˆ๋ฌด ๋‹ฌ๋ผ์š”. SASS ์•ˆ ์จ๋„ ๋œ๋‹ค๋Š” ์‚ฌ๋žŒ๋„ ์žˆ๊ณ , !important ์—†์ด๋„ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ์†Œ๋ฌธ์„ ๋“ค์—ˆ๋Š”๋ฐ... ์ง„์งœ์ธ๊ฐ€์š”? ๐Ÿ˜ฎ"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, CSS๋Š” ์ง€๊ธˆ ๊ทธ ์–ด๋А ๋•Œ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ง„ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์˜ ๊ผผ์ˆ˜(Hacks)๋“ค์ด ์ •์‹ ์ŠคํŽ™์œผ๋กœ ๋“ค์–ด์˜ค๊ณ  ์žˆ์ฃ . ์ด์ œ๋Š” ๋„๊ตฌ์˜ ํž˜์ด ์•„๋‹Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” '์ง„ํ™”๋œ CSS'๋ฅผ ๋‹ค๋ฃฐ ์ค„ ์•Œ์•„์•ผ ์ง„์งœ ์‹œ๋‹ˆ์–ด์ž…๋‹ˆ๋‹ค."

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€

์ตœ๊ทผ 1~2๋…„ ์‚ฌ์ด CSS๋Š” ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ํ’€์ง€ ๋ชปํ–ˆ๋˜ ๋‚œ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋Š” !important๋กœ ์ „์Ÿ์„ ์น˜๋ฅผ ํ•„์š”๋„ ์—†๊ณ , ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ฌด์กฐ๊ฑด ๊ธธ๊ฒŒ ์ง€์„ ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์ตœ์‹  ๊ธฐ๋Šฅ๋“ค์€ ๋‹จ์ˆœํžˆ 'ํŽธ๋ฆฌํ•จ'์„ ๋„˜์–ด **'์œ ์ง€๋ณด์ˆ˜ ํšจ์œจ'**์„ ๊ทน๋Œ€์ ์œผ๋กœ ๋†’์—ฌ์ค๋‹ˆ๋‹ค. 5๋…„์ฐจ ์ด์ƒ์˜ ์‹œ๋‹ˆ์–ด๋Š” ๊ณผ๊ฑฐ์˜ ๋ฐฉ์‹์— ์•ˆ์ฃผํ•˜์ง€ ์•Š๊ณ , ์ตœ์‹  ์ŠคํŽ™์„ ์‚ฌ์šฉํ•ด ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ—๏ธ 1. Native Nesting: SASS๋Š” ์•ˆ๋…•?

์ด์ œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ Nesting์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ๊ณผ์ • ์—†์ด๋„ ๊ฐ€๋…์„ฑ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/* ๐Ÿฆ ์˜ํ˜ธ: ์ด์ œ ์•ฐํผ์ƒŒ๋“œ(&) ํ•˜๋‚˜๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. */
.card {
  background: white;
  
  & .title {
    font-weight: bold;
  }
  
  &:hover {
    box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);
  }
}

๐Ÿ›ก๏ธ 2. Cascade Layers (@layer): ์šฐ์„ ์ˆœ์œ„ ์ œ์–ด๊ถŒ ํƒˆํ™˜

์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด '๋ช…์‹œ๋„(Specificity)'๋ฅผ ๋’ค์—Ž์„ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์ˆœ์„œ๋‚˜ ์„ ํƒ์ž์˜ ์ ์ˆ˜์™€ ์ƒ๊ด€์—†์ด, ์Šคํƒ€์ผ์˜ '๊ณ„๊ธ‰'์„ ๋ฏธ๋ฆฌ ์ •ํ•ด๋‘ก๋‹ˆ๋‹ค.

/* ๐Ÿฆ ์˜ํ˜ธ: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋ฌด๋ฆฌ ์ ์ˆ˜๊ฐ€ ๋†’์•„๋„, ๋‚ด ํ…Œ๋งˆ(theme) ์ธต์ด ๋ฌด์กฐ๊ฑด ์ด๊น๋‹ˆ๋‹ค. */
@layer reset, base, components, theme;
 
@layer theme {
  .btn { color: red !important; } /* ํŠน์ • ๊ณ„์ธต์— ๋ชจ๋“  ๊ถŒํ•œ ๋ถ€์—ฌ */
}

๐ŸŽฏ 3. Scoped CSS (@scope): ์•ˆ์ „ํ•œ ์Šคํƒ€์ผ ์šธํƒ€๋ฆฌ

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

@scope (.card) {
  img {
    border-radius: 50%; /* ์ด .card ์•ˆ์˜ img ์—๋งŒ ์ ์šฉ! */
  }
}

๐Ÿฃ ์˜์ฒ : "์™€... ๊ทธ๋Ÿผ ์ด์ œ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ํด๋ž˜์Šค ์ด๋ฆ„์„ __๋กœ ์•ˆ ์ด์–ด๋„ @scope๋กœ ๊ฐ์‹ธ๋ฉด ๋˜๊ฒ ๋„ค์š”? ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•ด์ง€๊ฒ ์–ด์š”!"


๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. ๋„ค์ดํ‹ฐ๋ธŒ CSS Nesting์—์„œ ๋ถ€๋ชจ ์„ ํƒ์ž๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐํ˜ธ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

โœ… ์ •๋‹ต: & (์•ฐํผ์ƒŒ๋“œ)

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ: CSS Nesting ๋ช…์„ธ์— ๋”ฐ๋ฅด๋ฉด & ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SASS์˜ ๋ฌธ๋ฒ•์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ •์‹์œผ๋กœ ์ˆ˜์šฉํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, ์ด์ œ ์ „์ฒ˜๋ฆฌ๊ธฐ ์—†์ด๋„ & ํ•˜๋‚˜๋ฉด ๋ถ€๋ชจ ์Šคํƒ€์ผ์„ ์ƒฅ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”. ๊ฐ€๋…์„ฑ์ด ํ›จ์”ฌ ์ข‹์•„์ง€๊ฒ ์ฃ ?"

Q2. @layer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋ชฉ์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”?

  1. ์• ๋‹ˆ๋ฉ”์ด์…˜ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด
  2. ์Šคํƒ€์ผ์˜ ์šฐ์„ ์ˆœ์œ„(Specificity)๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ณ„์ธตํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด
  3. ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด
  4. CSS ํŒŒ์ผ์˜ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด

โœ… ์ •๋‹ต: 2. ์Šคํƒ€์ผ์˜ ์šฐ์„ ์ˆœ์œ„(Specificity)๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ณ„์ธตํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ: @layer๋Š” ์„ ํƒ์ž์˜ ์ ์ˆ˜์™€ ๊ด€๊ณ„์—†์ด ์Šคํƒ€์ผ์˜ ๋ฐ˜์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์Šคํƒ€์ผ๊ณผ ๋‚ด ์Šคํƒ€์ผ์ด ์ถฉ๋Œํ•  ๋•Œ, ๋ ˆ์ด์–ด ์ˆœ์„œ๋งŒ์œผ๋กœ ์šฐ์•„ํ•˜๊ฒŒ ์Šน์ž๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, ์ ์ˆ˜ ๊ณ„์‚ฐํ•˜๋А๋ผ ๋จธ๋ฆฌ ์‹ธ๋งค์ง€ ๋ง๊ณ  @layer๋กœ ๊ณ„๊ธ‰์žฅ์„ ํ™•์‹คํžˆ ๋‹ฌ์•„์ฃผ์„ธ์š”!"

Q3. [์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„]
์˜์ฒ ์ด๊ฐ€ ์™ธ๋ถ€ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™”๋Š”๋ฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์Šคํƒ€์ผ์ด ๋„ˆ๋ฌด ๊ฐ•๋ ฅํ•ด์„œ ์˜์ฒ ์ด๊ฐ€ ์ง  ์ปค์Šคํ…€ ์Šคํƒ€์ผ์ด ์ž๊พธ ์”นํž™๋‹ˆ๋‹ค. !important๋ฅผ ๋„๋ฐฐํ•˜๊ธฐ๋Š” ์‹ซ์€๋ฐ, ์˜์ฒ ์ด๊ฐ€ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ 'ํž˜'์„ ์ •์ค‘ํ•˜๊ฒŒ ๋‚ฎ์ถ”๊ณ  ๋‚ด ์Šคํƒ€์ผ ๋ ˆ์ด์–ด๋ฅผ ๊ทธ ์œ„๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  CSS ๊ธฐ์ˆ ์€?

โœ… ์ •๋‹ต: Cascade Layers (@layer)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์Šคํƒ€์ผ๊ณผ ์ปค์Šคํ…€ ์Šคํƒ€์ผ์˜ ๊ณ„์ธต ์ˆœ์„œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: @layer ์•ˆ์—์„œ ์ •์˜๋œ ์Šคํƒ€์ผ์€ ์ ์ˆ˜๊ฐ€ ๋‚ฎ๋”๋ผ๋„ ์„ ์–ธ๋œ ๊ณ„์ธต ์ˆœ์„œ๊ฐ€ ๋†’์œผ๋ฉด ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•˜์œ„ ๋ ˆ์ด์–ด๋กœ, ๋‚ด ์ฝ”๋“œ๋ฅผ ์ƒ์œ„ ๋ ˆ์ด์–ด๋กœ ๋‘๋ฉด ํ‰ํ™”๋กœ์šด ๊ณต์กด์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, ์ „์—ญ์„ ์˜ค์—ผ์‹œํ‚ค๋Š” !important ๋Œ€์‹  '๋ ˆ์ด์–ด ์ •๋ ฌ'์ด๋ผ๋Š” ํ˜„๋Œ€์ ์ธ ์™ธ๊ต์ˆ ์„ ์“ฐ์„ธ์š”."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "์ ์ˆ˜(Specificity)๋ณด๋‹ค ๊ณ„๊ธ‰(@layer)์ด ๋†’๋‹ค!"

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜ CSS์˜ ๋ฏธ๋ž˜๋ฅผ ๋ณธ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋™์•ˆ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž‘ ์‹ธ์šฐ๋А๋ผ ์–ต์ง€๋กœ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ธธ๊ฒŒ ๋Š˜์ด๊ณ  !important๋ฅผ ์“ฐ๋˜ ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ณ ์ƒํ–ˆ๋Š”์ง€... @layer ํ•˜๋‚˜๋ฉด ํ•ด๊ฒฐ๋  ์ผ์ด์—ˆ๋‹ค๋‹ˆ!

๐Ÿ’ก "CSS์˜ ์ตœ์‹  ๊ธฐ๋Šฅ์€ ๊ณผ๊ฑฐ์˜ ๊ณ ํ†ต์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ •๋‹ต์ง€๋‹ค. ์ •๋‹ต์„ ์•Œ๋ฉด ์ฝ”๋”ฉ์ด ์ฆ๊ฑฐ์›Œ์ง„๋‹ค."

์˜ํ˜ธ ๋‹˜์ด "์ŠคํŽ™์€ ๊ณ„์† ๋ณด์ˆ˜ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์‹œ์•ผ๋Š” ํ•ญ์ƒ ์—ด์–ด๋‘ฌ์•ผ ํ•œ๋‹ค"๋ผ๊ณ  ํ•˜์…จ๋‹ค.
๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ฒ”์œ„(Caniuse)๋ฅผ ์ฒดํฌํ•ด๋ณด๋‹ˆ ์ด๋ฏธ ์‹ค๋ฌด์—์„œ ์“ธ๋งŒํ•œ ์ˆ˜์ค€๊นŒ์ง€ ์˜ฌ๋ผ์™”๋”๋ผ. ๋‹น์žฅ ๋‚ด์ผ๋ถ€ํ„ฐ ๋‚ด ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ์— @layer๋ฅผ ๋ฐœ๋ผ๋ด์•ผ์ง€. ๐Ÿš€


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ