프론트엔드/CSS

[CSS] SCSS @extend @mixin 차이점(GPT4.0)

순코딩 2024. 8. 26. 16:13

`@extend`와 `@mixin`은 SCSS에서 스타일을 재사용하기 위한 두 가지 주요 방법입니다. 이 두 가지 방법은 스타일 코드의 유지보수와 재사용성을 높여주지만, 각각의 사용 방식과 성능에 차이가 있습니다. 아래에서 두 방법의 실제 성능 차이와 사용상의 장단점을 비교해 보겠습니다.

### 1. **`@extend`의 특성 및 성능**

`@extend`는 선택자 간에 **스타일을 공유**하도록 해줍니다. 이를 통해 중복 코드를 제거할 수 있지만, **CSS의 구조**에 영향을 미칩니다.

- **장점**:
  - **코드 중복 제거**: 여러 클래스가 동일한 스타일을 공유할 때 중복된 스타일 정의를 피할 수 있습니다.
  - **간결한 코드**: `@extend`를 사용하면 특정 스타일을 다른 셀렉터에 간단하게 상속할 수 있으므로 코드가 짧아집니다.

- **단점**:
  - **전역 스타일 충돌 가능성**: `@extend`는 스타일이 **CSS 규칙**으로 병합되기 때문에, 선택자가 예상치 못한 방식으로 결합될 수 있습니다. 예를 들어, 여러 클래스에 동일한 스타일을 상속할 때, SCSS가 이를 효율적으로 병합하지만, 결과적으로 모든 클래스가 결합된 CSS 규칙이 생성될 수 있습니다. 이로 인해 **의도치 않은 스타일링 충돌**이 발생할 수 있습니다.
  - **CSS 출력량 증가**: 많은 셀렉터에서 `@extend`를 사용할 경우, SCSS가 병합된 결과로 더 많은 CSS 코드가 생성될 수 있습니다. 특히 큰 프로젝트에서는 **CSS 출력량이 크게 증가**할 수 있습니다.
  - **조작 어려움**: `@extend`는 기존 스타일과 연관되어 병합되므로, 나중에 특정 클래스의 스타일을 수정하거나 제거할 때 예기치 않은 영향을 미칠 수 있습니다.

.base {
  color: red;
}

.header {
  @extend .base;
}

.footer {
  @extend .base;
}



이 경우, 출력된 CSS는 다음과 같습니다:

.base, .header, .footer {
  color: red;
}



위와 같이 여러 선택자가 하나의 CSS 규칙으로 병합됩니다. 병합된 규칙이 많아질수록 예상치 못한 스타일 충돌이 발생할 수 있습니다.

### 2. **믹스인의 특성 및 성능**

믹스인(`@mixin`)은 **재사용 가능한 스타일 블록**을 정의하고, 이를 여러 셀렉터에서 호출할 수 있는 기능을 제공합니다. 믹스인은 **매개변수**를 받아서 동적으로 스타일을 적용할 수도 있습니다.

- **장점**:
  - **유연성**: 믹스인은 **매개변수**를 받을 수 있어 스타일을 동적으로 커스터마이즈할 수 있습니다. 이는 다양한 변형 스타일이 필요할 때 매우 유용합니다.
  - **독립적인 스타일 적용**: 각 셀렉터에서 믹스인을 호출할 때마다 해당 스타일 블록이 독립적으로 추가되므로, **충돌 가능성이 적습니다**. 전역 스타일링 문제를 피할 수 있습니다.
  - **더 적은 영향 범위**: 믹스인은 하나의 CSS 규칙에 여러 셀렉터를 병합하지 않기 때문에, 특정 스타일의 적용 범위가 **독립적**으로 유지됩니다.

- **단점**:
  - **CSS 출력 증가**: 믹스인을 사용할 때마다 해당 스타일 블록이 **반복적으로 출력**되므로, 동일한 스타일을 여러 요소에 적용할 때 CSS 출력량이 증가할 수 있습니다. 즉, 스타일이 중복되어 출력되므로 파일 크기가 커질 수 있습니다.
  - **명시적 호출 필요**: `@extend`처럼 단순하게 상속하는 방식이 아니므로, 각 셀렉터에서 명시적으로 믹스인을 호출해야 합니다.

#### 예시:

@mixin base {
  color: red;
}

.header {
  @include base;
}

.footer {
  @include base;
}


이 경우, 출력된 CSS는 다음과 같습니다:

.header {
  color: red;
}

.footer {
  color: red;
}



믹스인을 호출할 때마다 독립된 스타일 규칙이 추가됩니다. 따라서 `@extend`와 달리 각 셀렉터는 자신의 고유한 스타일 블록을 갖습니다.

### 3. **실제 성능 차이**
- **파일 크기**:
  - `@extend`는 **하나의 CSS 규칙**으로 여러 셀렉터를 결합하기 때문에 CSS 파일 크기를 줄일 수 있습니다. 그러나, 대규모 프로젝트에서는 **예상치 못한 결합**으로 인해 스타일 충돌 가능성이 존재합니다.
  - 믹스인은 **각 호출마다 새로운 스타일 규칙**을 생성하므로, 동일한 스타일이 여러 번 반복되어 **CSS 파일 크기가 커질 수 있습니다**.

- **스타일 충돌**:
  - `@extend`는 병합된 규칙으로 인해 **스타일 충돌**이 발생할 수 있습니다. 특히, 확장된 클래스가 많아질수록 관리하기 어려워질 수 있습니다.
  - 믹스인은 독립적으로 스타일을 적용하기 때문에 **스타일 충돌이 발생할 가능성이 적습니다**.

- **사용의 유연성**:
  - `@extend`는 단순한 상속이기 때문에 **복잡한 스타일링 로직에는 적합하지 않습니다**.
  - 믹스인은 **매개변수**를 받아서 동적으로 스타일을 적용할 수 있으므로, **더 복잡한 스타일링 로직**을 처리할 수 있습니다.

### 4. **언제 무엇을 사용해야 하는가?**
- **작고 단순한 프로젝트**: 클래스 간의 상속이 명확하고 스타일 충돌 가능성이 낮다면, `@extend`를 사용해 코드 중복을 줄일 수 있습니다. 이 방식은 CSS 파일 크기를 줄이는 데 효과적일 수 있습니다.
  
- **큰 규모의 프로젝트**: 복잡한 스타일링 로직이 필요하고, 클래스 간의 스타일 충돌을 피해야 한다면, 믹스인을 사용하는 것이 더 안전합니다. 믹스인은 스타일을 컴포넌트화하고, 각 요소에 독립적으로 적용할 수 있어 유지보수가 쉽습니다.

### 결론:
- **`@extend`**: 작은 프로젝트나 단순한 상속 관계에서는 유용하지만, 대규모 프로젝트에서는 스타일 충돌을 일으킬 수 있습니다. CSS 출력량은 줄어들 수 있으나, 전역 규칙이 결합되는 특성으로 인해 조작이 어려울 수 있습니다.
  
- **믹스인**: 더 유연하고 독립적인 스타일링을 제공합니다. 스타일 충돌을 방지할 수 있지만, CSS 출력량이 증가할 수 있습니다. 복잡한 스타일링 로직을 다룰 때는 믹스인이 더 적합합니다.

**a.** 믹스인에서 매개변수를 사용하여 동적인 스타일링을 적용하는 방법을 알고 싶으신가요?
**b.** 프로젝트에서 `@extend`를 사용해야 하는 구체적인 상황에 대해 더 알고 싶으신가요?