본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 11장: v3에서 v4로 마이그레이션
2026년 3월 7일·웹 개발·

11장: v3에서 v4로 마이그레이션

Tailwind CSS v3에서 v4로의 마이그레이션 가이드 — 주요 변경사항, 자동 마이그레이션 도구, 단계별 전환 전략, 그리고 흔한 문제 해결법을 다룹니다.

13분490자6개 섹션
frontend
공유
tailwind-v411 / 11
1234567891011
이전10장: 디자인 시스템 구축 실전

10장에서 디자인 시스템 구축을 다뤘습니다. 이 마지막 장에서는 기존 Tailwind CSS v3 프로젝트를 v4로 마이그레이션하는 실전 가이드를 제공합니다. 자동 마이그레이션 도구, 주요 변경사항, 단계별 전환 전략, 그리고 흔히 마주치는 문제와 해결법을 다룹니다.

자동 마이그레이션 도구

Tailwind 팀은 공식 마이그레이션 도구를 제공합니다. 대부분의 변경사항을 자동으로 처리합니다.

자동 마이그레이션 실행
bash
npx @tailwindcss/upgrade@latest

이 도구는 다음을 자동으로 처리합니다.

  • 패키지 의존성 업데이트 (tailwindcss, PostCSS 플러그인 등)
  • tailwind.config.js의 설정을 CSS @theme으로 변환
  • @tailwind 디렉티브를 @import "tailwindcss"로 변환
  • 이름이 변경된 유틸리티 클래스 업데이트
  • PostCSS 설정 업데이트
  • Vite 플러그인 설정 (해당되는 경우)
Warning

자동 마이그레이션 도구를 실행하기 전에 반드시 Git에 현재 상태를 커밋하세요. 도구가 여러 파일을 동시에 수정하므로, 문제가 발생했을 때 쉽게 되돌릴 수 있어야 합니다.

단계별 마이그레이션

1단계: 의존성 업데이트

패키지 업데이트
bash
# 기존 의존성 제거
npm uninstall tailwindcss postcss autoprefixer
 
# v4 패키지 설치 (Vite 사용 시)
npm install tailwindcss @tailwindcss/vite
 
# 또는 PostCSS 사용 시
npm install tailwindcss @tailwindcss/postcss

2단계: 빌드 도구 설정

Vite 프로젝트:

vite.config.ts
typescript
import tailwindcss from "@tailwindcss/vite";
import { defineConfig } from "vite";
 
export default defineConfig({
  plugins: [tailwindcss()],
});

PostCSS 프로젝트:

postcss.config.js
javascript
export default {
  plugins: {
    "@tailwindcss/postcss": {},
    // autoprefixer 제거 — v4가 자동 처리
  },
};

Next.js 프로젝트:

postcss.config.mjs
javascript
const config = {
  plugins: {
    "@tailwindcss/postcss": {},
  },
};
 
export default config;

3단계: CSS 진입점 변환

변환 전 (v3)
css
@tailwind base;
@tailwind components;
@tailwind utilities;
 
@layer base {
  body {
    @apply bg-white text-gray-900;
  }
}
변환 후 (v4)
css
@import "tailwindcss";
 
@layer base {
  body {
    background-color: var(--color-white);
    color: var(--color-gray-900);
  }
}

4단계: tailwind.config.js 변환

JavaScript 설정 파일의 각 섹션을 CSS @theme으로 변환합니다.

변환 전: tailwind.config.js
javascript
module.exports = {
  darkMode: 'class',
  theme: {
    extend: {
      colors: {
        primary: '#3b82f6',
        secondary: '#64748b',
      },
      fontFamily: {
        sans: ['Pretendard', 'system-ui', 'sans-serif'],
        mono: ['JetBrains Mono', 'monospace'],
      },
      spacing: {
        '18': '4.5rem',
      },
      borderRadius: {
        '4xl': '2rem',
      },
      animation: {
        'fade-in': 'fade-in 0.3s ease-out',
      },
      keyframes: {
        'fade-in': {
          from: { opacity: '0' },
          to: { opacity: '1' },
        },
      },
    },
  },
  plugins: [
    require('@tailwindcss/typography'),
    require('@tailwindcss/forms'),
  ],
}
변환 후: globals.css
css
@import "tailwindcss";
@plugin "@tailwindcss/typography";
@plugin "@tailwindcss/forms";
 
@custom-variant dark (&:where(.dark, .dark *));
 
@theme {
  --color-primary: #3b82f6;
  --color-secondary: #64748b;
 
  --font-sans: "Pretendard", system-ui, sans-serif;
  --font-mono: "JetBrains Mono", monospace;
 
  --spacing-18: 4.5rem;
 
  --radius-4xl: 2rem;
 
  --animate-fade-in: fade-in 0.3s ease-out;
}
 
@keyframes fade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

5단계: content 배열 제거

v4는 콘텐츠를 자동 감지하므로, content 배열이 필요 없습니다. 단, 특수한 경로(예: node_modules 내 컴포넌트)는 @source로 명시합니다.

@source로 추가 경로 지정
css
@import "tailwindcss";
@source "../node_modules/@shadcn/ui/components";

6단계: 유틸리티 클래스 업데이트

이름이 변경된 유틸리티를 업데이트합니다.

v3v4검색/치환 패턴
shadow-smshadow-xs전체 검색 필요
shadow (기본)shadow-sm컨텍스트 확인 필요
rounded (기본)rounded-sm컨텍스트 확인 필요
blur (기본)blur-sm컨텍스트 확인 필요
ring (기본)ring-3컨텍스트 확인 필요
ring-offset-*ring-offset-* (구문 변경)확인 필요
decoration-clonebox-decoration-clone단순 치환
decoration-slicebox-decoration-slice단순 치환
Info

그림자, 둥근 모서리, 블러의 기본 크기 스케일이 재조정되었습니다. v3에서 shadow(기본)가 v4에서는 shadow-sm이 되었으므로, v3에서 shadow-sm을 사용했다면 v4에서 shadow-xs로 변경해야 합니다. 자동 마이그레이션 도구가 이를 처리하지만, 수동으로 마이그레이션하는 경우 주의가 필요합니다.

7단계: @apply 검토

@apply는 v4에서도 지원되지만, 가능하면 네이티브 CSS로 전환하는 것이 권장됩니다.

@apply → 네이티브 CSS
css
/* v3: @apply 사용 */
.btn {
  @apply inline-flex items-center gap-2 px-4 py-2 rounded-md font-medium transition-colors;
}
 
/* v4: 네이티브 CSS + 테마 변수 */
@layer components {
  .btn {
    display: inline-flex;
    align-items: center;
    gap: var(--spacing-2);
    padding: var(--spacing-2) var(--spacing-4);
    border-radius: var(--radius-md);
    font-weight: 500;
    transition: color 0.15s, background-color 0.15s;
  }
}

주요 변경사항 체크리스트

설정 관련

  • tailwind.config.js → CSS @theme으로 전환
  • darkMode: 'class' → @custom-variant dark (...)
  • content 배열 제거 (필요 시 @source 사용)
  • plugins 배열 → @plugin 디렉티브
  • @tailwind 디렉티브 → @import "tailwindcss"

빌드 관련

  • PostCSS 플러그인을 @tailwindcss/postcss로 교체
  • autoprefixer 제거
  • Vite 사용 시 @tailwindcss/vite 플러그인 추가

CSS 관련

  • 색상이 OKLCH로 변경됨 — 커스텀 색상도 OKLCH로 전환 권장
  • @apply 사용 부분 검토 — 네이티브 CSS 전환 권장
  • 이름 변경된 유틸리티 업데이트

접근성 관련

  • ring 유틸리티 변경 확인 — ring-3 등 명시적 크기 필요
  • focus-visible 스타일 재확인

흔한 문제와 해결법

PostCSS 플러그인 충돌

Error: It looks like you're trying to use Tailwind CSS with PostCSS
but you haven't configured it correctly.

해결: postcss.config.js에서 기존 tailwindcss 플러그인을 @tailwindcss/postcss로 교체합니다.

콘텐츠 미감지

v4의 자동 감지가 특정 파일을 놓칠 수 있습니다.

해결: @source 추가
css
@import "tailwindcss";
@source "../components/**/*.tsx";
@source "../node_modules/@my-ui/**/*.js";

색상 차이

OKLCH로의 전환으로 인해 기본 색상 팔레트의 실제 색상값이 미세하게 달라졌습니다.

해결: 기존 hex 색상 유지
css
@theme {
  /* OKLCH 대신 기존 hex 값 사용 가능 */
  --color-blue-500: #3b82f6;
}

@apply 관련 에러

v4에서 @apply가 특정 컨텍스트에서 동작하지 않을 수 있습니다.

@apply 문제 해결
css
/* 문제: @apply가 @layer 밖에서 사용됨 */
.my-class {
  @apply flex items-center; /* 에러 가능 */
}
 
/* 해결: @layer 안에서 사용 */
@layer components {
  .my-class {
    @apply flex items-center; /* OK */
  }
}
 
/* 더 나은 해결: 네이티브 CSS */
@layer components {
  .my-class {
    display: flex;
    align-items: center;
  }
}

tailwind.config.js가 여전히 필요한 경우

완전한 CSS 전환이 어려운 경우, v4에서도 tailwind.config.js를 @config 디렉티브로 사용할 수 있습니다.

레거시 설정 파일 사용
css
@import "tailwindcss";
@config "../tailwind.config.js";
Tip

@config는 점진적 마이그레이션을 위한 도구입니다. 최종적으로는 모든 설정을 CSS로 이전하는 것이 목표이지만, 한 번에 전환하기 어려운 대규모 프로젝트에서는 @config를 활용한 단계적 전환이 실용적입니다.

점진적 마이그레이션 전략

대규모 프로젝트에서는 한 번에 모든 것을 전환하기보다, 단계적으로 접근하는 것이 안전합니다.

Phase 1: 인프라 전환 (1주)

  1. 패키지 업데이트
  2. 빌드 도구 설정 변경
  3. @import "tailwindcss" 전환
  4. @config로 기존 설정 연결 (임시)
  5. 빌드 확인

Phase 2: 설정 전환 (1~2주)

  1. tailwind.config.js의 테마를 @theme으로 이전
  2. 플러그인을 @plugin으로 이전
  3. darkMode 설정을 @custom-variant로 이전
  4. @config 제거
  5. tailwind.config.js 삭제

Phase 3: 코드 정리 (2~3주)

  1. 이름 변경된 유틸리티 업데이트
  2. @apply를 네이티브 CSS로 전환
  3. 색상을 OKLCH로 전환 (선택)
  4. 컨테이너 쿼리 도입 (선택)
  5. 전체 테스트 및 시각적 회귀 검사

시리즈 마무리

이 시리즈를 통해 Tailwind CSS v4의 핵심을 체계적으로 학습했습니다.

  • 1장: v4의 아키텍처 변화와 패러다임 전환
  • 2장: @theme 디렉티브와 CSS-first 설정
  • 3장: 임포트 구조와 CSS 레이어 시스템
  • 4장: OKLCH 색상 시스템
  • 5장: 컨테이너 쿼리와 반응형 디자인
  • 6장: 새로운 유틸리티와 변형
  • 7장: 고급 애니메이션과 트랜지션
  • 8장: 다크 모드와 테마 전략
  • 9장: 커스텀 변형과 플러그인 시스템
  • 10장: 디자인 시스템 구축
  • 11장: v3에서 v4로 마이그레이션

Tailwind CSS v4는 CSS의 본질에 더 가까이 다가간 프레임워크입니다. JavaScript 설정의 복잡성을 CSS의 선언적 구문으로 대체하고, 모던 CSS 기능(레이어, 컨테이너 쿼리, OKLCH, @starting-style)을 유틸리티 클래스의 간결함으로 사용할 수 있게 합니다. 이 시리즈에서 다룬 기법들을 실제 프로젝트에 적용하며, 더 빠르고 유연한 스타일링 경험을 만들어가시길 바랍니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#frontend

관련 글

웹 개발

10장: 디자인 시스템 구축 실전

Tailwind CSS v4로 프로덕션 디자인 시스템을 구축합니다. 토큰 계층 설계, 컴포넌트 라이브러리, 테마 시스템, 접근성, 팀 협업 전략을 실전 중심으로 다룹니다.

2026년 3월 5일·10분
웹 개발

9장: 커스텀 변형과 플러그인 시스템

Tailwind CSS v4의 @custom-variant, @plugin 디렉티브, CSS 기반 확장 시스템, 그리고 기존 JS 플러그인에서의 마이그레이션을 실전 중심으로 다룹니다.

2026년 3월 3일·9분
웹 개발

8장: 다크 모드와 테마 전략

Tailwind CSS v4의 다크 모드 전략, CSS 커스텀 프로퍼티 기반 런타임 테마 전환, 다중 테마 패턴, 그리고 next-themes와의 통합을 실전 중심으로 다룹니다.

2026년 3월 1일·10분
이전 글10장: 디자인 시스템 구축 실전

댓글

목차

약 13분 남음
  • 자동 마이그레이션 도구
  • 단계별 마이그레이션
    • 1단계: 의존성 업데이트
    • 2단계: 빌드 도구 설정
    • 3단계: CSS 진입점 변환
    • 4단계: tailwind.config.js 변환
    • 5단계: content 배열 제거
    • 6단계: 유틸리티 클래스 업데이트
    • 7단계: @apply 검토
  • 주요 변경사항 체크리스트
    • 설정 관련
    • 빌드 관련
    • CSS 관련
    • 접근성 관련
  • 흔한 문제와 해결법
    • PostCSS 플러그인 충돌
    • 콘텐츠 미감지
    • 색상 차이
    • @apply 관련 에러
    • tailwind.config.js가 여전히 필요한 경우
  • 점진적 마이그레이션 전략
    • Phase 1: 인프라 전환 (1주)
    • Phase 2: 설정 전환 (1~2주)
    • Phase 3: 코드 정리 (2~3주)
  • 시리즈 마무리