๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/๊ธฐํƒ€

SCSS์™€ ์ž๋™ํ™”

interfacer_han 2025. 12. 23. 15:44

#1 SCSS

#1-1 Whatใ†Why

SASS

 

Sass: Syntactically Awesome Style Sheets

Sass is the most mature, stable, and powerful professional grade CSS extension language in the world.

sass-lang.com

CSS๋Š” ๋ฌธ๋ฒ•์ด ๊ฐ„๊ฒฐํ•ด์„œ ์ข‹์ง€๋งŒ, ์œ ์—ฐํ•จ์ด ๋ถ€์กฑํ•˜๊ธฐ์— ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ด ๋‹จ์ (์œ ์—ฐํ•จ)์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ์„œ SASS๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

 

SCSS

SCSS๋Š” Sassy CSS๋ผ๋Š” ๋œป์œผ๋กœ, CSS์—์„œ ์ต์ˆ™ํžˆ ์‚ฌ์šฉํ–ˆ๋˜ ์ค‘๊ด„ํ˜ธ๋‚˜ ๊ฐ์ข… ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ SASS๋‹ค. ์•„๋ž˜์—์„œ SCSS์˜ ๋ฌธ๋ฒ•์„ ์†Œ๊ฐœํ•  ๊ฒƒ์ธ๋ฐ, ์›๋ž˜ CSS๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ฐ”๋กœ ์ตํž ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

#1-2 How

 

Sass: Sass Basics

CSS on its own can be fun, but stylesheets are getting larger, more complex, and harder to maintain. This is where a preprocessor can help. Sass has features that don’t exist in CSS yet like nesting, mixins, inheritance, and other nifty goodies that help

sass-lang.com

๊ณต์‹ ๊ฐ€์ด๋“œ๋‹ค. ์˜์–ด๋กœ ๋œ ํŽ˜์ด์ง€์ง€๋งŒ ๊ดœ์ฐฎ๋‹ค. ์Šคํฌ๋กค์„ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ์ฝ”๋“œ๋งŒ ๋ณด๋ฉด ๋œ๋‹ค. CSS ์ฝ”๋“œ๊ฐ€ SCSS๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์„œ์ˆ ๋˜๋Š”์ง€๋งŒ ๋ณด์ž. ๋ณด๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์—ใ†์‹ค์‹œ๊ฐ„์œผ๋กœ SCSS๋ฅผ ์ตํžˆ๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ๊นŒ์ง€ ๋ณด๊ณ  ๋‚˜๋ฉด ๋ฌธ๋ฒ•์€ ํ†ตํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

#2 ์‚ฌ์šฉ ๋…ธํ•˜์šฐ

#2-1 ์‰ฌ์šด ๊ณ„์ธตํ™”์˜ ํ•จ์ •

ํด๋ž˜์Šค ๋ณ„ ์†์„ฑ์„ ๋‚˜์—ดํ•œ ํ‘œ

<li> (HTML element)๊ฐ€ ์ง€๋…€์•ผ ํ•˜๋Š” 5๊ฐœ์˜ ํด๋ž˜์Šค์™€ ํด๋ž˜์Šค๋“ค์˜ ์†์„ฑ๋“ค์„ ๋‚˜์—ดํ•œ ํ‘œ๋‹ค. ์—ฌ๊ธฐ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ, ์•„๋ž˜์— SCSS ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์•˜๋‹ค.

 

์ฝ”๋“œ 1

li {
  &.a {
    width: 300px;
    top: 70px;
    color: $my-color-1;
  }
  &.b {
    width: 500px;
    top: 70px;
    color: $my-color-1;
  }
  &.c {
    width: 300px;
    top: 70px;
    color: $my-color-2;
  }
  &.d {
    width: 500px;
    top: 20px;
    color: $my-color-2;
  }
  &.e {
    width: 300px;
    top: 20px;
    color: $my-color-3;
  }
}

SCSS์˜ ์‰ฌ์šด ๊ณ„์ธตํ™”์— ์‹ ์ด ๋‚˜์„œ(?) ๋ง‰ SCSS๋ฅผ ์ ๋‹ค ๋ณด๋ฉด ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์“ฐ๊ธฐ ์‹ญ์ƒ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋ญ”๊ฐ€ ๊น”๋”ํ•ด ๋ณด์ด์ง€ ์•Š๋Š”๊ฐ€? ํ•˜์ง€๋งŒ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ผ์ด ์ƒ๊ธฐ๋ฉด ๊ณจ์น˜๊ฐ€ ์•„ํŒŒ์ง„๋‹ค.

 

์ฝ”๋“œ 2

li {
  // ํฌ๊ธฐ (width ๋“ฑ)
  &.a, &.c, &.e { width: 300px; }
  &.b, &.d { width: 500px; }
  
  // ์œ„์น˜ (top ๋“ฑ)
  &.a, &.b, &.c { top: 70px; }
  &.d, &.e { top: 20px; }
  
  // ๋ชจ์–‘ (color ๋“ฑ)
  &.a, &.b { color: $my-color-1; }
  &.c, &.d { color: $my-color-2; }
  &.e { color: $my-color-3; }
}

๋ฐ˜๋ฉด 2๋ฒˆ์งธ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์Šคํƒ€์ผ์€ ์–ด๋–จ๊นŒ? ์ด ์ฝ”๋“œ๋Š” li๊ฐ€ ๋ณ€ํ•˜๋Š” ๊ธฐ์ค€์ ์„ ์ค‘์‹ฌ์œผ๋กœ ์ง  ์ฝ”๋“œ๋‹ค. ์ด ์Šคํƒ€์ผ์€ SRP ์›์น™๊ณผ๋„ ๋งž๋‹ฟ๋Š”๋‹ค. SCSS์—๋Š” ํด๋ž˜์Šค๊ฐ€ ์—†์ง€๋งŒ, ๊ทธ ๋Œ€์‹  ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋ญ‰์น˜๋ฅผ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค (2๋ฒˆ์งธ ์ฝ”๋“œ์—์„œ li๋Š” ์ด 3๊ฐœ์˜ ์ฝ”๋“œ๋ญ‰์น˜๋ฅผ ์ง€๋‹˜). ์˜ˆ๋ฅผ ๋“ค์–ด li์˜ ์œ„์น˜๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฉด, 2๋ฒˆ์งธ ์ฝ”๋“œ ๋ญ‰์น˜๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋์ด๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์™€๋Š” ๋น„๊ต๊ฐ€ ์‹ค๋ก€์ธ ์ˆ˜์ค€์˜ ์ˆ˜์ • ๋‚œ์ด๋„๋‹ค.

 

#2-2 2๊ฐ€์ง€ ์ฃผ์„

// (SASS ์ „์šฉ ์ฃผ์„ ์Šคํƒ€์ผ) ๋ณ€ํ™˜๋œ CSS์—์„œ๋Š” ๋ณด์ด์ง€ ์•Š์„ ์ •๋ณด↓
@mixin theme($theme: DarkGray) {
  background: $theme;
  box-shadow: 0 0 1px rgba($theme, .25);
  color: #fff;
}

/* (์›๋ž˜ ์ฃผ์„ ์Šคํƒ€์ผ) ๋ณ€ํ™˜๋œ CSS์—์„œ๋„ ๋ณด์ผ ์ •๋ณด ↓*/
nav {
  ul {
    margin: 0;
    padding: 0;
    list-style: none;
  }
  li { display: inline-block; }
}

SCSS์—์„œ๋Š” CSS์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋˜ // ์ฃผ์„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. CSS์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€ํ•˜๊ธฐ์—, CSS๋กœ ๋ณ€ํ™˜ ์‹œ์— // ์ฃผ์„์€ ์‚ฌ๋ผ์ง„๋‹ค. ๋”ฐ๋ผ์„œ // ์ฃผ์„์€ SCSS๋งŒ์˜ ์ฝ”๋“œ๋ฅผ ์„ค๋ช…ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋ฐ˜๋ฉด, CSS ๋ณ€ํ™˜ ํ›„์—๋„ ๋ณด์ผ ๋ถ€๋ถ„์€ ์›๋ž˜ CSS์˜ ์ฃผ์„์ธ /**/ ์ฃผ์„์„ ์“ฐ์ž. ์ผ๋‹จ ํ•œ ๋ฒˆ SCSS๋ฅผ ์“ฐ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, CSS๋Š” (์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ์ผ ์—†์ด) '์ถœ๋ ฅ๋ฌผ ํŒŒ์ผ'๋กœ์„œ๋งŒ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์•ž์ผ์€ ๋ชจ๋ฅด๋Š” ๋ฒ•์ด๋‹ค. CSS ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณด๊ฒŒ ๋  ์ž ์žฌ์ ์ธ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด /**/ ์ฃผ์„๋„ ์“ฐ์ž๋Š” ๊ฒƒ์ด๋‹ค.

 

#3 SCSS → CSS ๋ณ€ํ™˜

#3-1 ์ปดํŒŒ์ผ๋Ÿฌ ์„ค์น˜ ๋ฐ ๋ณ€ํ™˜

๋‹ค์šด๋กœ๋“œ

๋จผ์ € ๊ณต์‹ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ, CLI ํ”„๋กœ๊ทธ๋žจ์˜ ํ˜•ํƒœ์ธ SASS ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.

 

์„ค์น˜

๋‹ค์šด๋กœ๋“œ ํ›„ ์••์ถ•์„ ํ’€๋ฉด ๋‚˜์˜ค๋Š” ํด๋”์˜ ๊ฒฝ๋กœ๋ฅผ Path(in ์‹œ์Šคํ…œ ๋ณ€์ˆ˜)์— ์ €์žฅํ•œ๋‹ค. ์ €์žฅ ํ›„, ์žฌ๋ถ€ํŒ…ํ•œ๋‹ค. ์žฌ๋ถ€ํŒ… ํ›„ CMD ์ฐฝ์„ ์ผœ์„œ,

sass --version

์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๋ฒ„์ „ ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค๋ฉด ์„ฑ๊ณต์ด๋‹ค.

 

๋ณ€ํ™˜

1. ๋ณ€ํ™˜ํ•  scss ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋นˆ ๊ณต๊ฐ„ ์šฐํด๋ฆญ - [ํ„ฐ๋ฏธ๋„์—์„œ ์—ด๊ธฐ]
2. "sass example.scss example.css" ์ž…๋ ฅ

 

#3-2 ์ž๋™ ๋ณ€ํ™˜ ๋„๊ตฌ

#3-1์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ž‘๋™๋˜๋ฉด ์ฐธ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ƒ๊ฐ์„ ์šฐ๋ฆฌ๋งŒ ํ•  ๋ฆฌ๊ฐ€ ์—†๋‹ค. ์—ฌ๋Ÿฌ IDE์—์„œ๋Š” SASS ๊ณ„์—ด ํŒŒ์ผ์„ CSS๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ IDE๋Š” JetBrains์‚ฌ์˜ WebStorm์ด๋‹ค.

 

#3-3 Watcher ์„ค์ •๋ฒ•

WebStorm์—์„œ

[File (ํŒŒ์ผ)] - [Settings (์„ค์ •)] - [Tools (๋„๊ตฌ)] - [File Watchers (ํŒŒ์ผ ๊ฐ์‹œ๊ธฐ)] - [+] - [SCSS]

๋กœ ๋“ค์–ด๊ฐ€๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฐฝ์ด ๋œฌ๋‹ค.

 

์›ฌ๋งŒํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์œ„์™€ ๋˜‘๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค. ์ถ”๊ฐ€ ์„ค๋ช…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์™ผ์ชฝ ์•„๋ž˜์— ์žˆ๋Š” [?] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋œ๋‹ค (2025.02 ๋ฒ„์ „์˜ WebStorm์—์„œ [?] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ์‹œ ๋œจ๋Š” ํŽ˜์ด์ง€). LLM์˜ ๋‹ต๋ณ€์„ ๋น ๋ฅด๊ฒŒ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ์Šคํฌ๋ฆฐ์ƒท์„ ํ†ต์งธ๋กœ ์˜ฌ๋ฆฌ๊ณ  ์„ค๋ช…ํ•ด๋‹ฌ๋ผ๊ณ  ํ•ด๋„ ์ข‹๋‹ค.

 

#3-4 ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์ด์ œ SCSS ํŒŒ์ผ์—์„œ ํ•œ ๋‹จ ๊ธ€์ž๋งŒ ์ˆ˜์ •ํ•ด๋„, CSS ์ถœ๋ ฅ ํŒŒ์ผ์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.