CSS 방법론의 발전 (Feat. Utility-First CSS, SSR)
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에 의존적
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는 추가 설정이 필요할 수 있습니다.