Skip to content

Tailwind CSS 유틸리티 규칙

18.2.1. 클래스 순서 규칙

유틸리티 클래스는 다음 순서로 작성해야 합니다.

순서카테고리예시
1레이아웃flex, grid, block, hidden, relative, absolute
2박스 모델w-, h-, p-, m-, gap-, border-
3타이포그래피text-, font-, leading-, tracking-
4시각 효과bg-, text-{color}, shadow-, opacity-, rounded-
5기타transition-, cursor-, hover:, focus:

수동으로 순서를 관리하지 않습니다. prettier-plugin-tailwindcss를 설치하여 자동 정렬해야 합니다.

bash
npm install -D prettier-plugin-tailwindcss

.prettierrc에 플러그인을 등록합니다.

json
{
  "plugins": ["prettier-plugin-tailwindcss"]
}
  • 이 플러그인은 Tailwind CSS 공식 권장 순서에 따라 클래스를 자동 정렬합니다.
  • 저장 시 자동 포매팅이 적용되므로 개발자가 순서를 암기할 필요가 없습니다.
  • CI 파이프라인에서 Prettier 검사를 수행하여 정렬되지 않은 클래스를 차단해야 합니다.

18.2.2. @apply 사용 기준

@apply는 동일한 클래스 조합이 3회 이상 반복될 때만 허용합니다.

css
/* 허용: 여러 곳에서 반복 사용되는 버튼 기본 스타일 */
@layer components {
  .btn-primary {
    @apply inline-flex items-center justify-center rounded-md bg-brand-600
           px-4 py-2 text-sm font-medium text-white
           hover:bg-brand-700 focus:outline-none focus:ring-2;
  }
}
css
/* 금지: 한두 곳에서만 사용되는 스타일 */
@layer components {
  .my-special-card {
    @apply mt-4 rounded-lg p-6;
  }
}
  • @apply를 과도하게 사용하면 Tailwind의 유틸리티 퍼스트 원칙이 훼손됩니다.
  • 반복 횟수가 3회 미만이면 템플릿에 유틸리티 클래스를 직접 작성합니다.
  • @apply로 추출한 클래스는 반드시 @layer components 내부에 정의합니다.

18.2.3. 커스텀 유틸리티

프로젝트 고유 디자인 토큰은 tailwind.config.tstheme.extend에서 정의합니다.

ts
// tailwind.config.ts
export default {
  theme: {
    extend: {
      colors: {
        brand: {
          50: '#f0f5ff',
          500: '#3b82f6',
          600: '#2563eb',
          700: '#1d4ed8',
        },
        success: '#16a34a',
        warning: '#f59e0b',
        error: '#dc2626',
      },
      spacing: {
        '4.5': '1.125rem',
        '13': '3.25rem',
        '15': '3.75rem',
      },
      borderRadius: {
        '4xl': '2rem',
      },
    },
  },
} satisfies Config
  • 디자인 시스템에서 정의한 색상, 간격, 폰트 등을 theme.extend에 등록합니다.
  • 임의 값([32px], [#ff0000])은 사용하지 않습니다. 반복되는 값은 설정 파일에 등록해야 합니다.
  • 1회성 예외 값은 임의 값 문법을 허용하되, 코드 리뷰에서 설정 파일 등록 여부를 검토합니다.

18.2.4. 인라인 스타일 금지

Vue 템플릿에서 style 바인딩을 사용하지 않습니다. Tailwind 유틸리티 클래스로 대체해야 합니다.

vue
<!-- 금지: 인라인 스타일 -->
<div :style="{ padding: '16px', backgroundColor: '#f5f5f5' }">
  내용
</div>

<!-- 올바른 예: Tailwind 유틸리티 -->
<div class="bg-gray-100 p-4">
  내용
</div>

예외 허용 조건

다음 경우에 한하여 :style 바인딩을 허용합니다.

  • 런타임에 계산되는 동적 값 (예: 사용자 입력 기반 너비, 드래그 위치)
  • CSS 변수를 동적으로 설정해야 하는 경우
vue
<!-- 예외 허용: 런타임 동적 계산 값 -->
<div
  class="absolute rounded-lg bg-white shadow-md"
  :style="{ top: `${popoverY}px`, left: `${popoverX}px` }"
>
  팝오버 내용
</div>
  • 예외 사용 시 코드 리뷰에서 Tailwind 유틸리티로 대체 가능 여부를 반드시 검토합니다.
  • 색상, 폰트, 간격 등 디자인 토큰에 해당하는 값은 인라인 스타일로 지정하지 않습니다.

TIENIPIA QUALIFIED STANDARD