CSS Styling Library

민경빈·2025년 11월 7일

웹 프론트엔드 개발에서 CSS를 어떻게 관리하고 스타일링하느냐는 사용자 경험(UX)과 생산성에 직접적으로 영향을 미치는 중요한 요소이다.

과거에는 직접 CSS 파일을 작성하거나 Sass같은 전처리기를 사용하는 방식이 일반적이었지만 오늘날에는 더 빠르고 일관된 디자인을 위해 CSS 프레임워크와 스타일링 라이브러리가 널리 활용되고 있다.

대표적인 예로 Bootstrap과 Tailwind CSS를 꼽을 수 있다.

2025년 통계를 보면 사용률 1위는 여전히 Bootstrap이 차지하고 있지만, 최근 1년간 가장 빨리 성장한 CSS 프레임워크는 Tailwind이다.
즉, 기존 프로젝트가 있기때문에 전체 비율은 Bootstrap이 우위지만, 신규 프로젝트나 디자인 중심 웹에서는 Tailwind가 빠르게 채택되고 있다.

Tailwind

Tailwind는 Utility-first CSS Framework다.
즉, “미리 완성된 UI 컴포넌트를 제공하는 프레임워크(Bootstrap)”와 달리,
작고 단순한 CSS 유틸리티 클래스들을 조합해 원하는 UI를 직접 만들어가는 방식이다.

커스터마이징에 특히 유리하다

> <button class="px-4 py-2 bg-indigo-600 text-white rounded-md hover:bg-indigo-700">
  Save
</button>

위 코드가 Tailwind CSS 를 적용했을 때의 기본형태이다. 얼핏보면 인라인으로 작성한 것처럼 보이지만 실제로는 Tailwind가 CSS 파일을 미리 정의해 두고 필요한 클래스를 선택해 조합하는 방식이다.

기준인라인 스타일Tailwind
스타일 위치요소 내부에 직접 작성외부 CSS에서 미리 정의된 클래스를 참조
중복 제거불가능 (요소마다 반복 작성)하나의 클래스가 재사용됨
유지보수매우 어려움매우 쉬움
반응형 제어거의 불가능md:, lg: 로 간단하게 지원
CSS 용량커짐실제 사용된 클래스만 빌드 → 매우 작아짐
우선순위강함 → CSS 구조 깨짐일반 CSS처럼 우선순위 체계 유지
디자인 시스템없음tailwind.config로 전체 프로젝트에 적용

Tailwind CSS가 급속도로 성장하는 이유

CSS는 기본적으로 전역(Global Scope)으로 적용되기 때문에, 프로젝트의 규모가 커질수록 스타일 충돌과 네이밍 문제와 같은 유지보수 이슈가 발생한다. 이러한 한계를 보완하기 위해 다양한 접근 방식이 등장하였고, 그중 하나가 CSS-in-JS 방식이다.

CSS-in-JS는 스타일을 별도의 CSS 파일이 아닌 JavaScript 내부에서 정의하는 방법으로, 스타일을 특정 컴포넌트에 종속시킬 수 있다는 장점이 있다. 이에 따라 전역 네임스페이스 오염을 효과적으로 방지할 수 있으며, props나 조건문, 변수를 활용한 동적 스타일링이 가능하기 때문에 React 생태계에서 널리 활용되었다.

그러나 CSS-in-JS 방식은 런타임에 스타일을 계산하여 style 태그로 삽입하는 구조적 특성을 지닌다. 이로 인해 컴포넌트가 리렌더링될 때마다 추가적인 연산이 발생하며, 컴포넌트 수가 증가할수록 성능 저하가 누적되는 문제가 나타난다. 특히 대규모 SPA 환경에서는 이러한 문제가 더욱 두드러지게 나타난다.

이후 Next.js를 중심으로 SSR(Server-Side Rendering)과 SSG(Static Site Generation)이 보편화되면서, 초기 렌더링 속도, TTFB, SEO 최적화가 중요한 지표로 자리 잡았다. 그러나 CSS-in-JS는 스타일을 런타임에서 처리하는 특성 때문에 SSR 환경에서는 한계가 있었다.

이러한 흐름 속에서, 업계는 “런타임 비용이 없는 방식”, “스타일을 빌드 타임에 처리할 수 있는 방식”, “일관된 디자인 시스템을 강제할 수 있는 방식”을 요구하게 되었고, 이를 충족한 해결책이 Tailwind CSS이다. Tailwind는 미리 정의된 유틸리티 클래스를 조합해 UI를 구성하는 방식으로 동작하며, 브라우저에서 별도의 스타일 연산이 발생하지 않는다. 또한 CSS 파일 없이도 일관된 디자인 시스템 구축이 가능하고, SSR 환경에서도 성능 부담이 적다는 점에서 주목을 받았다.

이러한 이유로 Tailwind는 신규 프로젝트와 스타트업 중심으로 빠른 속도로 채택률이 증가하고 있으며, CSS-in-JS가 제공하던 장점을 유지하면서도 성능 문제를 해결한 대안으로 자리잡고 있다.

하지만 vanilla extract, Stitches, Linaria 등의 Zero Runtime CSS in JS 도 생겨나긴했다

분류예시 클래스의미 / 설명
레이아웃 (Layout)flex, grid, block, inline-flex요소의 display 속성 설정
justify-center, items-center, gap-4정렬 및 요소 간 간격 설정
w-full, max-w-sm, h-screenwidth / height 제어
p-4, m-6, px-2, py-3padding / margin 설정
타이포그래피 (Typography)text-sm, text-xl, text-3xl글자 크기
font-medium, font-bold폰트 두께
text-gray-700, text-white텍스트 색상
색상 / 배경 (Color / Background)bg-indigo-600, bg-gray-100배경색
hover:bg-indigo-700hover 시 배경색 변경
dark:bg-gray-900다크모드 배경 지정
테두리 / 라운드 (Border / Radius)border, border-gray-300테두리
rounded, rounded-lg, rounded-full둥근 정도 설정
그림자 (Shadow)shadow, shadow-md, shadow-xl요소 그림자 강도
hover:shadow-lghover 상태에서 그림자 변경
반응형 (Responsive)sm:text-base, md:text-lg, lg:text-xl화면 크기에 따라 자동 스타일 변경
md:flex, lg:grid반응형 레이아웃 변경
상태 변화 (States)hover:, focus:, active:마우스/키보드 이벤트 스타일
disabled:opacity-50비활성화 시 UI 표시
다크모드 (Dark mode)dark:text-gray-200, dark:bg-gray-800dark 프리픽스만 붙이면 다크모드 스타일 적용
애니메이션 / 트랜지션transition-all, duration-200, ease-in-out스타일 상태 변화 애니메이션
기타 중요 기능cursor-pointer, select-none커서, 텍스트 선택 제어
overflow-hidden, overflow-auto스크롤/오버플로우 제어

Tailwind의 장점

1. CSS 파일이 거의 없음

개발자는 스타일을 수정하기 위해 CSS 파일을 오가며 클래스를 찾을 필요가 없다.

하나의 컴포넌트 안에서 구조와 스타일을 함께 관리할 수 있기 때문에, 유지보수가 크게 단순해진다.

2. 일관된 디자인 시스템

tailwind.config를 통해 색상, spacing, 타이포그래피 스케일 등을 정의하면
프로젝트 전체가 같은 규칙으로 작성된다.

즉, 사람마다 다른 CSS 네이밍, 다른 색상 값, 다른 마진 값이 섞이는 일이 없다.

3. 상태 제어와 반응형 스타일링이 유리함

<button class="px-4 py-2 bg-indigo-600 hover:bg-indigo-700 lg:px-6 dark:bg-indigo-500">
  Save
</button>

tailwind CSS를 사용을 안해보았다면 이게 뭔가 싶겠지만
이 한 줄에 크기/색상/반응형/다크모드/hover/상태에 대한 코드가 다 명시되어있다.

BootStrap

Bootstrap은 오랫동안 가장 널리 쓰인 CSS 프레임워크이며, 여전히 사용률 기준으로는 1위를 유지하고 있다. 특히 웹 서비스의 UI를 빠르게 구성해야 하는 상황에서 강력한 생산성을 제공하는 도구로 인정받는다.

사용 예시를 버튼을 통해 보여주자면 다음과 같다.

<button class="btn btn-primary">
  Save
</button>

Tailwind가 유틸리티 클래스를 조합하는 방식이라면,
Bootstrap은 미리 완성된 UI 컴포넌트를 제공하는 방식이다.

따라서 버튼, 카드, 네비게이션 바, 폼, 그리드 레이아웃 등
대부분의 UI 요소가 이미 만들어져 있으며,
개발자는 이를 그대로 가져다 쓰기만 하면 된다.

Bootstrap의 장점

바로 사용할 수 있는 완성형 컴포넌트

버튼, 모달, 드롭다운,테이블, 폼 등 우리가 구현하는데 있어 필요한 컴포넌트가 이미 모두 구현되어 있다. 디자인 능력이 부족해도, 개발자 혼자서도 빠르게 UI를 만들 수 있는 것이 장점이다.

진입장벽이 매우 낮음

다른 CSS 라이브러리에 비해 HTML에 클래스를 추가하기만 하면 되기 때문에
초보자도 빠르게 학습할 수 있다. JS 플러그인을 통한 상호작용(모달, 드롭다운 등)도 기본 제공된다.

안정성과 레거시 호환

ootstrap은 오래된 프로젝트부터 최신 서비스까지 폭넓게 사용된다.
문서화가 탄탄하고, 커뮤니티도 크며, 관련 라이브러리도 많다.
기업·공공기관 사이트, 사내 웹 시스템 등 안정성과 검증이 중요한 환경에서 여전히 견고하다.

BootStrap의 단점

Bootstrap의 단점을 Tailwind와 비교하며 설명해보면
우선 Bootstrap은 이미 구현된 완성형 컴포넌트를 제공하는 방식이기 때문에, 개발자가 원하는 형태로 자유롭게 조합하는 Tailwind CSS와 달리 디자인적인 개성을 내기 어렵다. 이 때문에 Bootstrap을 사용하는 웹사이트들이 서로 비슷한 UI 느낌을 갖는 경우가 있다.

기본 스타일에서 벗어나기 위해서는 CSS를 오버라이딩하거나 변수를 재정의해야 하고, 경우에 따라 추가적인 스타일 작업이 필요하다. 반면 Tailwind는 유틸리티 클래스를 조합하는 방식이기 때문에 커스터마이징이 훨씬 자유롭고, 유지보수 역시 컴포넌트 단위에서 간단하게 해결된다.

또한 Bootstrap은 미리 만들어진 모든 UI 컴포넌트의 CSS를 포함하기 때문에, 실제로 사용하지 않는 컴포넌트의 스타일도 함께 로딩되는 경우가 많다. Tailwind처럼 사용된 클래스만 빌드 타임에 추출해주는 방식이 아니기 때문에, 최종 CSS 용량 측면에서도 비효율적일 수 있다.

기준BootstrapTailwind
철학미리 만들어진 UI를 제공유틸리티 클래스로 조합
디자인 개성제한적 (Bootstrap 느낌이 남음)자유로움 (브랜딩에 유리-> 트랜드함)
초기 개발 속도매우 빠름익숙해지면 빠름
커스터마이징어렵고 오버라이드 필요config로 전체 스타일 수정 가능
CSS 용량불필요한 스타일 포함되기 쉬움사용된 클래스만 추출 → 최소화
SSR 친화도일반적 수준매우 높음

그러면 무조건 Tailwind?

지금까지 위 내용을 보면 tailwind는 CSS의 문제를 해결하고 다른 프레임워크에 비해 무조건적으로 유리해보일 수도 있지만, 나는 아니라고 생각한다.

내가 처음 Tailwind CSS에 대해 공부할 때 기본적으로 html에 직접 넣기 때문에 다른 CSS 라이브러리들과는 다른 구조를 가지며 , CSS 속성을 사용하지않고 유틸리티 클래스를 조합하는 것이기 때문에 초기에 되게 애를 먹었다. (지금도 익숙하진않다)

또한 html 클래스에 많은 요소가 들어오게 되면 지저분해보이고, html 파일 자체의 가독성이 많이 떨어진다고 생각한다.

Tailwind의 성장세는 가파르지만 시장점유율이 절대 크다고는 볼 수 없고 스타일시트를 통한 디자인이 익숙한 사람이 더 많을 것이다. 따라서 협업과정에서 팀원들이 Tailwind의 “HTML에 스타일이 모두 포함된 구조”에 거부감을 가질 수도 있다.

CSS를 합리적으로 선택하는 방법

단순히 “요즘 많이 쓰니까”라는 이유만으로 기술을 결정하면 오히려 유지보수 비용이 커질 수 있으며, 오랜 기간 운영되는 서비스일수록 초기 선택의 영향은 더욱 크게 나타난다.

예를 들어, 빠른 개발 속도가 중요한 내부 관리자 페이지나 프로토타입 단계의 서비스라면
미리 만들어진 컴포넌트를 제공하는 Bootstrap이 훨씬 효율적일 수 있다.
반면, 실제 사용자에게 노출되는 제품이고, 브랜드 정체성이나 디자인 일관성이 중요한 서비스라면
Tailwind처럼 디자인 시스템을 중심으로 구성할 수 있는 프레임워크가 유리하다.

또한 팀의 경험도 중요한 기준이 된다.
React와 Next.js에 익숙한 팀이라면 Tailwind 도입이 자연스러울 수 있지만, CSS 자체에 익숙하지 않은 팀이라면 오히려 Tailwind가 장벽으로 작용해 생산성을 떨어뜨릴 수도 있다.

이처럼 기술의 장단점은 절대적이지 않으며, 누가 사용하고 어떤 문제를 해결하려는가에 따라 달라진다. 따라서 서비스의 특징이나 팀의 특성 등 상황을 고려하여 CSS 라이브러리를 적절하게 선택하는 것이 중요하다고 생각한다.

5개의 댓글

comment-user-thumbnail
2025년 11월 9일

이번에 Tailwind CSS를 직접 써보면서 확실히 느낀 게 많았습니다. 진짜 좋았던 건 스타일 고치려고 CSS 파일 왔다 갔다 할 필요 없이 바로바로 수정하니까 편리했습니다. 특히 hover:, lg:, dark: 같은 걸 하나의 클래스 속성 안에 다 때려 넣는 방식이 반응형이나 상태 제어할 때 진짜 직관적이어서 좋았는데 이게 Tailwind의 강점을 몸소 느꼈습니다. 근데 반대로 아쉬운 점은 클래스명이 스타일 속성의 조합이다 보니 이 태그가 헤더를 감싸는 영역인지 메인 페이지를 감싸는 영역인지 같은 레이아웃 역할을 바로 파악하기는 좀 헷갈리더라고요. 의미론적인 클래스명이 없으니 코드가 길어지면 오히려 구조를 읽는 건 어려워지는 느낌이었습니다.
어쨌든 직접 써보니까 장단점이 확실해서 좋은 경험이었어요! 다음에 작은 프로젝트 할 때는 Bootstrap이나 shadcn/ui 같은 다른 UI 라이브러리도 써보면서 어떤 css라이브러리가 어울릴지 비교해보고 싶습니다.

답글 달기
comment-user-thumbnail
2025년 11월 9일

Tailwind CSS를 처음 사용할 때는 단지 최근 취업 시장에서의 활용도와 주변에서의 높은 사용률 때문이었습니다. 하지만 직접 사용해보니 미리 정의된 디자인 토큰 덕분에 협업 과정에서 디자인 시스템의 일관성을 효과적으로 유지할 수 있다는 점이 큰 장점으로 다가왔습니다.

특히 Next.js를 이용해 SSR 개발을 진행하면서, 아티클에서 언급된 "SSR 환경에서도 성능 부담이 적다"는 이점을 더욱 체감할 수 있었습니다. 이 부분을 다시 복기할 수 있게 해 주셔서 감사합니다. 좋은 아티클이었습니다!

답글 달기
comment-user-thumbnail
2025년 11월 9일

CSS-in-JS의 런타임 이슈부터 SSR 환경에서의 트렌드 변화까지 다루며 두 프레임워크를 비교해주셔서 유익했습니다.

저도 Tailwind를 사용하면서 스타일을 위해 파일을 오가지 않아도 되는 점은 정말 편했지만, 반대로 HTML에 클래스가 너무 길어져 가독성이 떨어지는 점은 항상 아쉬웠습니다.

이번 글을 통해 사용해보지 않았던 Bootstrap의 장단점도 알게되었습니다. 특히 빠른 개발 속도가 중요한 내부 관리자 페이지나 프로토타입 단계라면 Bootstrap이 훨씬 효율적일 수 있다는 말씀에 크게 공감했습니다.

막연히 Tailwind가 최신 트렌드라고만 생각했는데, 다음번에 관리자 페이지나 빠른 프로토타입을 만들게 되면 꼭 Bootstrap을 적용해보고 싶다는 생각이 들었습니다.

답글 달기
comment-user-thumbnail
2025년 11월 9일

사실 저는 평소에 Tailwind CSS만을 정말정말 자주 사용했었습니다 ㅎ..ㅎ
(커스터마이징이 진짜 자유롭고, 반응형도 너무 잘 되어 있어서 그냥 이게 편하니까 계속 쓰게 되더라고요...;;;)
Next.js 프로젝트를 자주 하다 보니 호환성도 좋고, 다크모드 지원도 손쉽게 되어 있어서 솔직히 다른 CSS 프레임워크를 써볼까? 라는 생각 자체를 거의 안 했던 것 같습니다.

근데 이번 글을 읽으면서 Bootstrap이라는 프레임워크를 처음 제대로 알게 됐습니다...!! 솔직히 그동안 이름은 들어봤지만 “옛날에 쓰던 거 아냐?” 정도로만 생각했는데 막상 내용을 보니까 Bootstrap은 단순히 오래된 게 아니라,
미리 완성된 컴포넌트를 빠르게 조합할 수 있는 생산성 중심의 도구라는 걸 알게 됐습니다.

Tailwind가 유연함과 커스터마이징에 강점이 있다면, Bootstrap은 빠른 구현과 안정성 쪽에 강점이 있다는 걸 이해하니까 두 프레임워크가 서로 다른 철학을 가지고 발전해왔다는 게 확실히 느껴지는 것 같아요!!

마지막으로 남겨주신, 기술을 무조건 유행 따라 쓰는 게 아니라, 프로젝트의 성격과 팀의 상황에 맞춰 선택해야 한다는 말이 정말 인상 깊었습니다.

지금까지는 CSS 라이브러리를 그냥 내가 익숙하니까, 유행이니까 쓰는 것으로만 생각했는데, 이번 글을 읽고 나서 앞으로는 “이 프로젝트에 이 라이브러리가 정말 맞는 선택일까? 다른 게 더 효율적일 수도 있지 않을까?”라는 관점에서 익숙해서 쓴다가 아니라 이유가 있어서 쓴다는 기준을 세우고 다가가야 한다는 게 중요하다는 걸 느꼈습니다 👍🏻

답글 달기
comment-user-thumbnail
2025년 11월 9일

먼저 Tailwind의 성장 배경, 그리고 tailwind도 zero-runtime css라는걸 알게 됐어요! 그리고 초기 렌더링 속도, TTFB, SEO 최적화가 중요해지면서 zero-runtime이 필요하게 됐고, 그래서 tailwind가 급격하게 사용자수가 많아졌다는 내용도 알게 됐어요. 확실히 css 파일이 없으니 개발 속도도 빨라지지만 아직도 코드의 가독성이 좀 떨어지지 않나라는 생각은 들긴 하더라구요. 호불호가 너무 갈릴것 같아요!
경빈님의 이번 아티클을 읽으면서 부트스트랩에 대한 개념도 알게 됐어요! 그런데 부트스트랩은 프레임워크이니 tailwind와 비교할 대상이 아니라는 생각도 조금 들기도 해요!
잘 봤습니다~~!!!

답글 달기