CSS 방법론의 발전 (Feat. Utility-First CSS, SSR)

BrakieBrakie
10 Mar 2025
CSS(스타일시트)는 웹 개발에서 디자인과 레이아웃을 담당하는 핵심 기술 중 하나입니다. 그러나 시간이 지나면서 코드의 생산성, 유지보수성과 확장성의 문제로 인해 다양한 CSS 방법론이 등장했습니다.
이 글에서는 CSS 방법론의 발전을 시간순으로 살펴보고, 특히 Utility-First CSS, CSS-in-JS, Atomic CSS, Functional CSS의 개념과 장단점을 정리하고 SSR 적용 시 고려사항을 살펴 보겠습니다.

1. 전통적인 CSS에서 OOCSS, BEM으로의 발전

🕰 1990~2010년대 초반

초기 CSS는 단순한 스타일링을 목적으로 했지만, 웹 사이트가 복잡해지면서 재사용성과 유지보수성이 중요한 이슈가 되었습니다. 이 시기에 등장한 방법론은 다음과 같습니다.

OOCSS (Object-Oriented CSS, 2009)
  • CSS의 재사용성을 높이기 위해 구조(Structure)와 스킨(Skin)을 분리하는 방식.
BEM (Block-Element-Modifier, 2010)
  • 명확한 네이밍 규칙(block__element--modifier)을 사용하여 스타일 충돌을 방지하고 유지보수성을 개선.
🔥 장점: CSS 코드의 구조화, 재사용성 증가
⚠️ 단점: 클래스 이름이 길어짐, HTML에 의존적
image description

2. Utility-First CSS와 Atomic CSS의 등장

🕰 2010년대 중반

CSS 코드가 커지면서 스타일 관리가 점점 어려워졌고, 반복적인 스타일링을 줄이기 위한 새로운 접근 방식이 등장했습니다.
🚀 Utility-First CSS (ex: Tailwind CSS)
기본 개념:
  • 재사용 가능한 유틸리티 클래스(예: text-red-500, p-4, flex, grid)를 사용하여 CSS를 최소화.
  • CSS를 직접 작성하기보다, 미리 정의된 클래스를 조합하여 스타일 적용.
대표적인 프레임워크:
  • Tailwind CSS
  • Bootstrap Utility Classes
🔥 장점: 빠른 개발 속도, 클래스 기반 스타일 적용, 반복적인 CSS 제거
⚠️ 단점: HTML이 복잡해질 수 있음, 클래스 네이밍 학습 필요

🚀 Atomic CSS (ex: ACSS, Tachyons)
기본 개념:
  • "한 클래스 = 한 스타일 규칙" 원칙을 따르는 CSS 방식.
  • 예: .p4 { padding: 1rem; }, .bg-blue { background-color: blue; }
Utility-First CSS와의 차이점:
  • Tailwind는 기본적으로 Atomic CSS에 유틸리티 클래스를 추가한 개념.
  • Atomic CSS는 가능한 한 CSS 파일을 줄이고, 인라인 스타일과 비슷한 방식으로 작동.
🔥 장점: 극단적인 코드 재사용성, 파일 크기 최소화
⚠️ 단점: 스타일을 변경할 때 클래스 변경이 필요, 학습 곡선 존재

3. CSS-in-JS의 등장과 확산

🕰 2016년~

React, Vue와 같은 컴포넌트 기반 UI 라이브러리가 인기를 얻으면서, 스타일을 컴포넌트 단위로 관리할 필요성이 커졌습니다. 이에 따라 CSS-in-JS 개념이 등장했습니다.
🚀 CSS-in-JS (ex: Styled Components, Emotion)
기본 개념:
  • JavaScript 파일 내에서 CSS를 직접 정의하고 관리하는 방식.
  • styled-components처럼 템플릿 리터럴을 활용하여 스타일을 적용.
import styled from "styled-components";

const Button = styled.button`
  background-color: blue;
  color: white;
  padding: 10px;
`;
대표적인 CSS-in-JS 라이브러리:
  • Styled Components
  • Emotion
  • Stitches

4. Functional CSS의 개념

🕰 2020년대~

Functional CSS는 Utility-First CSS와 Atomic CSS의 발전된 개념으로, 순수 함수적 스타일링을 강조합니다.
🚀 Functional CSS (ex: Tailwind, WindiCSS)
기본 개념:
  • CSS 속성을 조합하는 유틸리티 스타일링 방식.
  • flex items-center justify-between p-4 bg-gray-200 같은 조합 사용.
  • Tailwind CSS와 같은 프레임워크가 대표적.
🔥 장점: CSS 파일 크기 감소, 유지보수 용이, 재사용성 증가
⚠️ 단점: 클래스 네이밍 규칙 학습 필요, 디자인 시스템과 충돌 가능

5. CSS 방법론 비교 정리

방법론 등장 시기 주요 개념 대표적인 예시 장점 단점
OOCSS 2009년 구조와 스타일 분리 SMACSS CSS 재사용성 증가 네이밍 규칙이 복잡
BEM 2010년 명확한 네이밍 규칙 BEM 스타일 충돌 방지 클래스 이름이 길어짐
Utility-First CSS 2010년대 중반 유틸리티 클래스 기반 스타일링 Tailwind 빠른 개발 속도 HTML이 복잡해짐
Atomic CSS 2010년대 중반 최소한의 CSS 사용 ACSS, Tachyons 성능 최적화 클래스 변경 어려움
CSS-in-JS 2016년 이후 컴포넌트 기반 스타일 관리 Styled Components 동적 스타일링 가능 런타임 성능 저하 가능
Functional CSS 2020년대 함수형 스타일링 WindiCSS, Tailwind 재사용성 증가 클래스 네이밍 학습 필요

6. 결론: 어떤 CSS 방법론을 선택해야 할까?

각 방법론은 트렌드와 기술 스택에 따라 선택해야 하며, 팀의 경험과 프로젝트의 요구사항에 맞게 조합해서 사용하는 것이 중요합니다. 🚀
  • 대규모 프로젝트 → BEM + Utility-First CSS 조합 추천
  • React/Vue 기반 프로젝트 → CSS-in-JS 사용 가능 (Emotion, Styled Components)
  • 빠른 개발이 필요한 프로젝트 → Tailwind CSS 추천
  • 최소한의 스타일로 최적화 → Atomic CSS 고려
  • Server-Side Rendering(SSR) → Utility-First CSS (Tailwind CSS), Atomic CSS, CSS Modules 추천

🔥 SSR 환경에서 CSS-in-JS를 사용할 경우
  • 기본적으로 styled-components와 emotion은 SSR을 지원하지만, 초기 렌더링 시 스타일이 적용되지 않는 문제(Flickering Issue) 가 발생할 수 있습니다.
  • 이를 해결하기 위한 방법으로 서버에서 스타일을 미리 생성하는 SSR 설정이 필요하며, Next.js와 함께 사용할 경우 ServerStyleSheet 같은 기능을 추가해야 합니다.
👉 SSR 최적화가 필요하다면?
  • Tailwind CSS 또는 Atomic CSS처럼 사전 생성된 CSS 클래스 기반 접근 방식이 유리함
  • CSS Modules을 활용하여 각 컴포넌트에 독립적인 스타일 적용 가능
🚀 결론: SSR 환경에서는 Utility-First CSS(Tailwind CSS), Atomic CSS, CSS Modules가 더 적합하며, CSS-in-JS는 추가 설정이 필요할 수 있습니다.
Buy Me A Coffee

Similar Posts