Unisquads
로그인
홈
이용약관·개인정보처리방침·콘텐츠정책·© 2026 Unisquads
이용약관·개인정보처리방침·콘텐츠정책
© 2026 Unisquads. All rights reserved.

Sass 및 Pre-processors (r1)

이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.13 22:17

Sass 및 Pre-processors

이름

Sass

분류

CSS Pre-processor

공식 웹사이트

https://sass-lang.com/

주요 기능

변수, 중첩, 믹스인, 상속, 모듈화

구문

.sass(들여쓰기 구문), .scss(중괄호 구문)

주요 구현 언어

Dart, Ruby (레거시)

기술 상세

설명

CSS를 확장하는 스크립트 언어로, 변수, 중첩, 믹스인, 함수 등의 기능을 제공하여 CSS 작성 효율성을 높입니다.

대표적인 [[Pre-processor]]

Sass, Less, Stylus

컴파일 방식

명령줄 도구, 빌드 도구(Gulp, Webpack), 통합 개발 환경 플러그인

변수(Variables)

$ 기호를 사용하여 색상, 폰트, 크기 등을 저장하고 재사용

중첩(Nesting)

CSS 규칙을 계층적으로 중첩하여 선택자 구조를 명확히 표현

믹스인(Mixins)

재사용 가능한 스타일 블록을 정의하고 인자 전달 가능

상속(Extend/Inheritance)

@extend 지시어를 사용하여 다른 선택자의 스타일을 상속

모듈(Modules)

@use 규칙을 통해 다른 Sass 파일을 모듈로 불러와 사용

제어문(Control Directives)

@if, @for, @each, @while을 사용한 조건문 및 반복문

내장 함수(Built-in Functions)

색상 조작, 문자열 처리, 수학 연산 등을 위한 다양한 함수 제공

장점

코드 재사용성 향상, 유지보수 용이, 논리적 구조화, CSS 호환성

단점

컴파일 필요, 학습 곡선, 디버깅 복잡성 증가

1. 개요

CSS는 웹 페이지의 스타일을 정의하는 표준 언어이지만, 프로젝트의 규모가 커질수록 유지보수와 확장성에 한계를 보인다. 이러한 한계를 극복하기 위해 등장한 것이 CSS 전처리기이며, 그 중 가장 대표적인 도구가 Sass이다. Sass는 Syntactically Awesome Stylesheets의 약자로, CSS에 프로그래밍 언어적인 기능을 추가하여 더 강력하고 효율적인 스타일시트 작성을 가능하게 한다.

Sass 및 다른 전처리기들은 변수, 중첩, 믹스인, 상속, 모듈화 등의 기능을 제공한다. 이를 통해 색상, 폰트, 여백 등의 값을 변수로 저장해 재사용하거나, 선택자를 계층 구조로 중첩하여 가독성을 높이고, 반복되는 코드 패턴을 함수처럼 재사용할 수 있다. 결과적으로 개발자는 더 적은 코드로 더 많은 작업을 수행할 수 있으며, 논리적이고 체계적인 스타일시트 구조를 설계할 수 있다.

Sass는 초기에 들여쓰기(indent) 기반의 간결한 구문(Sass 문법)을 사용했으나, 이후 CSS와 완전히 호환되는 중괄호({})와 세미콜론(;)을 사용하는 SCSS 문법을 도입했다. SCSS는 기존 CSS 코드를 그대로 포함시킬 수 있어 진입 장벽이 낮으며, 현재는 사실상 표준 문법으로 자리 잡았다. Sass는 Node.js 기반의 npm을 통해 설치하거나, Ruby 젬으로도 설치할 수 있으며, 대부분의 현대적인 프론트엔드 빌드 도구와 원활하게 통합된다.

이 문서는 Sass의 핵심 개념과 기능, 다른 전처리기와의 비교, 그리고 실무에서의 효과적인 활용 방법을 다룬다. CSS의 한계를 느끼고 더 나은 개발 경험과 유지보수성을 추구하는 프론트엔드 개발자에게 유용한 가이드가 될 것이다.

2. CSS Pre-processor란

CSS Pre-processor는 작성된 코드를 표준 CSS로 변환(컴파일)하는 프로그램 또는 스크립트 언어입니다. 개발자는 확장된 문법과 기능을 사용하여 스타일시트를 작성하고, 이는 Pre-processor에 의해 일반 브라우저가 이해할 수 있는 순수 CSS 파일로 변환됩니다. 이 과정은 빌드 도구나 태스크 러너를 통해 자동화됩니다.

주요 필요성은 CSS의 한계를 극복하고 유지보수성을 높이는 데 있습니다. 순수 CSS는 변수 사용, 코드 재사용, 중첩 선택자, 모듈화 등의 기능이 부족하여 대규모 프로젝트에서 코드가 복잡해지고 중복이 발생하기 쉽습니다. CSS Pre-processor는 이러한 문제를 해결하여 개발 효율성을 크게 향상시킵니다.

주요 기능은 다음과 같습니다.

기능

설명

변수(Variables)

색상, 폰트, 여백 등의 값을 변수에 저장하여 전역적으로 관리하고 재사용합니다.

중첩(Nesting)

선택자를 부모-자식 관계에 따라 계층적으로 중첩하여 작성할 수 있어 가독성을 높입니다.

믹스인(Mixins)

재사용 가능한 스타일 블록을 정의하고, 인자를 전달하여 유연하게 사용할 수 있습니다.

상속(Extend/Inheritance)

한 선택자의 스타일을 다른 선택자가 상속받을 수 있게 하여 코드 중복을 줄입니다.

모듈화(Modularity)

스타일시트를 여러 파일로 분리하고, 필요에 따라 조합하여 관리할 수 있습니다.

연산(Operations)

숫자, 색상, 단위에 대한 사칙연산을 코드 내에서 직접 수행할 수 있습니다.

내장 함수(Built-in Functions)

색상 조정, 문자열 처리, 수학 계산 등을 위한 다양한 함수를 제공합니다.

이러한 기능들은 코드를 더 논리적이고 체계적으로 구성하게 하며, 결과적으로 유지보수 비용을 절감하고 개발 속도를 높이는 데 기여합니다.

2.1. 정의와 필요성

CSS Pre-processor는 CSS의 한계를 극복하고 개발 효율성을 높이기 위해 등장한 도구이다. 기본적으로 CSS는 변수, 함수, 논리 연산 등의 프로그래밍적 기능을 제공하지 않는 선언형 언어이다. 이로 인해 대규모 프로젝트에서는 스타일 코드의 재사용성과 유지보수성이 떨어지고, 반복적인 코드 작성이 불가피해진다.

CSS Pre-processor는 이러한 문제를 해결한다. 개발자는 Sass, Less, Stylus와 같은 전처리기의 확장 문법(예: 변수, 중첩 규칙, 믹스인, 상속)으로 스타일시트를 작성한다. 작성된 코드는 전처리기가 표준 CSS 문법으로 컴파일되어 브라우저가 해석할 수 있는 형태로 변환된다[1]. 이 과정을 통해 개발자는 보다 체계적이고 강력한 방식으로 스타일을 관리할 수 있다.

주요 필요성은 다음과 같이 정리할 수 있다.

필요성

설명

유지보수성 향상

변수(Variables)를 사용하면 색상, 폰트 크기 등 공통 값을 한 곳에서 관리할 수 있어, 변경 시 모든 관련 코드를 수정하지 않아도 된다.

코드 재사용성 증가

믹스인(Mixins)과 상속(Extend/Inheritance) 기능을 통해 반복되는 코드 패턴을 함수처럼 재사용할 수 있다.

논리적 구조화

중첩(Nesting)을 통해 선택자의 계층 구조를 시각적으로 명확하게 표현할 수 있어, 코드 가독성이 높아진다.

모듈화 관리

모듈화(Partials와 @import/@use) 기능으로 스타일시트를 여러 파일로 분리하고 조합할 수 있어, 대형 프로젝트의 구조 설계가 용이해진다.

결국, CSS Pre-processor는 CSS에 프로그래밍 언어의 편의 기능을 도입함으로써, 개발자가 더 적은 코드로 더 많은 작업을 수행하고, 스타일 시스템을 체계적으로 구축할 수 있게 해준다. 이는 특히 디자인 시스템을 적용하거나 팀 단위로 협업하는 프로젝트에서 그 가치가 두드러진다.

2.2. 주요 기능

CSS Pre-processor는 순수 CSS에는 존재하지 않는 프로그래밍 언어적 기능을 제공하여 스타일시트 작성을 더욱 효율적이고 체계적으로 만든다. 주요 기능은 크게 코드의 재사용성 향상, 유지보수성 강화, 논리적 구조화로 요약할 수 있다.

가장 기본적이고 핵심적인 기능은 변수(Variables)를 사용하는 것이다. 색상, 폰트, 여백 등 자주 사용하는 값을 변수에 저장하여 일관된 디자인 시스템을 구축하고, 값 변경 시 한 곳만 수정하면 전체에 반영되도록 한다. 또한, 중첩(Nesting)을 통해 선택자(Selector)의 계층 구조를 시각적으로 명확하게 표현할 수 있어, 불필요한 반복을 줄이고 코드 가독성을 높인다.

논리적 연산과 재사용을 위한 기능도 제공한다. 믹스인(Mixins)은 인자를 받을 수 있는 재사용 가능한 스타일 블록을 정의하여, 벤더 프리픽스가 필요한 속성이나 복잡한 그리드 레이아웃과 같은 패턴을 쉽게 적용할 수 있게 한다. 상속(Extend/Inheritance) 기능은 한 선택자의 스타일을 다른 선택자가 그대로 물려받도록 하여, 중복 코드를 최소화한다. 조건문(@if, @else)과 반복문(@for, @each, @while)을 사용하여 동적인 스타일 생성을 가능하게 하는 것도 중요한 특징이다.

기능

설명

예시 혹은 효과

변수

값을 저장하고 재사용

$primary-color: #333;

중첩

선택자 계층을 내부에 작성

nav { ul { ... } }

믹스인

인자를 가진 재사용 블록

@mixin transform($property) { ... }

상속

선택자 스타일 공유

.message { @extend %message-shared; }

연산

사칙연산, 색상 연산

width: 100px / 2;

제어문

조건문과 반복문

@if, @for, @each

모듈화

파일 분할과 임포트

@use 'base';

마지막으로, 모듈화 기능을 통해 스타일시트를 여러 개의 파일로 분할하고 관리할 수 있다. @import 규칙이나 더 현대적인 @use 규칙을 사용하여 변수, 믹스인, 함수, 스타일을 논리적 단위로 묶어 프로젝트 구조를 체계적으로 설계하는 것이 가능해진다. 이러한 기능들은 최종적으로 모두 표준 CSS 문법으로 컴파일되어 브라우저에서 해석된다.

3. Sass 소개

Sass는 CSS의 단점을 보완하고 개발 효율성을 높이기 위해 등장한 CSS 전처리기 중 하나이다. 2006년 햄튼 캐틀린에 의해 처음 설계되었으며, 루비로 작성되었으나 이후 널리 채택되면서 다양한 언어로 포팅되었다. Sass는 CSS에 존재하지 않는 변수, 중첩, 믹스인, 상속, 모듈화 등의 프로그래밍적 기능을 제공하여 더욱 체계적이고 유지보수하기 쉬운 스타일시트 작성을 가능하게 한다.

Sass는 두 가지 구문을 제공한다. 첫 번째는 들여쓰기(indentation)를 기반으로 한 원래의 구문으로, 파일 확장자는 .sass이다. 이 구문은 중괄호({})와 세미콜론(;)을 생략하고, 계층 구조는 들여쓰기로 표현한다. 두 번째는 기존 CSS 문법과 완전히 호환되는 SCSS(Sassy CSS) 구문으로, 파일 확장자는 .scss이다. SCSS는 모든 유효한 CSS 코드가 그대로 유효한 Sass 코드이므로 기존 프로젝트의 도입 장벽이 낮아 현재 더 널리 사용된다.

구문

파일 확장자

특징

Sass (들여쓰기 구문)

.sass

중괄호와 세미콜론을 사용하지 않음. 간결하지만 CSS와의 차이가 큼.

SCSS (Sassy CSS)

.scss

중괄호와 세미콜론을 사용함. 모든 CSS 문법을 그대로 사용 가능하여 호환성이 높음.

Sass를 사용하기 위해서는 개발 환경에 컴파일러를 설치해야 한다. 가장 일반적인 방법은 Node.js의 패키지 관리자인 npm을 통해 공식 Dart Sass 구현체를 설치하는 것이다. 명령어 npm install -g sass로 전역 설치 후, sass input.scss output.css 명령으로 단일 파일을 컴파일하거나, --watch 옵션을 사용하여 파일 변경을 감지하고 자동으로 컴파일할 수 있다. 또한 웹팩, Gulp, 그런트 등의 현대적 프론트엔드 빌드 도구와의 연동을 통해 개발 워크플로우에 통합하는 것이 일반적이다.

3.1. Sass와 SCSS 문법

Sass는 두 가지 구문을 제공한다. 하나는 들여쓰기(indented)를 기반으로 한 Sass 구문이고, 다른 하나는 중괄호와 세미콜론을 사용하는 SCSS 구문이다. SCSS 구문은 기존 CSS 문법의 상위 집합(superset)으로 설계되어, 모든 유효한 CSS 코드는 그대로 유효한 SCSS 코드로 인식된다. 이는 기존 CSS 프로젝트를 점진적으로 Sass로 전환하는 데 유리한 특징이다.

Sass 구문(종종 '들여쓰기 구문'이라고 함)은 중괄호와 세미콜론을 전혀 사용하지 않는다. 대신, 규칙의 계층 구조는 들여쓰기로 표현되며, 속성과 값의 구분은 줄 바꿈으로 처리된다. 이 구문은 더 간결하고 작성 속도가 빠르다는 평가를 받지만, 기존 CSS와의 차이가 크다는 점이 진입 장벽이 될 수 있다. 반면, SCSS 구문은 기존 CSS 작성자에게 친숙한 형태를 유지하면서 Sass의 모든 고급 기능을 사용할 수 있게 한다.

두 구문 간의 주요 차이점을 다음 표로 정리할 수 있다.

특징

Sass (들여쓰기 구문)

SCSS (Sassy CSS)

파일 확장자

.sass

.scss

문법 기반

들여쓰기

중괄호({})와 세미콜론(;)

호환성

기존 CSS와 직접 호환되지 않음

모든 유효한 CSS는 유효한 SCSS[2]

가독성

간결하지만 익숙하지 않을 수 있음

CSS 작성자에게 친숙함

믹스인 정의

=mixin-name과 +mixin-name 사용

@mixin과 @include 사용

현재는 SCSS 구문이 더 널리 채택되어 사실상의 표준으로 자리 잡았다. 대부분의 문서, 커뮤니티 자료, 그리고 빌드 도구의 기본 설정이 SCSS를 기준으로 한다. 따라서 새로운 프로젝트를 시작할 때는 SCSS 구문을 사용하는 것이 일반적이다. Sass 구문은 여전히 지원되지만, 레거시 프로젝트나 특정 선호도를 가진 경우를 제외하고는 사용 빈도가 낮다.

3.2. 설치 및 환경 설정

Sass를 사용하기 위해서는 Ruby 기반의 원래 구현체나, 현재 더 널리 쓰이는 Node.js 기반의 Dart Sass를 설치해야 한다. Dart Sass는 공식적인 구현체로, npm을 통해 쉽게 설치할 수 있다.

설치는 주로 npm이나 yarn 같은 패키지 관리자를 통해 이루어진다. 프로젝트의 로컬 의존성으로 설치하거나, 개발 작업을 위해 전역으로 설치할 수 있다. 설치 후에는 .scss 또는 .sass 확장자의 파일을 작성하고, Sass 컴파일러를 실행하여 일반 CSS 파일로 변환한다. 컴파일 명령은 sass input.scss output.css와 같은 형태이다.

개발 환경에서는 파일 변경을 감지하여 자동으로 컴파일해주는 --watch 플래그를 자주 사용한다. 또한, Webpack, Gulp, Grunt 같은 빌드 도구와 연동하거나, VS Code 등의 코드 편집기에서 확장 프로그램을 설치하여 통합 개발 환경을 구성하는 것이 일반적이다. 컴파일 시 출력 스타일(예: 압축된 compressed 형식)을 지정할 수도 있다.

설치 방법

명령어 (예시)

설명

npm을 통한 전역 설치

npm install -g sass

시스템 어디서나 sass 명령어 사용 가능

npm을 통한 프로젝트 설치

npm install sass --save-dev

프로젝트의 개발 의존성으로 설치

yarn을 통한 설치

yarn add sass --dev

yarn 패키지 관리자 사용

자동 컴파일 실행

sass --watch scss:css

scss 디렉토리의 파일 변경을 감지해 css 디렉토리로 컴파일

4. 핵심 기능

Sass는 CSS의 한계를 극복하고 코드의 재사용성과 유지보수성을 높이기 위해 여러 핵심 기능을 제공한다.

가장 기본적인 기능은 변수(Variables)이다. 색상, 폰트 스택, 여백 크기 등 자주 사용하는 값을 변수에 저장하여 전역적으로 관리할 수 있다. 이를 통해 일관된 디자인 시스템을 구축하고, 값 변경 시 한 곳만 수정하면 전체에 반영되도록 한다. 변수 이름은 $ 기호로 시작한다. 예를 들어 $primary-color: #333;과 같이 정의하고, color: $primary-color;와 같이 사용한다.

코드의 구조를 직관적으로 만들어주는 중첩(Nesting)과 재사용 가능한 코드 블록을 생성하는 믹스인(Mixins)이 자주 함께 사용된다. 중첩을 사용하면 CSS 선택자를 HTML 구조와 유사하게 계층적으로 작성할 수 있어 가독성이 향상된다. 믹스인은 스타일 선언 그룹을 정의하여, 인자를 받아 다양한 상황에 적용할 수 있는 함수와 같은 역할을 한다. 반복되는 벤더 프리픽스나 복잡한 그리드 레이아웃 코드를 믹스인으로 만들어 효율적으로 처리한다. 또한, 상속(Extend/Inheritance) 기능을 통해 한 선택자의 스타일을 다른 선택자가 공유하도록 할 수 있다. @extend 지시어를 사용하면 공통 스타일을 묶어 출력 CSS의 중복을 줄일 수 있다.

프로젝트의 규모가 커질수록 중요한 것이 모듈화이다. Sass는 Partials와 @import 또는 @use 지시어를 통해 이를 지원한다. Partials는 파일 이름 앞에 밑줄(예: _variables.scss)을 붙여 작성하는 별도의 Sass 파일로, 단독으로 CSS 파일로 컴파일되지 않는다. 이 파일들에 변수, 믹스인, 특정 컴포넌트 스타일 등을 분리 저장한 후, 메인 파일에서 @use 규칙으로 불러와 사용한다. @use는 최신 모듈 시스템으로, 변수와 믹스인의 유효 범위를 관리하고 이름 충돌을 방지하는 데 @import보다 유리하다[3].

기능

키워드/문법

주요 용도

변수

$variable-name: value;

색상, 폰트, 크기 등 공통 값 관리

중첩

선택자 내부에 다른 선택자 작성

계층적 구조 표현 및 가독성 향상

믹스인

@mixin name { ... } @include name;

재사용 가능한 스타일 블록, 인자 전달 가능

상속

@extend .class-name;

공통 스타일의 선택자 병합으로 코드 중복 감소

모듈화

_partial.scss, @use 'partial';

코드를 논리적 단위로 분리 및 관리

4.1. 변수(Variables)

변수는 Sass에서 값을 저장하고 재사용하기 위한 기본 기능이다. 변수를 사용하면 색상, 폰트 스택, 여백 크기 등 자주 사용하는 값을 한 곳에서 정의하고, 전체 스타일시트에서 참조할 수 있다. 이는 일관된 디자인 시스템을 유지하고, 나중에 값을 변경해야 할 때 한 번만 수정하면 되므로 유지보수성을 크게 향상시킨다.

변수는 달러 기호($)로 시작하며, 콜론(:)을 사용하여 값을 할당한다. 변수에 할당할 수 있는 값으로는 문자열, 숫자, 색상, 불리언, 리스트, 맵, null 등이 있다. 변수는 선언된 블록 내에서만 유효한 지역 범위를 가지며, !global 플래그를 사용하여 전역 변수로 만들 수 있다.

다음은 변수를 사용한 간단한 예시이다.

```scss

// 변수 정의

$primary-color: #333;

$font-stack: Helvetica, sans-serif;

$spacing-unit: 1rem;

// 변수 사용

body {

font-family: $font-stack;

color: $primary-color;

margin: $spacing-unit;

}

```

변수는 연산과 함께 사용될 수 있으며, 믹스인이나 함수의 매개변수로 전달하는 것도 가능하다. 또한, 변수 이름에 하이픈(-)과 언더스코어(_)는 서로 구분하지 않으므로 $main-color와 $main_color는 동일한 변수로 간주된다[4].

4.2. 중첩(Nesting)

중첩은 CSS 규칙을 HTML 요소의 계층 구조와 유사하게 작성할 수 있게 해주는 기능이다. 이를 통해 상위 선택자 내부에 하위 선택자를 포함시키는 방식으로 코드를 구성할 수 있다.

기본적인 사용법은 상위 선택자의 블록({}) 안에 하위 선택자를 작성하는 것이다. 이는 시각적 계층을 명확히 하고, 반복적으로 상위 선택자를 작성하는 번거로움을 줄여준다. 또한, 가상 클래스나 가상 요소도 동일한 방식으로 중첩하여 작성할 수 있다.

중첩 사용 예시 (SCSS)

컴파일된 CSS

.nav {

ul {

margin: 0;

li {

display: inline-block;

}

}

a {

color: blue;

&:hover {

text-decoration: underline;

}

}

}

.nav ul {

margin: 0;

}

.nav ul li {

display: inline-block;

}

.nav a {

color: blue;

}

.nav a:hover {

text-decoration: underline;

}

과도한 중첩은 불필요하게 복잡하고 특정도가 높은 CSS 선택자를 생성할 수 있어 유지보수를 어렵게 만든다. 일반적으로 3~4단계를 넘지 않는 중첩을 권장한다. & 기호는 부모 선택자를 참조하며, 주로 BEM 방법론과 같은 네이밍 규칙을 적용하거나, :hover, ::before 같은 상태와 요소를 연결할 때 유용하게 사용된다.

4.3. 믹스인(Mixins)

믹스인은 재사용 가능한 스타일 블록을 정의하여 프로젝트 전반에 걸쳐 포함하고 재사용할 수 있게 해주는 기능이다. 함수와 유사하게 매개변수를 받을 수 있어, 유연하게 스타일을 생성하고 반복 코드를 줄이는 데 핵심적인 역할을 한다. @mixin 지시어로 정의하고, @include 지시어로 호출하여 사용한다.

믹스인은 매개변수와 기본값 설정이 가능하며, 로직을 포함할 수 있다. 예를 들어, 벤더 프리픽스를 처리하거나 반응형 디자인의 미디어 쿼리를 간편하게 생성하는 데 자주 활용된다. 다음은 간단한 박스 그림자 믹스인의 예시이다.

```scss

@mixin box-shadow($x, $y, $blur, $color) {

-webkit-box-shadow: $x $y $blur $color;

-moz-box-shadow: $x $y $blur $color;

box-shadow: $x $y $blur $color;

}

.card {

@include box-shadow(0, 2px, 4px, rgba(0,0,0,.1));

}

```

믹스인과 상속(Extend/Inheritance) 기능은 코드 재사용 측면에서 유사하지만, 생성되는 CSS의 방식에서 차이가 있다. 믹스인은 호출된 곳마다 스타일 블록의 내용을 복사하여 출력하는 반면, @extend는 선택자들을 그룹화하여 출력한다. 이로 인해 믹스인은 매개변수를 통한 동적 스타일 생성에 유리하고, @extend는 정적으로 연관된 선택자들의 스타일을 통합할 때 유리하다. 과도한 믹스인 사용은 중복 코드를 증가시킬 수 있으므로, 상황에 맞게 선택하여 사용해야 한다.

4.4. 상속(Extend/Inheritance)

Sass의 상속 기능은 @extend 지시어를 사용하여 한 선택자의 스타일을 다른 선택자가 그대로 물려받도록 한다. 이는 객체 지향 프로그래밍의 상속 개념과 유사하며, 코드의 재사용성을 높이고 중복을 줄이는 데 목적이 있다.

@extend는 공통된 스타일을 가진 클래스나 플레이스홀더 선택자(예: %message-shared)를 정의한 후, 다른 선택자에서 이를 확장하여 사용한다. 예를 들어, .message 클래스의 기본 스타일을 .success, .warning, .error 클래스가 상속받도록 할 수 있다. 이때 Sass는 컴파일 과정에서 이 선택자들을 그룹화하여 최적화된 CSS를 생성한다. 결과적으로 동일한 스타일 규칙을 공유하는 선택자들이 콤마로 구분된 하나의 그룹으로 출력되어, 최종 CSS 파일의 용량이 줄어드는 장점이 있다.

기능

설명

예시 코드

클래스 상속

기존 클래스의 모든 스타일을 상속받는다.

.error { @extend .message; }

플레이스홀더 상속

%로 시작하는 플레이스홀더 선택자는 컴파일 후 CSS에 나타나지 않으며, 오직 확장을 위한 용도로 사용된다.

%alert { color: red; }

.error { @extend %alert; }

연속 확장

한 선택자가 다른 선택자를 확장하고, 그 선택자를 다시 다른 선택자가 확장하는 것이 가능하다.

.a { ... }

.b { @extend .a; }

.c { @extend .b; }

그러나 @extend는 주의해서 사용해야 한다. 무분별한 상속은 의도하지 않은 선택자 그룹화를 초래하여 CSS의 특이성을 복잡하게 만들거나, 소스 코드에서 상속 관계를 추적하기 어렵게 만든다. 또한, 미디어 쿼리 블록 내부에서 외부 선택자를 확장하는 것은 제한된다. 이러한 이유로 많은 실무 가이드에서는 재사용이 필요한 스타일 블록은 @extend보다 믹스인(Mixins)을 사용하도록 권장한다. 믹스인은 인자를 받을 수 있고, 출력 위치를 더 명확하게 제어할 수 있기 때문이다.

4.5. 모듈화(Partials와 @import/@use)

Sass의 모듈화는 코드를 논리적 단위로 분리하고 재사용성을 높이는 핵심 기능이다. 이를 위해 _(언더스코어)로 시작하는 파일명을 가진 Partial 파일과 이를 불러오는 @import 또는 @use 규칙을 사용한다. Partial 파일은 단독으로 CSS 파일로 컴파일되지 않으며, 주로 변수, 믹스인, 함수 또는 특정 컴포넌트의 스타일을 독립적으로 관리하기 위해 작성된다. 예를 들어, _variables.scss, _mixins.scss, _buttons.scss와 같은 파일을 생성하고 메인 Sass 파일에서 불러와 사용한다.

초기에는 @import 지시어가 모듈을 불러오는 표준 방식이었다. 그러나 @import는 전역 네임스페이스를 오염시키고, 변수나 믹스인의 중복 로드 및 의존성 관리 문제를 일으킬 수 있다는 단점이 있다. 이를 해결하기 위해 도입된 @use 규칙은 더 엄격하고 모듈화된 시스템을 제공한다. @use를 사용하면 불러온 모듈의 변수, 믹스인, 함수는 해당 모듈의 네임스페이스를 통해 접근해야 하며, 명시적으로 공개(@forward)하지 않은 멤버는 외부에서 사용할 수 없다.

@import와 @use의 주요 차이점은 다음과 같다.

특성

@import

@use

네임스페이스

모든 것이 전역으로 로드되어 충돌 가능성 높음

모듈별로 격리된 네임스페이스를 가짐 (예: namespace.variable)

멤버 접근

직접 접근 가능

네임스페이스를 통하거나 @use "module" as *로 전역 로드 가능

중복 로드

같은 파일을 여러 번 불러올 수 있음

같은 모듈은 한 번만 로드됨

사용 권장

레거시 방식, 점차 권장되지 않음

현대적인 방식, 새로운 프로젝트의 표준

모듈화의 실무 적용은 프로젝트 구조 설계의 기초가 된다. 일반적으로 base/, components/, layout/, utils/ 등의 디렉터리를 만들고, 각각에 해당하는 Partial 파일(_reset.scss, _grid.scss, _buttons.scss 등)을 구성한다. 메인 파일(예: main.scss)에서는 @use 규칙을 사용해 이러한 모듈들을 계층적으로 불러온다. 이 방식은 코드의 유지보수성을 크게 향상시키고, 팀 협업 시 스타일 시트의 의존성과 범위를 명확하게 정의하는 데 도움을 준다.

5. 다른 Pre-processors 비교

Sass 외에도 널리 사용되는 CSS 전처리기로는 Less와 Stylus가 있다. 이들은 모두 변수, 중첩, 믹스인 등의 핵심 기능을 제공하지만, 문법과 철학, 특정 기능에서 차이점을 보인다.

특성

Less

Stylus

문법

CSS 문법과 가장 유사하며, 중괄호({})와 세미콜론(;)을 사용한다.

가장 유연한 문법을 제공한다. 중괄호, 세미콜론, 콜론(:)을 생략할 수 있어 간결한 코드 작성이 가능하다.

실행 환경

주로 Node.js 환경에서 동작하지만, 클라이언트 사이드에서도 직접 실행할 수 있다[5].

Node.js에 의존한다.

커뮤니티 및 확장성

특히 부트스트랩 (프론트엔드 프레임워크)의 초기 버전이 Less로 작성되며 널리 알려졌다. 플러그인 생태계는 Sass나 Stylus에 비해 상대적으로 작은 편이다.

강력한 내장 함수와 조건문, 반복문을 제공하며, 사용자 정의 함수 작성이 매우 자유롭다. 유연성이 가장 큰 장점이다.

주요 특징

JavaScript로 작성되어 접근성이 좋았으며, @import를 통한 의존성 관리가 가능하다.

들여쓰기 기반의 문법을 옵션으로 지원하며, 변수 이름에 $나 @ 같은 접두사가 필요 없다.

세 전처리기는 모두 CSS의 작성 효율성을 높이는 공통 목표를 공유한다. 선택은 프로젝트의 요구사항, 팀의熟悉度, 통합하려는 빌드 도구의 생태계에 따라 달라진다. Sass가 가장 널리 채택되어 활발한 커뮤니티와 프레임워크 지원을 받는 반면, Less는 기존 CSS 지식으로의 진입 장벽이 가장 낮고, Stylus는 문법적 자유도와 표현력에서 강점을 보인다.

5.1. Less

Less는 Sass와 함께 가장 널리 사용되는 CSS 전처리기 중 하나이다. 2009년에 Alexis Sellier가 Ruby on Rails 프레임워크와의 통합을 위해 개발했으며, 이후 Node.js 기반의 자바스크립트 엔진으로 재작성되어 보다 가볍고 빠른 처리가 가능해졌다.

Less의 문법은 기존 CSS 문법과 매우 유사하며, 학습 곡선이 낮은 것이 특징이다. Sass와 달리 중괄호({})와 세미콜론(;)을 사용하는 표준 CSS 문법을 그대로 따르기 때문에, 기존 CSS 파일을 .less 확장자로 변경하는 것만으로도 즉시 전처리기 파일로 사용할 수 있다. 주요 기능으로는 변수, 중첩, 믹스인, 연산, 함수 등이 있으며, 이는 Sass가 제공하는 핵심 기능과 거의 동일하다.

특징

설명

실행 환경

주로 Node.js 환경에서 동작한다. 클라이언트 사이드에서도 동작 가능하지만, 성능상 서버 사이드 컴파일이 권장된다.

문법

표준 CSS 문법을 확장한 형태로, Sass의 SCSS 문법과 매우 유사하다.

커뮤니티 & 생태계

초기에 큰 인기를 끌었으나, 현재는 Sass에 비해 생태계와 최신 기능 도입 속도에서 다소 뒤쳐지는 편이다.

주요 도구

공식 컴파일러인 less.js 외에도, Gulp용 gulp-less, Webpack용 less-loader 등 다양한 빌드 도구 플러그인이 존재한다.

Less는 특히 부트스트랩 (프론트엔드 프레임워크)의 공식 스타일시트 언어로 채택되면서 널리 알려지게 되었다. 부트스트랩 3과 4는 Less로 작성되었으며, 이를 통해 테마 변수 수정과 컴포넌트 스타일 확장이 용이해졌다. 그러나 부트스트랩 5부터는 공식 CSS 전처리기가 Sass로 변경되었다.

5.2. Stylus

Stylus는 Node.js 환경에서 동작하는 CSS 전처리기로, 2010년 TJ Holowaychuk에 의해 처음 공개되었다. 유연한 문법이 가장 큰 특징으로, 괄호, 세미콜론, 콜론을 모두 생략할 수 있어 코드가 매우 간결해진다. 이는 기존 CSS 문법과 완전히 호환되면서도, 선택적으로 간소화된 문법을 사용할 수 있도록 설계되었다.

주요 기능 면에서는 Sass나 Less와 유사하게 변수, 중첩, 믹스인, 함수, 조건문, 반복문 등을 지원한다. 특히 내장 함수가 풍부하고, JavaScript와의 연동이 용이하여 동적인 스타일을 생성하는 데 강점을 보인다. 예를 들어, JavaScript 라이브러리의 값을 스타일시트에서 직접 참조하거나 연산에 활용할 수 있다.

다른 전처리기와의 비교에서 Stylus는 문법의 자유도가 매우 높다는 점이 두드러진다. 다음은 간단한 문법 비교 예시이다.

기능

Stylus (간소화 문법)

SCSS

변수 정의

primary-color = #333

$primary-color: #333;

중첩 규칙

.box

width 100px

.box {

width: 100px;

}

믹스인 정의

border-radius(n)

-webkit-border-radius n

border-radius n

@mixin border-radius($n) {

-webkit-border-radius: $n;

border-radius: $n;

}

그러나 이러한 높은 자유도는 프로젝트 내 코드 일관성을 유지하기 어렵게 만들 수 있으며, 특히 여러 개발자가 협업하는 환경에서는 단점으로 작용할 수 있다. 또한, 생태계와 커뮤니티의 규모가 Sass에 비해 상대적으로 작아 학습 자료나 서드파티 도구의 다양성이 부족한 편이다.

6. PostCSS와의 관계

PostCSS는 CSS 변환 도구로, JavaScript 플러그인을 사용하여 CSS를 처리한다. Sass와 같은 전통적인 CSS 전처리기가 고유 문법을 제공하는 것과 달리, PostCSS는 플러그인 생태계를 통해 다양한 기능을 추가할 수 있는 플랫폼 역할을 한다. PostCSS 자체는 CSS를 파싱하여 플러그인이 조작할 수 있는 추상 구문 트리로 변환하고, 그 결과를 다시 CSS로 출력하는 엔진에 가깝다.

PostCSS의 주요 플러그인은 다음과 같은 영역에서 활용된다.

플러그인 유형

대표적 예시

주요 기능

호환성 처리

Autoprefixer

벤더 접두어를 자동으로 추가한다.

최신 문법 변환

postcss-preset-env

차세대 CSS 문법을 호환 가능한 형태로 변환한다.

코드 최적화

cssnano

CSS 파일을 압축하고 최적화한다.

코드 검사

stylelint

CSS 코드의 오류나 스타일 가이드 위반을 검사한다.

이러한 특성 때문에 PostCSS와 Sass의 관계는 대체가 아닌 보완 및 협업으로 이해된다. 현대 프론트엔드 개발에서는 Sass로 변수, 중첩, 믹스인 등을 활용해 CSS를 작성한 후, PostCSS와 Autoprefixer 등을 통해 브라우저 호환성 처리를 자동화하는 구성이 일반적이다. 또한, postcss-preset-env 플러그인은 Sass의 일부 기능(예: 변수)을 순수 CSS 문법(CSS 사용자 정의 속성)으로 대체할 수 있는 가능성을 열어주었다.

결론적으로, Sass는 개발자에게 풍부한 작성 기능을 제공하는 작성 도구라면, PostCSS는 작성된 CSS를 변환하고 최적화하는 처리 도구의 성격이 강하다. 두 기술은 함께 사용되어 더 견고하고 효율적인 스타일시트 개발 워크플로를 구성하는 핵심 요소가 되었다.

7. 실무 활용 패턴

실무에서 Sass를 효과적으로 활용하기 위해서는 일관된 프로젝트 구조 설계와 자동화 빌드 도구와의 연동이 필수적이다.

프로젝트 구조 설계

일반적인 Sass 프로젝트는 기능과 역할에 따라 파일을 분리하여 관리한다. 핵심 구조는 다음과 같다.

  • abstracts/: 프로젝트 전반에서 사용되는 변수(Variables), 믹스인(Mixins), 함수, 플레이스홀더 선택자 등을 모아둔 추상화 레이어다.

  • base/: 프로젝트의 기초 스타일을 정의한다. CSS 리셋, 타이포그래피 기본 설정, 애니메이션 키프레임 등이 위치한다.

  • components/ (또는 modules/): 버튼, 카드, 네비게이션 바와 같이 재사용 가능한 UI 컴포넌트의 스타일을 개별 파일로 관리한다.

  • layout/: 헤더, 푸터, 사이드바, 그리드 시스템 등 사이트의 주요 레이아웃을 구성하는 스타일을 담는다.

  • pages/: 특정 페이지에만 적용되는 고유한 스타일을 관리한다. 홈페이지나 연락처 페이지 등이 해당된다.

  • themes/: 다크 모드나 기타 테마 관련 스타일을 별도로 관리할 때 사용한다.

  • vendors/: 부트스트랩(Bootstrap)이나 jQuery UI 같은 외부 라이브러리나 프레임워크의 스타일시트를 오버라이드하거나 보완하는 파일을 둔다.

  • main.scss: 최종적으로 컴파일될 메인 파일이다. 위의 모든 디렉터리에서 필요한 부분 파일(Partials)을 @use나 @forward 규칙을 사용하여 불러온다.

이러한 구조는 SMACSS나 ITCSS 같은 방법론을 참고하여 프로젝트 규모와 팀의 컨벤션에 맞게 변형하여 적용한다.

자동화 빌드 도구 연동

Sass 파일을 CSS로 변환하고 최적화하는 과정은 대부분 자동화 빌드 도구를 통해 처리된다. Node.js 환경에서는 npm이나 Yarn을 통해 공식 Sass 컴파일러(sass)를 설치하고, 이를 스크립트(Script)로 실행할 수 있다.

```bash

npm install sass --save-dev

```

```json

// package.json

{

"scripts": {

"sass:watch": "sass --watch scss:css",

"sass:build": "sass scss/main.scss css/style.css --style=compressed"

}

}

```

보다 복잡한 프론트엔드 빌드 파이프라인에서는 웹팩(Webpack), Gulp, Parcel 같은 번들러나 태스크 러너와 연동한다. 예를 들어, 웹팩에서는 sass-loader를 사용하여 Sass 파일을 모듈로 불러오고, PostCSS의 Autoprefixer 같은 플러그인을 함께 적용하여 벤더 프리픽스를 자동으로 추가하는 것이 일반적이다. 이러한 설정은 개발 중에는 소스 맵을 생성하여 디버깅을 용이하게 하고, 프로덕션 빌드 시에는 코드를 최소화하고 압축한다.

7.1. 프로젝트 구조 설계

Sass 프로젝트의 구조 설계는 코드의 재사용성, 유지보수성, 확장성을 높이는 핵심 요소이다. 일반적으로 기능이나 역할에 따라 파일을 분리하고, partials를 활용하여 모듈화하는 방식을 채택한다.

기본적인 프로젝트 구조는 다음과 같은 디렉토리와 파일로 구성된다.

디렉토리/파일

설명

abstracts/ (또는 utils/)

프로젝트 전반에서 사용되는 변수(Variables), 믹스인(Mixins), 함수, 플레이스홀더 등을 정의한다. 색상, 폰트, 그리드 시스템 등의 설정이 여기에 포함된다.

base/

프로젝트의 기초 스타일을 정의한다. CSS Reset이나 Normalize.css, 타이포그래피 기본 스타일, 박스 모델 설정, 애니메이션 키프레임 등이 위치한다.

components/ (또는 modules/)

재사용 가능한 UI 컴포넌트 단위로 스타일을 분리한다. 버튼, 카드, 네비게이션 바, 모달 등의 스타일 시트가 이 디렉토리에 저장된다.

layout/

사이트의 주요 레이아웃 구성 요소를 위한 스타일을 담는다. 헤더, 푸터, 사이드바, 그리드 시스템 등 페이지의 구조를 정의하는 부분이 해당한다.

pages/

특정 페이지에만 적용되는 고유한 스타일을 관리한다. 홈페이지, 상품 상세 페이지, 문의 페이지 등 페이지별 차이가 있는 스타일을 여기에 작성한다.

themes/

다중 테마(예: 다크 모드)를 지원하는 경우, 테마별 변수와 스타일 오버라이드를 정의한다.

vendors/

서드파티 라이브러리(Bootstrap, Font Awesome 등)의 CSS/Sass 파일을 오버라이드하거나 포함시킬 때 사용한다.

main.scss (또는 app.scss)

최종적으로 컴파일될 메인 파일이다. 위의 모든 partial 파일들을 @use 규칙을 사용하여 적절한 순서로 불러온다[6].

이러한 구조는 7-1 패턴(7개의 폴더와 1개의 메인 파일)으로 잘 알려져 있으며, 프로젝트 규모와 요구사항에 따라 디렉토리를 추가하거나 통합하여 유연하게 적용할 수 있다. 설계의 핵심은 스타일시트를 논리적으로 분리함으로써 특정 스타일을 찾고 수정하기 쉽게 하며, 팀 협업 시 충돌을 최소화하는 데 있다.

7.2. 자동화 빌드 도구 연동

Sass와 같은 CSS Pre-processor를 실무에서 효율적으로 사용하려면 자동화 빌드 도구와의 연동이 필수적이다. 개발 과정에서 Sass 파일(.scss 또는 .sass)을 작성하면, 빌드 도구가 이를 표준 CSS 파일로 변환(컴파일)하고, 추가적인 최적화 작업을 수행한다. 이러한 자동화는 개발 생산성을 크게 향상시키며, 최종 산출물의 품질을 보장한다.

주요 빌드 도구와의 연동 방법은 다음과 같다.

도구

설명

주요 패키지/플러그인

Node.js (npm scripts)

npm 스크립트를 통해 명령어를 정의하고, node-sass나 공식 sass 패키지를 사용해 컴파일한다.

sass, node-sass

Webpack

모듈 번들러로, sass-loader를 사용하여 Sass 파일을 CSS로 변환하고, css-loader, MiniCssExtractPlugin 등과 조합한다.

sass-loader, css-loader

Gulp

작업 자동화 도구로, gulp-sass 플러그인을 통해 Sass 컴파일을 스트림 기반으로 처리한다.

gulp-sass

Vite / Parcel

최신 번들러로, 별도의 복잡한 설정 없이 기본적으로 Sass 파일을 지원한다.

내장 지원

일반적인 워크플로우는 소스 코드 변경을 감지(watch)하여 자동으로 컴파일을 수행하고, 필요에 따라 CSS 최소화나 Autoprefixer를 통한 벤더 프리픽스 자동 추가 등의 후처리 과정을 포함한다. 예를 들어, Webpack 개발 서버와 연동하면 실시간으로 변경 사항을 브라우저에 반영하는 핫 리로딩이 가능해진다. 또한, PostCSS와 함께 사용하는 경우가 많아, Sass 컴파일 후 PostCSS 플러그인을 통해 더욱 정교한 변환과 최적화를 진행한다.

8. 장단점

Sass와 같은 CSS 전처리기는 강력한 기능을 제공하지만, 사용 시 고려해야 할 명확한 장점과 단점이 존재한다.

주요 장점은 CSS의 유지보수성과 개발 효율성을 크게 향상시킨다는 점이다. 변수를 사용하면 색상, 폰트 크기 등 공통 값을 한 곳에서 관리할 수 있어 일관성을 유지하고 전역 수정을 용이하게 한다. 중첩 문법은 선택자의 계층 구조를 시각적으로 명확하게 표현하여 코드 가독성을 높인다. 믹스인과 상속 기능은 반복되는 코드 패턴을 재사용 가능한 단위로 추상화함으로써 코드의 양을 줄이고 논리적 구조를 개선한다. 또한, 모듈화를 통해 스타일시트를 여러 파일로 분리하고 관리할 수 있어 대규모 프로젝트에서 협업과 구조 설계에 유리하다.

반면, 몇 가지 단점도 존재한다. 가장 큰 문제는 전처리기 자체에 대한 학습 곡선이 있다는 점이다. 새로운 문법과 도구를 익혀야 하며, 특히 복잡한 믹스인이나 함수를 남용하면 오히려 디버깅이 어려워질 수 있다. 또한, Sass나 Less 코드는 브라우저가 직접 해석할 수 없으므로 반드시 표준 CSS로 컴파일하는 빌드 단계가 필요하다. 이는 개발 환경 설정을 복잡하게 만들고, 컴파일 시간이 프로젝트 규모에 따라 증가할 수 있다. 때로는 과도한 중첩으로 인해 불필요하게 복잡하고 과도한 선택자 가중치를 가진 CSS가 생성될 위험도 있다.

장점

단점

변수, 믹스인 등을 통한 코드 재사용성 및 유지보수성 향상

새로운 문법과 도구에 대한 학습 필요

중첩 구조로 인한 코드 가독성 향상

표준 CSS로의 컴파일 단계 필요 (빌드 과정 복잡화)

모듈화를 통한 체계적인 프로젝트 구조 관리 가능

컴파일 시간 발생 및 디버깅 어려움 가능성

논리적 연산, 함수 등 프로그래밍적 기능 제공

과도한 중첩 사용 시 비효율적인 CSS 출력 가능

결론적으로, Sass의 도입은 프로젝트의 규모와 복잡도, 개발 팀의 숙련도에 따라 그 이점이 달라진다. 소규모 단순 프로젝트에서는 오버헤드가 될 수 있지만, 체계적인 설계와 관리가 필요한 대규모 프로젝트에서는 생산성과 유지보수성 측면에서 확실한 가치를 제공한다.

9. 관련 문서

  • MDN Web Docs - Sass

  • Sass 공식 홈페이지

  • Wikipedia - Sass (stylesheet language)

  • 나무위키 - Sass(전처리기)

  • Wikipedia - CSS 전처리기

  • Less 공식 홈페이지

  • Stylus 공식 홈페이지

  • Google Scholar - CSS preprocessors

리비전 정보

버전r1
수정일2026.02.13 22:17
편집자unisquads
편집 요약AI 자동 생성