디자인에서 화면까지: Tailwind CSS로 시작하는 반응형 UI 워크플로우
Figma 디자인을 Tailwind CSS로 반응형·실무용 인터페이스로 옮기는 방법을 다룹니다. 레이아웃 구조 설계부터 커스텀 브레이크포인트, 컨테이너 쿼리까지 단계별로 따라갈 수 있습니다.
소개
현대적인 인터페이스는 하나의 화면 크기에만 머물지 않습니다. 사용자는 휴대폰, 태블릿, 대형 모니터 등 다양한 기기에서 여러분의 앱을 사용합니다. 그래서 반응형 UI는 선택이 아니라 필수입니다. 특히 웹 앱이나 마케팅 사이트를 만든다면 더더욱 그렇습니다.
Tailwind CSS가 사랑받는 이유는 유틸리티 퍼스트(utility‑first) 접근 방식 덕분입니다. 컴포넌트마다 새로운 CSS를 작성하는 대신, 작은 기능 단위의 클래스를 HTML에 바로 조합해서 붙입니다. 특히 Figma 같은 도구에서 만든 시각 디자인을 실제 반응형 레이아웃으로 옮길 때 이 방식이 굉장히 강력합니다.
이 글에서는 Tailwind CSS를 활용해 정적인 디자인을 반응형 화면으로 옮기는 입문자 친화적인 워크플로우를 단계별로 살펴봅니다. 다룰 내용은 다음과 같습니다.
- Tailwind로 반응형 UI를 사고하는 방법
- Figma 디자인을 Tailwind 유틸리티로 매핑하는 법
- 뷰포트 기반 반응형을 위한 브레이크포인트 사용법
- Tailwind CSS 4에서의 컨테이너 쿼리로 컴포넌트 단위 레이아웃 제어하기
- 어떤 프로젝트에도 재사용할 수 있는 단계별 프로세스
왜 반응형 UI가 중요한가
반응형 UI란 레이아웃과 컴포넌트가 다음을 만족하는 것을 의미합니다.
- 모바일, 태블릿, 데스크톱에서 모두 보기 좋고
- 다양한 폭(때로는 높이)에도 자연스럽게 적응하며
- 가독성, 클릭/탭 가능 영역, 내비게이션 등 사용성을 유지하는 것
데스크톱만 먼저 디자인하고 나중에 모바일을 억지로 끼워 넣기 시작하면, 레이아웃과 계속 싸우게 되는 경우가 많습니다. Tailwind는 모바일 퍼스트로 디자인하고, 더 큰 화면으로 갈수록 점진적으로 확장하는 방식을 쉽게 만들어 줍니다.
핵심 개념은 두 가지입니다.
- 뷰포트 반응형성(Viewport responsiveness): 브라우저 창(뷰포트) 크기에 따라 스타일이 바뀝니다. (Tailwind의 브레이크포인트)
- 컴포넌트 반응형성(Component responsiveness): 컴포넌트가 전체 뷰포트가 아니라 부모 컨테이너의 크기에 따라 바뀝니다. (Tailwind v4의 컨테이너 쿼리)
실제 프로젝트에서는 이 둘을 모두 사용하게 됩니다.
디자인에서 코드로: Tailwind가 좋은 이유
Tailwind의 유틸리티 퍼스트 철학 덕분에 다음과 같이 HTML을 작성하게 됩니다.
<button class="px-4 py-2 rounded-md bg-indigo-600 text-white text-sm md:text-base"> Get started </button>
각 클래스는 아주 작은 역할 하나씩만 담당합니다.
px-4 py-2→ 패딩rounded-md→ 테두리 반경bg-indigo-600→ 배경색text-sm/md:text-base→md브레이크포인트에서 바뀌는 글자 크기
HTML과 CSS 파일을 왔다 갔다 할 필요 없이, 레이아웃, 간격, 타이포그래피가 HTML 안에 함께 녹아 있습니다. 디자인을 따라 구현할 때 엄청난 장점이 됩니다.
- Figma에서 간격 토큰 확인 → Tailwind 간격 스케일(
4,6,8등)과 매핑 - 폰트 크기와 줄 간격 확인 → Tailwind 타이포그래피 유틸리티(
text-sm,leading-relaxed등)와 매핑 - 그리드와 컬럼 확인 →
grid,grid-cols-2,lg:grid-cols-3등으로 표현
Tailwind를 사용하면 마치 클래스로 디자인을 말하듯이 구현할 수 있습니다.
1단계: 디자인 준비하기 (Figma 쪽 작업)
HTML을 한 줄이라도 쓰기 전에, 디자인이 Tailwind 친화적으로 구조화되어 있는지 먼저 확인해야 합니다.
다음 네 가지에 집중해 보세요.
1. 일관된 간격 시스템
13px, 27px, 41px처럼 애매한 값 대신, 규칙적인 간격 스케일을 만듭니다.
- 4px, 8px, 12px, 16px, 24px, 32px, 48px …
Tailwind의 기본 spacing 스케일은 4px 단위(예: 1 = 0.25rem, 보통 4px 기준)입니다. 디자인 토큰을 여기에 최대한 맞추면 좋습니다.
- 16px →
p-4또는m-4 - 24px →
p-6 - 32px →
p-8
2. 타이포그래피 스케일
제목과 본문에 사용할 스타일을 소수만 정해 둡니다. 예를 들어:
- H1: 32px, bold
- H2: 24px, semi‑bold
- Body: 16px, normal
- Small: 14px, normal
이렇게 정의하면 Tailwind에서 자연스럽게 다음과 같이 매핑할 수 있습니다.
text-3xl font-boldtext-2xl font-semiboldtext-basetext-sm
3. 재사용 가능한 컴포넌트
여러 번 반복되는 요소는 컴포넌트로 디자인해 둡니다.
- 버튼(Button)
- 카드(Card)
- 내비게이션 아이템
- 폼 필드
각 컴포넌트는 패딩, 테두리 반경, 글자 크기, 상태(hover, focus 등)가 명확해야 합니다. Figma에서 컴포넌트를 깔끔하게 만들어 둘수록 Tailwind 클래스 집합으로 옮기기가 쉬워집니다.
4. 기본적인 반응형 동작
가능하다면 주요 화면에 대해 모바일과 데스크톱 버전을 모두 만듭니다.
- 히어로 섹션이 모바일과 데스크톱에서 어떻게 달라지는지
- 내비게이션이 작은 화면에서 메뉴(햄버거 메뉴 등)로 접히는지
- 세 개의 카드가 모바일에서는 수직 스택으로 바뀌는지
이런 변형들을 나중에 Tailwind의 브레이크포인트로 옮기게 됩니다.
2단계: HTML로 레이아웃 뼈대 만들기
먼저 어떤 스타일도 넣지 않은 순수 HTML로 시작합니다. 구조에만 집중하세요.
예를 들어, 간단한 마케팅 페이지를 만든다고 해 보겠습니다.
<body> <header> <nav> <div>Logo</div> <ul> <li>Features</li> <li>Pricing</li> <li>Contact</li> </ul> <button>Sign in</button> </nav> </header> <main> <section> <h1>Build responsive UIs faster</h1> <p>Turn your designs into production-ready interfaces with Tailwind CSS.</p> <button>Get started</button> </section> <section> <div>Card 1</div> <div>Card 2</div> <div>Card 3</div> </section> </main> </body>
header, main, section, nav, ul, button처럼 시맨틱 태그를 신경 써서 사용합니다. 이 “뼈대” 위에 Tailwind 유틸리티를 입혀 나갈 것입니다.
3단계: Tailwind로 기본(모바일) 레이아웃 스타일링
이제 Tailwind를 적용해 모바일 기준으로 스타일을 입힙니다.
다음과 같은 형태가 될 수 있습니다.
<body class="bg-slate-50 text-slate-900"> <header class="border-b border-slate-200"> <nav class="mx-auto max-w-5xl flex items-center justify-between px-4 py-3"> <div class="text-lg font-semibold">Logo</div> <ul class="hidden gap-6 text-sm font-medium md:flex"> <li><a href="#" class="hover:text-indigo-600">Features</a></li> <li><a href="#" class="hover:text-indigo-600">Pricing</a></li> <li><a href="#" class="hover:text-indigo-600">Contact</a></li> </ul> <button class="rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-medium text-white"> Sign in </button> </nav> </header> <main class="mx-auto max-w-5xl px-4 py-10"> <section class="space-y-4"> <h1 class="text-3xl font-bold tracking-tight">Build responsive UIs faster</h1> <p class="text-slate-600"> Turn your designs into production-ready interfaces with Tailwind CSS. </p> <button class="rounded-md bg-indigo-600 px-4 py-2 text-sm font-medium text-white"> Get started </button> </section> <section class="mt-10 grid gap-4"> <div class="rounded-lg bg-white p-4 shadow-sm">Card 1</div> <div class="rounded-lg bg-white p-4 shadow-sm">Card 2</div> <div class="rounded-lg bg-white p-4 shadow-sm">Card 3</div> </section> </main> </body>
여기서는 모든 것이 여전히 단일 컬럼 기반의 모바일 친화적인 레이아웃입니다. 작은 화면(모바일 뷰포트)에서 보기 좋게 만든 뒤에, 그 다음 단계로 더 큰 화면에 맞춰 확장해 나가면 됩니다.
4단계: Tailwind 브레이크포인트로 반응형 동작 추가하기
Tailwind의 브레이크포인트는 모바일 퍼스트 방식으로, 접두사(prefix)로 적용합니다.
sm:–min-width: 640px부터 적용md:–min-width: 768pxlg:–min-width: 1024pxxl:–min-width: 1280px
예를 들어 md:grid-cols-3는 “가로 폭이 768px 이상일 때 3 컬럼 그리드로 전환하라”는 의미입니다.
카드 섹션을 이렇게 수정해 보겠습니다.
<section class="mt-10 grid gap-4 md:grid-cols-3"> <!-- Cards --> </section>
이제 모바일에서는 카드가 수직으로 쌓이고, 태블릿·데스크톱에서는 3열 그리드가 됩니다.
더 세밀한 제어를 위한 커스텀 브레이크포인트
디자인에서 특정 너비(예: 900px)에서 레이아웃이 바뀌어야 한다면 커스텀 브레이크포인트를 tailwind.config.js에 정의할 수 있습니다.
export default { theme: { extend: { screens: { 'tablet': '900px', 'desktop': '1200px', }, }, }, };
이제 HTML에서 다음처럼 사용할 수 있습니다.
<section class="grid gap-4 tablet:grid-cols-2 desktop:grid-cols-3"> <!-- Cards --> </section>
이렇게 하면 Tailwind의 동작을 Figma에서 정의한 브레이크포인트와 정확히 맞출 수 있습니다.
5단계: 컨테이너 쿼리 사용하기 (Tailwind CSS 4)
뷰포트 브레이크포인트도 중요하지만, 어떤 컴포넌트는 여러 맥락(context) 안에서 쓰이기도 합니다.
- 좁은 사이드바 안에 놓일 때
- 페이지의 전체 폭을 차지하는 메인 영역 안에 놓일 때
이럴 때는 전체 뷰포트 크기가 아니라, 컴포넌트가 들어 있는 컨테이너의 가용 너비에 따라 레이아웃을 바꾸고 싶을 수 있습니다. Tailwind CSS 4의 **컨테이너 쿼리(container queries)**가 바로 이런 문제를 해결해 줍니다.
컨테이너 쿼리 활성화하기
먼저 어떤 요소를 “컨테이너”로 지정한 뒤, 그 안의 자식 요소를 컨테이너 크기에 따라 스타일링합니다.
예시:
<section class="@container card-grid mt-10"> <div class="grid gap-4 @lg:grid-cols-3"> <!-- Cards --> </div> </section>
여기서 일어나는 일을 정리해 보면:
@container는 이<section>요소를 컨테이너 컨텍스트로 만듭니다.- 내부 그리드에 있는
@lg:grid-cols-3는 “뷰포트가 아니라 컨테이너가lg크기에 도달했을 때 3열 그리드를 사용하라”는 의미입니다.
이 방식은 동일한 컴포넌트가 서로 다른 레이아웃 맥락에서 재사용될 때 강력합니다.
- 좁은 컬럼에 들어갈 때는 계속 단일 컬럼 유지
- 넓은 메인 영역에 들어갈 때는 자동으로 여러 컬럼으로 전환
컨테이너 쿼리를 사용하면 페이지 전체 브레이크포인트에 덜 의존하고, 진짜 재사용 가능한 반응형 컴포넌트를 만들 수 있습니다.
6단계: Figma → Tailwind 도구들 (도움은 되지만 만능은 아님)
워크플로우를 빠르게 해 주는 다양한 도구들이 있습니다.
- 선택한 요소에서 Tailwind 클래스를 생성해 주는 Figma 플러그인
- DOM 요소에 대응되는 Tailwind 유틸리티를 브라우저에서 보여 주는 확장 프로그램
- Tailwind 토큰을 기반으로 구축된 디자인 시스템들
이런 도구들은 분명 유용하지만, Tailwind 자체를 이해하는 것의 대체재는 아닙니다. 여전히 다음을 스스로 이해하고 있어야 합니다.
- Tailwind의 spacing, color, typography 스케일
- flexbox와 grid 유틸리티가 어떻게 동작하는지
- 반응형 접두사와 컨테이너 쿼리의 개념
도구는 학습을 피해 가기 위한 수단이 아니라, 핵심 개념을 이해하고 난 뒤 속도를 높이는 용도로 사용하는 것이 좋습니다.
다시 쓰기 좋은 입문용 워크플로우 정리
어떤 프로젝트에도 적용할 수 있는 간단한 워크플로우를 정리해 보겠습니다.
-
Figma에서 깔끔하게 디자인하기
- 일관된 간격·타이포그래피 스케일 사용
- 주요 화면에 대해 모바일 + 데스크톱 버전 정의
- 버튼, 카드, 내비게이션 등 구조가 명확한 컴포넌트 설계
-
시맨틱 HTML 뼈대 만들기
- 먼저 구조와 접근성에 집중
- 레이아웃이 논리적으로 맞는지 확인할 때까지 스타일은 신경 쓰지 않기
-
Tailwind로 모바일 기준 베이스 스타일링
- 유틸리티로 간격, 타이포그래피, 색상 적용
- 단일 컬럼, 스크롤 가능, 터치 친화적인 레이아웃을 목표로 하기
-
브레이크포인트로 반응형 동작 추가
- 기본 브레이크포인트(
sm,md,lg,xl)를 사용하거나 프로젝트에 맞게 커스텀 정의 - 그리드 컬럼 수, flex 방향, 폰트 크기, 간격 등을 단계적으로 조정
- 기본 브레이크포인트(
-
컨테이너 쿼리로 컴포넌트 향상
- 중요한 래퍼(wrapper)에
@container지정 - 컨테이너 크기에 따라 컴포넌트 레이아웃이 바뀌도록 설정
- 중요한 래퍼(wrapper)에
-
디테일 다듬기와 반복
- 브라우저와 Figma를 나란히 두고 비교
- 간격, 정렬, 시각적 계층이 디자인과 최대한 일치할 때까지 유틸리티를 미세 조정
마무리
디자인 도구, CSS, 다양한 화면 크기 사이를 오가다 보면 반응형 UI를 만드는 일이 부담스럽게 느껴질 수 있습니다. Tailwind CSS는 여러분이 디자인에서 본 것을 구현하는 과정을 시각적으로 직관적인 유틸리티 퍼스트 방식으로 바꾸어 줍니다.
명확한 스케일을 기반으로 디자인하고, 시맨틱 HTML 구조를 먼저 쌓은 뒤, 그 위에 Tailwind 유틸리티를 레이어처럼 쌓아 올리면 — 먼저 모바일, 그 다음 더 큰 뷰포트와 컨테이너에 맞춰 확장해 가는 식으로 — 디자인에서 실제 화면으로 이어지는 흐름이 부드러워집니다.
Tailwind CSS 4의 커스텀 브레이크포인트와 컨테이너 쿼리를 활용하면, 단순히 “모바일과 데스크톱에서 그럭저럭 보이는” 수준을 넘어, 실제로 놓이는 공간에 맞게 적응하는 인터페이스를 만들 수 있습니다.
우선 한 화면부터 시작해 이 글의 워크플로우를 따라가 보세요. 몇 번 반복하다 보면, 어떤 Figma 디자인이든 자연스럽게 반응형 Tailwind UI로 옮기는 근육 기억이 생길 것입니다.