๐Ÿš€ BEM ์‹ค์ „ ๊ฐ€์ด๋“œ: SCSS ํ™œ์šฉ๋ฒ•๋ถ€ํ„ฐ ๋†“์น˜๊ธฐ ์‰ฌ์šด 3๊ฐ€์ง€ ์ฃผ์˜์ ๊นŒ์ง€

2025. 12. 16. 10:18ยทAfter. 2025
BEM(Block, Element, Modifier)์€ CSS๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ BEM์„ ํ”„๋กœ์ ํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ์•ˆ์ฐฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹ค์ „ ํŒ๊ณผ SCSS ํ™œ์šฉ ์ „๋žต์„ ์ˆ™์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.์ด ๊ธ€์—์„œ๋Š” BEM์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ๊ฐœ๋ฐœ์ž๋“ค์ด ํ”ํžˆ ์ €์ง€๋ฅด๋Š” ์‹ค์ˆ˜ 3๊ฐ€์ง€๋ฅผ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

1. ๐Ÿ’ป SCSS์—์„œ BEM์„ ํ™œ์šฉํ•˜๋Š” ๋ฒ•: ๊ฐ„๊ฒฐํ•œ ๋„ค์ŠคํŒ… ์ „๋žต

SCSS๋Š” CSS์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•œ ์ „์ฒ˜๋ฆฌ๊ธฐ์ž…๋‹ˆ๋‹ค. SCSS์˜ ๋„ค์ŠคํŒ…(Nesting)๊ณผ ์•ฐํผ์ƒŒ๋“œ(&)๋ฅผ ํ™œ์šฉํ•˜๋ฉด BEM์˜ ๊ธด ํด๋ž˜์Šค๋ช…์„ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด์„œ๋„ BEM ๊ทœ์น™์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SCSS๋ฅผ ์ด์šฉํ•œ BEM ๋ช…๋ช…

SCSS์—์„œ ์•ฐํผ์ƒŒ๋“œ(&)๋Š” ๋ถ€๋ชจ ์„ ํƒ์ž๋ฅผ ์ฐธ์กฐํ•˜๋ฉฐ, ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ BEM์˜ ๊ตฌ๋ถ„์ž(__, --)๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

BEM ๊ตฌ์„ฑ ์š”์†Œ SCSS ํ‘œํ˜„ ๋ฐฉ๋ฒ• ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ (์˜ˆ์‹œ)
Block .card { ... } .card
Element &__title { ... } .card__title
Modifier &--dark { ... } .card--dark

์ž‘์„ฑ ์˜ˆ์‹œ

.button {
  display: inline-block;
  padding: 10px 20px;
  background-color: #007bff;
  color: white;

  // Element: button__icon
  &__icon {
    margin-right: 5px;
  }

  // Modifier: button--primary
  &--primary {
    background-color: #28a745;
  }
}

โœจ ์žฅ์ : ์ฝ”๋”ฉ ์‹œ ํด๋ž˜์Šค๋ช… ๋ฐ˜๋ณต์„ ์ค„์—ฌ ์ƒ์‚ฐ์„ฑ์ด ํ–ฅ์ƒ๋˜๋ฉฐ, ์ปดํŒŒ์ผ๋œ CSS๋Š” BEM ๊ทœ์น™์„ ์™„๋ฒฝํžˆ ๋”ฐ๋ฅด๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.


2. ๐Ÿ›‘ BEM ์ ์šฉ ์‹œ ๋ฐ˜๋“œ์‹œ ํ”ผํ•ด์•ผ ํ•  3๊ฐ€์ง€ ์ฃผ์˜์ 

BEM์˜ ํ•ต์‹ฌ ์›์น™์„ ๋ฒ—์–ด๋‚˜๋ฉด ์˜คํžˆ๋ ค CSS๊ฐ€ ๋ณต์žกํ•ด์ง€๊ฑฐ๋‚˜ ์˜๋„์น˜ ์•Š์€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์‹ค์ˆ˜๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜์  1: Element์˜ ์ค‘์ฒฉ์„ ํ”ผํ•˜๊ณ  ๊นŠ์ด๋Š” 1๋‹จ๊ณ„๋กœ ์œ ์ง€ํ•˜๋ผ

BEM์€ ํ‰ํƒ„ํ•œ ๊ตฌ์กฐ(Flat Structure)๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค. Element๋Š” ํ•ญ์ƒ Block์˜ ์ง์† ์ž์‹์ฒ˜๋Ÿผ ๋ช…๋ช…๋˜์–ด์•ผ ํ•˜๋ฉฐ, block__element__subelement์™€ ๊ฐ™์€ ๊นŠ์€ ์ค‘์ฒฉ์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SCSS ์‚ฌ์šฉ ์‹œ ์ฃผ์˜: SCSS ๋„ค์ŠคํŒ…์„ ์‚ฌ์šฉํ•  ๋•Œ๋„, &__item ์•ˆ์— ๋‹ค์‹œ &__link๋ฅผ ๋„ค์ŠคํŒ…ํ•˜์ง€ ๋ง๊ณ , .menu__item๊ณผ .menu__link๋ฅผ .menu ๋ธ”๋ก ํ•˜์œ„์— ๋‚˜๋ž€ํžˆ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜์  2: Modifier๋Š” ์›๋ณธ ํด๋ž˜์Šค์— ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ผ

Modifier๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ๋งŒ์„ ์œ„ํ•œ ํ”Œ๋ž˜๊ทธ์ด๋ฏ€๋กœ, ํ•ญ์ƒ ์›๋ณธ ํด๋ž˜์Šค(Block ๋˜๋Š” Element)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<button class="button button--disabled">
</button>

CSS: Modifier ํด๋ž˜์Šค๋งŒ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ์Šคํƒ€์ผ์ด ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜์  3: CSS ์„ ํƒ์ž(Selector)์˜ ๋ณต์žก๋„๋ฅผ ๋†’์ด์ง€ ๋งˆ๋ผ

BEM์€ ๋‚ฎ์€ ๋ช…์‹œ๋„๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์Šคํƒ€์ผ ์žฌ์ •์˜(Override)๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํƒœ๊ทธ ์„ ํƒ์ž๋‚˜ > ๊ฐ™์€ ๋ณต์žกํ•œ ๊ฒฐํ•ฉ์ž๋ฅผ BEM ํด๋ž˜์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SCSS ์‚ฌ์šฉ ์‹œ ์ฃผ์˜:

// โŒ ์ง€์–‘: ๋ณต์žกํ•œ ์„ ํƒ์ž๋กœ ์ปดํŒŒ์ผ๋จ
.card {
  a { /* ... */ } 
}

// โœ… ๊ถŒ์žฅ: ๋‹จ์ผ BEM ํด๋ž˜์Šค๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •
.card {
  &__link { /* ... */ } 
}

๐Ÿ”‘ ํ•ต์‹ฌ: BEM ํด๋ž˜์Šค(.block-name) ํ•˜๋‚˜๋งŒ์œผ๋กœ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜์—ฌ CSS์˜ ๋ช…์‹œ๋„๋ฅผ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด BEM์˜ ์ด์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ธธ์ž…๋‹ˆ๋‹ค.


5. ๊ฒฐ๋ก 

BEM ๋ฐฉ๋ฒ•๋ก ์€ SCSS๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ๊ทน๋Œ€ํ™”๋ฉ๋‹ˆ๋‹ค. ์•ฐํผ์ƒŒ๋“œ์™€ ๋„ค์ŠคํŒ…์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋”ฉ์€ ๋น ๋ฅด๊ฒŒ ํ•˜๋˜, ํ‰ํƒ„ํ•œ ๊ตฌ์กฐ ์œ ์ง€, Modifier์˜ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ, ๋‹จ์ผ ํด๋ž˜์Šค ์„ ํƒ์ž ์‚ฌ์šฉ์ด๋ผ๋Š” BEM์˜ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™์„ ์ง€ํ‚จ๋‹ค๋ฉด, ์–ด๋–ค ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ฒฌ๊ณ ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด CSS ๊ตฌ์กฐ๋ฅผ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'After. 2025' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

โœ๏ธ Airbnb JavaScript ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ: ์™œ ๋”ฐ๋ฅด๊ณ , ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ ํ• ๊นŒ?  (1) 2025.12.17
๐Ÿงฑ BEM ๋ฐฉ๋ฒ•๋ก : HTML/CSS๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ด๋ฆ„ ์ง“๊ธฐ์˜ ๋งˆ๋ฒ•  (0) 2025.12.15
๐Ÿง ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ์™€ ํ”„๋กœํ† ํƒ€์ดํ•‘ ์‹ฌ์ธต ํ•ด๋ถ€  (0) 2025.12.14
UX/UI ๊ธฐํš์˜ ํ•ต์‹ฌ ๋ฌธ์„œ 3๊ฐ€์ง€: ๊ธฐํš์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค๊ณผ ์ถ”์ฒœ ํˆด  (0) 2025.12.13
์™€์ด์–ดํ”„๋ ˆ์ž„ VS ์Šคํ† ๋ฆฌ๋ณด๋“œ ํ™ˆํŽ˜์ด์ง€ ๊ธฐํš์˜ ํ•ต์‹ฌ ์ฐจ์ด!  (0) 2025.12.12
'After. 2025' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • โœ๏ธ Airbnb JavaScript ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ: ์™œ ๋”ฐ๋ฅด๊ณ , ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ ํ• ๊นŒ?
  • ๐Ÿงฑ BEM ๋ฐฉ๋ฒ•๋ก : HTML/CSS๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ด๋ฆ„ ์ง“๊ธฐ์˜ ๋งˆ๋ฒ•
  • ๐Ÿง ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ์™€ ํ”„๋กœํ† ํƒ€์ดํ•‘ ์‹ฌ์ธต ํ•ด๋ถ€
  • UX/UI ๊ธฐํš์˜ ํ•ต์‹ฌ ๋ฌธ์„œ 3๊ฐ€์ง€: ๊ธฐํš์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ๊ฒƒ๋“ค๊ณผ ์ถ”์ฒœ ํˆด
๋น™๊ณ ๊ตฌ๋ง›ํƒ•
๋น™๊ณ ๊ตฌ๋ง›ํƒ•
  • ๋น™๊ณ ๊ตฌ๋ง›ํƒ•
    ๐•Ž๐”ผ๐”น ๐”ธ๐•ƒ๐•ƒ ๐•ƒ๐•†๐”พ
    ๋น™๊ณ ๊ตฌ๋ง›ํƒ•
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๋ฐฉ๋ช…๋ก
    • ๊ธ€์“ฐ๊ธฐ
    • ๊ด€๋ฆฌ์ž
    • ์ „์ฒด๋ณด๊ธฐ N
      • w. Gemini
      • w. GPTs
      • After. 2025 N
      • Before. 2021
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ie9 ์„  ๋ฒ„๊ทธ
    min-height:100%
    box-shadow
    ํฌ๋กฌ ์ œ๋ฏธ๋‚˜์ด
    ํฌ๋กฌ ๋ถ„ํ•  ๋ณด๊ธฐ
    css3
    footer ํ•˜๋‹จ์— ๊ณ ์ •
    ํƒญ ์ „ํ™˜ ๊ฐ€์†
    ์ œ๋ฏธ๋‚˜์ด
    border-collapse ์˜ค๋ฅ˜
    footer ๊ณ ์ •
    ie collapse ๋ฒ„๊ทธ
    ํฌ๋กฌ ์ฝ๊ธฐ ๋ชจ๋“œ
    ํฌ๋กฌ
    ํฌ๋กฌ ๊ตฌ๊ธ€ ๋ Œ์ฆˆ
    input fileํƒœ๊ทธ ๋ฐ”๊พธ๊ธฐ
    ํฌ๋กฌ ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ
    ํฌ๋กฌ ๊ฟ€ํŒ
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
๋น™๊ณ ๊ตฌ๋ง›ํƒ•
๐Ÿš€ BEM ์‹ค์ „ ๊ฐ€์ด๋“œ: SCSS ํ™œ์šฉ๋ฒ•๋ถ€ํ„ฐ ๋†“์น˜๊ธฐ ์‰ฌ์šด 3๊ฐ€์ง€ ์ฃผ์˜์ ๊นŒ์ง€
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”