귀여운 눈높이에서 작성된, 🐰

하루 한 걸음씩, 성장 하는 중 입니다 🫶🏻

Studying/React

리액트 공부하기 - 스타일링 파트 1. SCSS (SASS)

creamymood 2025. 4. 15. 16:21


리액트 + SCSS 꼭 알아야 할 개념 정리

1. SCSS란?

  • Sass의 확장 문법 (SASS 3버전에서 등장한 최신버전)
  • 기존 CSS보다 더 효율적으로 스타일을 작성할 수 있게 해주는 CSS 전처리기
  • .scss 확장자를 사용
  • 변수, 중첩, 믹스인, 함수 등 다양한 기능 제공

scss와 sass 차이

 

2. 리액트 프로젝트에 SCSS 적용 방법

  • sass 패키지 설치
npm install sass
  • SCSS 파일 생성: App.scss
  • 컴포넌트에서 가져오기
import './App.scss';

 

확장자도 이렇게 변경 해야 한다.

 

3. SCSS 주요 문법

개념 설명 예시

변수 반복되는 값 관리 $primary-color: #333;
중첩 계층적인 구조 표현 nav { ul { li { } } }
믹스인 코드 재사용 가능 @mixin flex-center { display: flex; justify-content: center; }
확장 스타일 상속 @extend .btn
함수 계산 또는 동적 값 처리 가능 lighten($color, 20%)

리액트 + SCSS 꿀 기능

 


❶변수 ($)

공통된 부분을 변수로 만들어두고, 사용

가독성도 좋아지고, 재 사용성도 좋아진다.

 


 

❷중첩 (중요 ! 중요! )

정말 편한 기능이 맞는 것 같다.

가독성도 좋아지고, html 구조 파악도 용이하다.

 

 

❸ 믹스인 (@mixin, @include)

아예 코드가 같을 떄

 

 

코드가 다른 경우. 인자를 받아서 사용할 수 있다.

 


 실무에서 자주 쓰이는 SCSS + React 개념

1. 컴포넌트 단위 SCSS 파일 관리

컴포넌트마다 별도의 SCSS 파일을 만들어 관리
📁 예:

components/
 └─ Button/
     ├─ Button.jsx
     ├─ Button.scss

2. SCSS 모듈화 (CSS Module)

클래스명이 충돌하지 않게 하기 위해 SCSS Module 사용
파일명: Button.module.scss
사용:

import styles from './Button.module.scss';

function Button() {
  return <button className={styles.btn}>버튼</button>;
}

3. 전역 스타일 관리 (Global SCSS)

  • src/styles/_variables.scss, _mixin.scss 같은 파일을 만들어 공통 관리
  • @use 또는 @import로 가져오기
@use 'styles/variables';

4. SCSS 변수와 믹스인 활용

  • 컬러, 폰트사이즈, 반응형 브레이크포인트를 변수로 선언
  • 자주 쓰이는 스타일 묶음은 믹스인으로 재사용

실무 꿀팁

 팁 1: SCSS 변수를 테마처럼 활용하기
컬러 팔레트, 폰트 크기, 간격을 변수로 정리해두면 유지보수가 훨씬 쉬워져요.

$primary-color: #3498db;
$font-size-lg: 18px;

팁 2: 공통 믹스인 파일 만들어두기 반복되는 스타일은 믹스인으로 정리하면 생산성이 급상승!

@mixin flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

팁 3: SCSS 모듈화를 적극 활용 클래스명 충돌을 막고, 유지보수성을 높이려면 CSS Module 방식을 쓰는 게 좋아요.

팁 4: 전역 SCSS 따로 관리 공통 스타일과 변수를 한 곳에 모아두고 index.scss에서 한 번에 불러와 사용하는 것이 효율적!

 팁 5: 반응형을 SCSS 변수로 정리 미디어 쿼리를 변수로 관리하면 유지보수가 쉬워져요.

$tablet: 768px;

@media (max-width: $tablet) {
  // 스타일
}

 


정리

구분 핵심 개념

SCSS 설치 및 연결 npm install sass, import 사용
SCSS 주요 문법 변수, 중첩, 믹스인, 확장, 함수
SCSS 모듈화 .module.scss 파일과 import styles from
공통 파일 관리 _variables.scss, _mixin.scss
실무 팁 전역 변수, 믹스인, CSS 모듈화, 반응형 변수화

 

 

 


변수와 믹스인 차이 ?

-  SCSS 변수 ($)

→ 정의

$primary-color: #ff6347;
$padding-large: 20px;

(색상, 크기 등)을 저장해두고, 여러 곳에서 재사용하는 거야

 

 사용 예시

.button {
  background-color: $primary-color;
  padding: $padding-large;
}

✓ 특징

❶그냥 값을 저장하는 거야.

❷스타일을 반복해서 쓸 때 편해.

 

 

-  SCSS 믹스인 (@mixin)

→정의

@mixin button-style($bg-color, $padding) {
  background-color: $bg-color;
  padding: $padding;
  border-radius: 8px;
  color: #fff;
}

스타일 블록을 정의해두고, 나중에 호출해서 적용하는 거야

 

 사용 예시

.button-primary {
  @include button-style($primary-color, 20px);
}

.button-secondary {
  @include button-style(#ccc, 15px);
}

✓ 특징

❶스타일 덩어리(코드 묶음)**를 재사용할 때 좋아.

❷파라미터(인자)**를 넣어서 상황에 따라 다르게 적용 가능.

 

 둘의 차이 한 줄 요약

  • 변수: 값을 저장
  • 믹스인: 스타일 블록(코드 묶음)을 재사용

 

뭔가 변수는 짧막한 저장용 이라면

믹스인은 스타일링 컴포넌트 또는 함수 같은 느낌이 ! ! 들어 !

 

 

 

 

와 — 진짜 감 좋은데! 거의 맞았어.
조금만 더 정리해주면 이렇게 설명할 수 있을 것 같아.


 변수랑 믹스인의 느낌을 비유해보면

 

SCSS 변수  SCSS 믹스인
짧고 간단한 (숫자, 색상, 크기 등) 여러 줄의 스타일 묶음
컴포넌트의 props 값 같은 느낌 컴포넌트 함수 같은 느낌

 

예를 들어서

 

아래는 변수

const buttonColor = "tomato"; // 변수 (짧고 단순 값)

 

function ButtonStyle(bgColor, padding) { 
  return (
    {
      backgroundColor: bgColor,
      padding: padding,
      borderRadius: "8px"
    }
  );
}

이 함수는 스타일 덩어리(= 믹스인) 같은 거지.

 

 

결론

  • 변수: 짧고 단순한 값 저장용
  • 믹스인: 스타일을 컴포넌트처럼 재사용할 수 있는 묶음

네가 말한 것처럼 믹스인이 컴포넌트 느낌함수 느낌 맞아 !
특히 파라미터까지 받을 수 있으니까 더더욱 그래.


 

mixin은 기본 공통 스타일 틀을 잡아두고,
상황마다 달라질 부분만 인자로 넘겨서 그 값만 바꿔주는 것이다.


 

믹스인에서 인자의 순서 중요하지 ?!



응!! 정확해 — 믹스인은 정의할 때 정한 인자 순서대로 써야 해.
딱 함수 쓸 때랑 똑같다고 보면 돼.

예를 들어서 ▾

💬 믹스인 정의

@mixin button-style($bg-color, $padding, $radius) {
  background-color: $bg-color;
  padding: $padding;
  border-radius: $radius;
}

💬 믹스인 사용할 때

순서 꼭 지켜야 함

.button-primary {
  @include button-style(tomato, 20px, 8px);
}

.button-secondary {
  @include button-style(#333, 15px, 4px);
}

🧚‍♀️ 그런데!  기본값을 줄 수도 있어

믹스인 정의할 때 이렇게 👇

@mixin button-style($bg-color, $padding: 16px, $radius: 4px) {
  background-color: $bg-color;
  padding: $padding;
  border-radius: $radius;
}

그럼 쓸 때

.button-primary {
  @include button-style(tomato); // padding 16px, radius 4px 자동 적용
}

 

더보기

🫶🏻Sass mixin 인자에 초기값을 주면 좋은 이유 

Sass에서는 mixin 호출할 때 인자를 전달하지 않으면, 초기값이 없는 인자는 에러가 나요.
초기값을 지정해주면, 인자를 안 넘겼을 때도 기본값을 사용할 수 있어서 훨씬 유연해져요.

✓ 왜 필요한데?

  • 코드 재사용성을 높이기 위해
    → 매번 값을 다 넣을 필요 없이, 자주 쓰는 기본값을 설정해두고
    필요할 때만 바꿔서 쓸 수 있어요.
  • 에러 방지용
    → 인자를 안 넣었는데 초기값이 없으면 Sass가 빌드할 때 에러남
    → 근데 초기값이 있으면 그냥 그 값으로 처리 가능

✎예제

@mixin button-style($bg-color: #3498db, $text-color: #fff) {
  background-color: $bg-color;
  color: $text-color;
  padding: 10px 20px;
  border-radius: 5px;
}

사용 1 — 기본값 사용

.button {
  @include button-style;
}

사용 2 — 값 덮어쓰기

.button-danger {
  @include button-style(#e74c3c, #fff);
}

이렇게 하면

  • 기본 버튼은 파란색
  • danger 버튼은 빨간색
    같이 쉽게 조절 가능하죠.

✎ 만약 초기값 없으면?

@mixin button-style($bg-color, $text-color) {
  background-color: $bg-color;
  color: $text-color;
}

이걸

.button {
  @include button-style;
}

이렇게 쓰면 에러 발생
→ Missing argument for $bg-color


🐰정리

초기값은 선택적 유연성 + 에러 방지
특히 리액트 SCSS에서 다양한 컴포넌트 스타일을 재사용할 때
믹스인 기본값은 코드 깔끔하게 유지하는 핵심 도구


혹은 SCSS 최신 버전에서는 named arguments 도 가능하긴 한데, 이건 잘 안 쓰이는 편이긴 해.

@include button-style($radius: 10px, $padding: 20px, $bg-color: tomato);

근데 이렇게 쓸 거면 그냥 기본값이나 믹스인 나누는 게 더 깔끔해.


혹시 믹스인 인자 순서가 헷갈리거나 복잡해진다면,→ 인자 개수를 줄이거나기본값 설정
해두는 것도 좋은 방법이야.


🤍 순서가 헷갈린다면 이렇게! 🤍

“바뀔 가능성 있는 거를 인자로 쓴다”
“절대 안 바뀔 거면 mixin 안에 고정값으로 둔다”

 

그리고 인자 자리에 다 쭉 나열하는 거지.
다만 순서는 자주 바꿀 것 같은 거 → 덜 바꿀 것 같은 거 순서로 두면 좋아.
(꼭 그럴 필요는 없지만 유지보수나 가독성에 좋아)


나 혼자 갑자기 궁금해진 것. . 

예를 들어,

@mixin box-style($padding: 20px) {
  padding: $padding;
  border: 1px solid #ddd;
  border-radius: 5px;
}

이런 코드 안에서, 애초에

이 코드의 {} 중괄호 안인, border: 1px solid #ddd; border-radius: 5px 이것도 그냥 거의 기본값이 아닌가 ?

굳이 () 중괄호 인자 자리에, 기본값을 설정 해줄 필요가 있나 ?
믹스인을 사용하는 이유가, 공통으로 쓸 부분을 쉽게 간단히 해주는건데, 이 자체로 기본 값을 만드는거 아닌가 ?
 

라는 의문..

 
 
 
>> 챗 지피티의 대답
 
 

와 진짜 날카로운 질문이다 이거 — 완전 좋은 시점에서 짚었어 👏
개념 확실하게 딱 정리해볼게요.

 

 인자 기본값 vs mixin 안의 고정 스타일 차이

둘 다 기본값처럼 보이긴 하는데 사실 역할이 완전히 달라요.


구분 인자 기본값 mixin 안의 고정 스타일
목적 상황마다 바뀌는 값에 기본값 설정 모든 상황에서 고정으로 쓰려는 스타일
변경 가능성 @include할 때 인자로 전달해 바꿀 수 있음 @include할 때 절대 못 바꿈
설정 위치 괄호 안 인자 선언부 중괄호 {} 안 스타일 선언부

 

 

예를 들어,

🐰인자 기본값: 상황마다 바뀔 수 있음

@mixin box-style($padding: 20px) {
  padding: $padding;
}

사용

.box1 {
  @include box-style(30px); // padding 30px
}

.box2 {
  @include box-style;       // padding 20px (기본값)
}

→ @include 할 때마다 다르게 쓸 수 있음.


🐿️ mixin 안의 고정 스타일: 무조건 고정

@mixin box-style($padding: 20px) {
  padding: $padding;
  border: 1px solid #ddd;
  border-radius: 5px;
}

사용

.box {
  @include box-style(30px);
}

여기선

  • padding은 30px
  • border, border-radius는 무조건 1px solid #ddd / 5px

→ 바꾸고 싶으면 mixin 자체를 수정하거나, 새로운 mixin을 만들어야 함
혹은 인자를 추가해서 또 바꿔줘야 함.


→ 그러니까…

지금 {} 안에 있는

border: 1px solid #ddd;
border-radius: 5px;

는 ‘기본값’이라기보단


디자인 시스템의 고정값, 공통 스타일에 가까워요.

기본값이라는 건
인자로 받아서 상황마다 바꿀 수 있는데, 안 주면 기본으로 적용되는 값
이걸 말하는 거고!

 

🧚‍♀️🐰 결론

지금 {} 안의 값들은
✔️ 절대 바뀌지 않는 고정값 (디자인 시스템 스타일)
✔️ 바꾸고 싶다면 인자로 빼서 기본값을 설정해주면 됨!

 


인자 기본값이란?

"이 인자가 안 들어왔을 때를 대비해서 미리 지정해둔 값"

즉, 바뀔 가능성이 있는 값인데
혹시라도 사용자가 안 넘겨줄 수도 있으니까
그때 적용될 기본값을 설정해두는 것이에요.

 

 

=> 

인자 기본값은, 바뀔 수 있는 파트지만, 혹시 인자가 설정되지 않을 경우에 대비해서 적어두는 값 이라고 이해 하면 쉽다 !


인자 순서 헷갈리는 부분! 안쓰고 싶은 중간 순서의 인자 부분은 어떻게 ?

 

예를 들어, 아래 코드에서는

@mixin button($bg-color: blue, $font-size: 16px, $padding: 10px) {
  background-color: $bg-color;
  font-size: $font-size;
  padding: $padding;
}
@include button(black, 18px);

이렇게 하면:

  • $bg-color = black
  • $font-size = 18px
  • $padding = 10px (기본값 사용)

이 상황에서 18px은 **폰트 사이즈(font-size)**에 해당

 



만약 폰트 사이즈를 안 쓰고 패딩만 바꾸고 싶을 때는 이렇게 할 수 있어요:

@include button(black, 0 , 20px);  // 폰트 사이즈를 안 넘기고 패딩만 20px로 설정

🫶🏻설명:

  • 첫 번째 인자 black은 여전히 배경색($bg-color)에 들어가고,
  • 두 번째 인자는 빈 칸으로 두면 기본값인 16px이 폰트 사이즈($font-size)로 사용돼요.
  • 기본 값이 있으면 비워둬도 되고, black, , 20px ! 기본 값 없으면 0 적기
  • 세 번째 인자 20px은 패딩($padding)에 들어갑니다.

 

✔️ 중요한 점

빈 칸을 **, ,**처럼 두는 건
인자 자리를 비워두는 방법인데, 그 자리에 해당하는 기본값이 적용된다.

 


출처 : 챗지피티, 오즈코딩스쿨학습자료, 구글링