IT개발

CSS-in-JS vs 전통적 CSS 설계 비교

우리모두 개발자되기 2025. 4. 25. 08:56

 

CSS-in-JS vs 전통적 CSS 설계 비교

스타일링 전략의 진화, 어떤 방식이 더 나은 선택일까?


1. 들어가며

웹 개발의 역사에서 CSS는 항상 ‘디자인의 중심’ 역할을 해왔습니다.
초기에는 style.css 하나로 전체 웹사이트의 스타일을 관리했지만, 컴포넌트 기반 개발과 대규모 프로젝트가 일반화되면서 CSS 관리의 어려움이 점점 커졌습니다.
이러한 맥락에서 등장한 것이 CSS-in-JS입니다.

이 글에서는 **전통적 CSS 방식(예: CSS, Sass, BEM 등)**과 **CSS-in-JS 방식(예: styled-components, Emotion, JSS 등)**의 특징과 장단점을 실무 관점에서 비교하고, 어떤 상황에서 어떤 방식을 선택하는 것이 적절한지를 알아보겠습니다.


2. 기본 개념 비교

구분 전통적 CSS CSS-in-JS
작성 위치 별도의 .css 파일 JavaScript 파일 내부
스코프 글로벌 기본 컴포넌트 단위 스코프
문법 CSS 또는 전처리기(SCSS 등) JS 기반 템플릿 리터럴, 객체 문법 등
런타임 처리 없음 (정적) 런타임 또는 빌드타임 처리 가능
의존성 없음 JS 라이브러리 필요 (styled-components 등)

3. 전통적 CSS 방식의 장점과 한계

장점

  • 빠른 렌더링: 정적으로 처리되므로 별도 런타임 오버헤드가 없음
  • 광범위한 지원: 모든 브라우저와 프레임워크에서 활용 가능
  • 디자이너 친화적: 디자이너와 개발자가 협업하기 쉬움

단점

  • 글로벌 스코프 충돌 문제: 클래스명이 겹칠 가능성 존재
  • 재사용성 한계: 컴포넌트 단위 개발 시 스타일 분리 어려움
  • 동적 스타일링 한계: 조건부 렌더링이나 상태 기반 스타일링이 어렵고 복잡함

4. CSS-in-JS 방식의 장점과 한계

장점

  • 컴포넌트 단위 스타일링: 스타일을 컴포넌트와 함께 유지 관리 가능
  • 동적 스타일링에 유리: JS 변수, 상태값 기반 조건부 스타일 구현 용이
  • 스타일 중복 방지: 클래스명 자동 생성으로 글로벌 충돌 방지
  • 타입 안정성: TypeScript와 함께 사용하면 스타일 타입도 추적 가능

단점

  • 런타임 오버헤드: 일부 구현은 브라우저에서 스타일을 해석하므로 성능 이슈 발생 가능
  • 학습 곡선: 기존 CSS에 익숙한 개발자에겐 진입 장벽
  • 도구 의존도: 라이브러리에 따라 유지보수나 성능이 달라짐

5. 실제 코드 비교

① 전통 CSS 방식

파일 구조:

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

Button.jsx

import './Button.css';

function Button() {
  return <button className="primary-button">Click Me</button>;
}

Button.css

.primary-button {
  background-color: blue;
  color: white;
  border: none;
  padding: 10px;
}

② CSS-in-JS 방식 (styled-components 예시)

Button.jsx

import styled from 'styled-components';

const Button = styled.button`
  background-color: ${props => props.active ? 'blue' : 'gray'};
  color: white;
  border: none;
  padding: 10px;
`;

function App() {
  return <Button active={true}>Click Me</Button>;
}

장점: JS의 조건문, props, 테마 등을 그대로 활용 가능.
단점: 번들 사이즈 증가, 런타임 성능 이슈 고려 필요.


6. 성능 비교

빌드 시점 렌더링 방식의 차이

항목 전통 CSS CSS-in-JS
초기 로딩 속도 빠름 느려질 수 있음
스타일 적용 시점 HTML 로드와 함께 JS 로드 후 적용
캐싱 효율성 높음 (정적 파일) 낮음 (동적 생성)

Tip: CSS-in-JS는 babel-plugin-styled-components, linaria 같은 정적 분석 도구를 통해 빌드 타임 CSS 추출이 가능하므로 성능 최적화도 가능함.


7. 협업과 유지보수 측면

전통 CSS

  • 디자이너가 CSS 파일만 관리 가능
  • 전사 디자인 시스템과 연계 쉬움
  • 규모가 커질수록 관리 어려움(BEM 도입 필요)

CSS-in-JS

  • 컴포넌트 수준에서 재사용성 우수
  • 상태 기반 UI 처리와 연동이 간편
  • 디자이너가 코드에 접근하기 어렵고, 전용 설계 패턴 필요

8. 결론: 어떤 방식을 선택할 것인가?

상황 추천 방식
정적 콘텐츠 위주의 웹사이트 전통 CSS
디자인 시스템 기반 대규모 SPA CSS-in-JS
빠른 초기 로딩이 중요한 프로젝트 전통 CSS
조건부 스타일, 다크모드 등 상태 연동 많은 UI CSS-in-JS
디자이너-개발자 협업 비중 높은 팀 전통 CSS or Tailwind CSS

9. 마무리하며

CSS-in-JS와 전통적인 CSS는 정답이 있는 문제가 아니라 선택의 문제입니다.
둘 다 장단점이 명확하고, 프로젝트의 특성과 팀 구성, 유지보수 전략에 따라 달라질 수 있습니다.

특히 React, Vue 등 컴포넌트 중심의 프레임워크를 사용한다면 CSS-in-JS는 상당히 매력적인 방식입니다. 반면, 빠른 초기 로딩과 단순 구조를 요구하는 웹에서는 전통 CSS가 여전히 강력한 선택지입니다.

당신의 프로젝트에 맞는 스타일 설계 전략, 지금 고민해보셔야 할 때입니다.