๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Work/Web

[์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ] ๋…ธ๋‹ต ๋””์ž์ด๋„ˆ์˜ ์ฝ”๋”ฉ ๋ฐฐ์šฐ๊ธฐ - Sass? SCSS? ์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ๋ž€?

SAS ํŒŒ์ผ์€ ๋ฌด์Šจ ๋œป์ด์•ผ? SCSS๋ž‘ ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ์ง€?

 

Sass(Syntactically Awesome Style Sheets, ์ค„์—ฌ์„œ Sass)๋Š” CSS๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์ž…๋‹ˆ๋‹ค. Sass๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๋Š”๋ฐ, ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ SCSS์ž…๋‹ˆ๋‹ค. SCSS์™€ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ์šฉ์–ด๋“ค์„ ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•˜์ž๋ฉด:

 

1. Sass(SAS)

Sass๋Š” CSS๋ฅผ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ(preprocessor)์ž…๋‹ˆ๋‹ค. CSS์— ์—†๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(๋ณ€์ˆ˜, ์ค‘์ฒฉ, ์ƒ์† ๋“ฑ)์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

Sass์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ๋ฒ• ์Šคํƒ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

Sass ๋ฌธ๋ฒ•(Sass Syntax): ์›๋ž˜์˜ Sass ์Šคํƒ€์ผ๋กœ, ์ค‘๊ด„ํ˜ธ {}๋‚˜ ์„ธ๋ฏธ์ฝœ๋ก  ; ์—†์ด ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

SCSS ๋ฌธ๋ฒ•(Sassy CSS): CSS์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ Sass์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

2. SCSS (Sassy CSS)

SCSS๋Š” Sass์˜ ํ™•์žฅ๋œ ๋ฌธ๋ฒ•์œผ๋กœ, ๊ธฐ๋ณธ CSS ๋ฌธ๋ฒ•์— Sass ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. CSS์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฌธ๋ฒ•์„ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด CSS ํŒŒ์ผ๋„ ๊ทธ๋Œ€๋กœ SCSS ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SCSS ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ .scss ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

SCSS ๋ฌธ๋ฒ•์—์„œ๋Š” CSS์ฒ˜๋Ÿผ ์ค‘๊ด„ํ˜ธ {}์™€ ์„ธ๋ฏธ์ฝœ๋ก  ;์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— CSS์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋” ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

 

Sass์™€ SCSS์˜ ์ฐจ์ด

Sass ๋ฌธ๋ฒ•: ์ค‘๊ด„ํ˜ธ {}์™€ ์„ธ๋ฏธ์ฝœ๋ก  ;์„ ์ƒ๋žตํ•˜๊ณ , ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ๋งŒ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. .sass ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// Sass ๋ฌธ๋ฒ• ์˜ˆ์‹œ
.navbar
  background-color: #333
  .menu
    display: flex

 

SCSS ๋ฌธ๋ฒ•: CSS์ฒ˜๋Ÿผ ์ค‘๊ด„ํ˜ธ {}์™€ ์„ธ๋ฏธ์ฝœ๋ก  ;์„ ์‚ฌ์šฉํ•˜๋ฉฐ, CSS ํŒŒ์ผ๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. .scss ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// SCSS ๋ฌธ๋ฒ• ์˜ˆ์‹œ
.navbar {
  background-color: #333;
  .menu {
    display: flex;
  }
}

 

์š”์•ฝ:

Sass๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ์ด๋ฉฐ, CSS๋ฅผ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

**Sass ๋ฌธ๋ฒ•(SAS ํŒŒ์ผ)**์€ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ์Šคํƒ€์ผ์„ ํ‘œํ˜„ํ•˜๋ฉฐ, **SCSS ๋ฌธ๋ฒ•(SCSS ํŒŒ์ผ)**์€ CSS์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

SCSS๋Š” Sass์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์œผ๋กœ, ๊ธฐ์กด CSS๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— CSS ์‚ฌ์šฉ์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์ด ๋” ์‰ฝ๊ฒŒ ์ ์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ SCSS๋Š” Sass์˜ ํ•œ ์ข…๋ฅ˜์ด๋ฉฐ, CSS์™€์˜ ํ˜ธํ™˜์„ฑ์ด ๋†’๊ณ  ๋” ์นœ์ˆ™ํ•œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

 

์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ๊ฐ€ ๋ญํ•˜๋Š” ๊ฑด๋ฐ? ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ?


์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‚˜ ์›น ๊ฐœ๋ฐœ์—์„œ ์›์‹œ ์ฝ”๋“œ(์ž‘์„ฑ๋œ ์ฝ”๋“œ)๋ฅผ ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, CSS ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆœ์ˆ˜ CSS ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์—ญํ• ์„ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด:

1. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ: ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” SCSS๋‚˜ Sass ๊ฐ™์€ ์–ธ์–ด๋Š” ๋” ํšจ์œจ์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ๋ฐ”๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2. ์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ์˜ ๋ณ€ํ™˜ ์ž‘์—…: ์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ(Sass, Less ๋“ฑ)๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ SCSS/Sass ํŒŒ์ผ์„ ์ฝ์–ด์„œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆœ์ˆ˜ํ•œ CSS ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

3. ์ตœ์ข… ์ถœ๋ ฅ๋ฌผ: ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ๊ฑฐ์นœ ๊ฒฐ๊ณผ๋Š” ํ‘œ์ค€ CSS๋กœ ์ปดํŒŒ์ผ๋˜๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด CSS ํŒŒ์ผ์„ ์ฝ์–ด ์‹ค์ œ๋กœ ํŽ˜์ด์ง€์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

 

CSS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ์Šคํƒ€์ผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ํž˜๋“ญ๋‹ˆ๋‹ค. Sass๋‚˜ SCSS ๊ฐ™์€ ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” ์ด๋ฅผ ๋ณด์™„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

๋ณ€์ˆ˜ ์‚ฌ์šฉ: ์ƒ‰์ƒ, ๊ธ€๊ผด ํฌ๊ธฐ ๋“ฑ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ(Nesting): HTML ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์Šคํƒ€์ผ์„ ์ค‘์ฒฉํ•ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.

๋ชจ๋“ˆํ™”: ์Šคํƒ€์ผ์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ ์ค„์ด๊ธฐ: mixin์ด๋‚˜ ํ•จ์ˆ˜ ๋“ฑ์„ ์‚ฌ์šฉํ•ด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

์—ฐ์‚ฐ ๊ฐ€๋Šฅ: ์ˆ˜ํ•™์  ๊ณ„์‚ฐ์„ ํ†ตํ•ด ํฌ๊ธฐ, ๊ฐ„๊ฒฉ ๋“ฑ์„ ๋™์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// scss ์˜ˆ์‹œ
$primary-color: #3498db;

.button {
  background-color: $primary-color;
  padding: 10px;
  border-radius: 5px;
  &:hover {
    background-color: darken($primary-color, 10%);
  }
}

์œ„ ์ฝ”๋“œ๋Š” Sass ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” CSS๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค:

 

// css ์˜ˆ์‹œ
.button {
  background-color: #3498db;
  padding: 10px;
  border-radius: 5px;
}
.button:hover {
  background-color: #2c80b9;
}

 

์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์‹ค์ œ ๊ณผ์ •:

1. SCSS ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ ,

2. ์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ(์˜ˆ: Sass CLI, Webpack์˜ Sass loader ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ด SCSS๋ฅผ CSS๋กœ ๋ณ€ํ™˜ํ•˜๊ณ ,

3. ๋ณ€ํ™˜๋œ CSS ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ์–ด์„œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์š”์•ฝ:

 

์ „์ฒ˜๋ฆฌ๊ธฐ ๋„๊ตฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ๋ณต์žกํ•œ SCSS/Sass ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ˆœํ•œ CSS๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋” ํšจ์œจ์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์ฃผ์š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.