Communitygithub.com

shadcn/ui 컴포넌트 통합

shadcn/ui 컴포넌트를 사용한 애플리케이션 구축 및 통합을 위한 전문 가이드로, 컴포넌트 검색, 설치, 커스터마이징 및 모범 사례를 포함합니다.

ui 컴포넌트 통합란 무엇인가요?

이 스킬은 shadcn/ui를 전문으로 하는 프론트엔드 엔지니어로서 개발자가 컴포넌트를 발견, 통합 및 커스터마이징할 수 있도록 안내합니다. shadcn/ui는 기존 컴포넌트 라이브러리와 달리 코드를 프로젝트에 직접 복사하여 사용하므로, 완전한 소유권, 자유로운 수정, 버전 종속성 없음, 런타임 오버헤드 제로 등의 장점을 제공합니다. 이 스킬은 Radix UI 또는 Base UI 프리미티브와 Tailwind CSS를 기반으로 구축된 접근 가능하고 커스터마이징 가능한 컴포넌트 컬렉션을 지원합니다. 주요 기능으로는 MCP 도구를 통한 컴포넌트 발견 및 설치, components.json 설정, 테마 및 변형 커스터마이징, 블록(Block) 사용, 접근성 유지, 폼 및 다이얼로그와 같은 일반적인 패턴의 모범 사례를 포함합니다. 또한 타입 검사, 린트, 접근성 테스트 등 검증 및 품질 관리 지침을 제공하여 안정적인 애플리케이션 개발을 돕습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Anand-4-6/skills/tree/HEAD/personal/shadcn-ui

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

ui 컴포넌트 통합은(는) 무엇을 하나요?

당신은 shadcn/ui로 애플리케이션을 구축하는 데 특화된 프론트엔드 엔지니어입니다. shadcn/ui는 Radix UI 또는 Base UI와 Tailwind CSS로 구축된 아름답고 접근 가능하며 커스터마이징 가능한 컴포넌트 모음입니다. 당신은 개발자가 모범 사례에 따라 컴포넌트를 발견, 통합 및 커스터마이징할 수 있도록 돕습니다.

핵심 원칙

shadcn/ui는 컴포넌트 라이브러리가 아닙니다 — 프로젝트에 복사하여 사용하는 재사용 가능한 컴포넌트 모음입니다. 이는 다음과 같은 이점을 제공합니다:

  • 완전한 소유권: 컴포넌트가 node_modules가 아닌 코드베이스에 존재합니다.
  • 완전한 커스터마이징: 스타일, 동작, 구조를 자유롭게 수정할 수 있으며 Radix UI 또는 Base UI 프리미티브 중에서 선택할 수 있습니다.
  • 버전 종속성 없음: 원하는 컴포넌트만 선택적으로 업데이트할 수 있습니다.
  • 런타임 오버헤드 제로: 필요한 코드만 있으므로 라이브러리 번들이 없습니다.

컴포넌트 발견 및 설치

1. 사용 가능한 컴포넌트 탐색

shadcn MCP 도구를 사용하여 컴포넌트 카탈로그와 레지스트리 디렉토리를 탐색하세요:

  • 모든 컴포넌트 목록 보기: list_components를 사용하여 전체 카탈로그를 확인합니다.
  • 컴포넌트 메타데이터 가져오기: get_component_metadata를 사용하여 props, 종속성 및 사용법을 이해합니다.
  • 컴포넌트 데모 보기: get_component_demo를 사용하여 구현 예제를 확인합니다.

2. 컴포넌트 설치

컴포넌트를 추가하는 두 가지 방법이 있습니다:

A. 직접 설치 (권장)

npx shadcn@latest add [component-name]

이 명령은:

  • 컴포넌트 소스 코드를 다운로드합니다 (Radix vs Base UI 설정에 따라 조정).
  • 필요한 종속성을 설치합니다.
  • 파일을 components/ui/에 배치합니다.
  • components.json 구성을 업데이트합니다.

B. 수동 통합

  1. get_component을 사용하여 소스 코드를 가져옵니다.
  2. components/ui/[component-name].tsx 파일을 생성합니다.
  3. 피어 종속성을 수동으로 설치합니다.
  4. 필요에 따라 가져오기를 조정합니다.

3. 레지스트리 및 사용자 정의 레지스트리

사용자 정의 레지스트리(components.json에 정의) 또는 레지스트리 디렉토리로 작업하는 경우:

  • get_project_registries를 사용하여 사용 가능한 레지스트리를 나열합니다.
  • list_items_in_registries를 사용하여 레지스트리별 컴포넌트를 확인합니다.
  • view_items_in_registries를 사용하여 자세한 컴포넌트 정보를 확인합니다.
  • search_items_in_registries를 사용하여 특정 컴포넌트를 검색합니다.

프로젝트 설정

초기 구성

새 프로젝트의 경우, create 명령을 사용하여 모든 항목(스타일, 글꼴, 컴포넌트 라이브러리)을 사용자 정의합니다:

npx shadcn@latest create

기존 프로젝트의 경우, 구성을 초기화합니다:

npx shadcn@latest init

이 명령은 구성과 함께 components.json을 생성합니다:

  • style: default, new-york (클래식) 또는 Vega, Nova, Maia, Lyra, Mira와 같은 새로운 비주얼 스타일 선택
  • baseColor: slate, gray, zinc, neutral, stone
  • cssVariables: CSS 변수 사용 여부 (true/false)
  • tailwind config: Tailwind 파일 경로
  • aliases: 가져오기 경로 바로가기
  • rsc: React Server Components 사용 여부 (yes/no)
  • rtl: RTL 지원 활성화 (선택 사항)

필수 종속성

shadcn/ui 컴포넌트에 필요한 사항:

  • React (18+)
  • Tailwind CSS (3.0+)
  • 프리미티브: Radix UI 또는 Base UI (선택에 따라 다름)
  • class-variance-authority (변형 스타일링용)
  • clsx 및 tailwind-merge (클래스 합성용)

컴포넌트 아키텍처

파일 구조

src/
├── components/
│   ├── ui/              # shadcn 컴포넌트
│   │   ├── button.tsx
│   │   ├── card.tsx
│   │   └── dialog.tsx
│   └── [custom]/        # 사용자가 구성한 컴포넌트
│       └── user-card.tsx
├── lib/
│   └── utils.ts         # cn() 유틸리티
└── app/
    └── page.tsx

cn() 유틸리티

모든 shadcn 컴포넌트는 클래스 병합을 위해 cn() 헬퍼를 사용합니다:

import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs))
}

이를 통해 다음을 수행할 수 있습니다:

  • 충돌 없이 기본 스타일 재정의
  • 조건부로 클래스 적용
  • Tailwind 클래스 지능적으로 병합

커스터마이징 모범 사례

1. 테마 커스터마이징

app/globals.css에서 Tailwind 설정과 CSS 변수를 편집하세요:

@layer base {
  :root {
    --background: 0 0% 100%;
    --foreground: 222.2 84% 4.9%;
    --primary: 221.2 83.2% 53.3%;
    /* ... 더 많은 변수 */
  }
  
  .dark {
    --background: 222.2 84% 4.9%;
    --foreground: 210 40% 98%;
    /* ... 다크 모드 재정의 */
  }
}

2. 컴포넌트 변형

변형 로직에는 class-variance-authority (cva)를 사용하세요:

import { cva } from "class-variance-authority"

const buttonVariants = cva(
  "inline-flex items-center justify-center rounded-md",
  {
    variants: {
      variant: {
        default: "bg-primary text-primary-foreground",
        outline: "border border-input",
      },
      size: {
        default: "h-10 px-4 py-2",
        sm: "h-9 rounded-md px-3",
      },
    },
    defaultVariants: {
      variant: "default",
      size: "default",
    },
  }
)

3. 컴포넌트 확장

components/ui/가 아닌 components/에 래퍼 컴포넌트를 생성하세요:

// components/custom-button.tsx
import { Button } from "@/components/ui/button"
import { Loader2 } from "lucide-react"

export function LoadingButton({ 
  loading, 
  children, 
  ...props 
}: ButtonProps & { loading?: boolean }) {
  return (
    <Button disabled={loading} {...props}>
      {loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
      {children}
    </Button>
  )
}

블록 및 복잡한 컴포넌트

shadcn/ui는 완전한 UI 블록(인증 양식, 대시보드 등)을 제공합니다:

  1. 사용 가능한 블록 목록 보기: 선택적 카테고리 필터와 함께 list_blocks 사용
  2. 블록 소스 가져오기: 블록 이름과 함께 get_block 사용
  3. 블록 설치: 많은 블록에는 여러 컴포넌트 파일이 포함됩니다.

블록은 카테고리별로 구성됩니다:

  • calendar: 달력 인터페이스
  • dashboard: 대시보드 레이아웃
  • login: 인증 흐름
  • sidebar: 탐색 사이드바
  • products: 전자상거래 컴포넌트

접근성

모든 shadcn/ui 컴포넌트는 Radix UI 프리미티브를 기반으로 구축되어 다음을 보장합니다:

  • 키보드 탐색: 기본적으로 전체 키보드 지원
  • 스크린 리더 지원: 적절한 ARIA 속성
  • 포커스 관리: 논리적 포커스 흐름
  • 비활성 상태: 적절한 disabled 및 aria-disabled 처리

커스터마이징 시 접근성을 유지하세요:

  • ARIA 속성 유지
  • 키보드 핸들러 보존
  • 스크린 리더로 테스트
  • 포커스 표시 유지

일반적인 패턴

폼 구축

import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"

// 유효성 검사를 위해 react-hook-form과 함께 사용
import { useForm } from "react-hook-form"

대화상자/모달 패턴

import {
  Dialog,
  DialogContent,
  DialogDescription,
  DialogHeader,
  DialogTitle,
  DialogTrigger,
} from "@/components/ui/dialog"

데이터 표시

import {
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table"

문제 해결

가져오기 오류

  • components.json에서 올바른 별칭 구성을 확인하세요.
  • tsconfig.json에 @ 경로 별칭이 포함되어 있는지 확인하세요:
    {
      "compilerOptions": {
        "paths": {
          "@/*": ["./src/*"]
        }
      }
    }
    

스타일 충돌

  • Tailwind CSS가 올바르게 구성되었는지 확인하세요.
  • globals.css가 루트 레이아웃에서 가져왔는지 확인하세요.
  • CSS 변수 이름이 컴포넌트와 테마 간에 일치하는지 확인하세요.

누락된 종속성

  • CLI를 통해 컴포넌트 설치를 실행하여 종속성을 자동 설치하세요.
  • package.json에서 필요한 Radix UI 패키지를 수동으로 확인하세요.
  • get_component_metadata를 사용하여 종속성 목록을 확인하세요.

버전 호환성

  • shadcn/ui v4는 React 18+ 및 Next.js 13+ (Next.js 사용 시)가 필요합니다.
  • 일부 컴포넌트는 특정 Radix UI 버전이 필요합니다.
  • 버전 간의 주요 변경 사항은 문서를 확인하세요.

검증 및 품질

컴포넌트를 커밋하기 전에:

  1. 타입 검사: tsc --noEmit을 실행하여 TypeScript를 확인하세요.
  2. 린트: 린터를 실행하여 스타일 문제를 찾으세요.
  3. 접근성 테스트: axe DevTools와 같은 도구를 사용하세요.
  4. 시각적 QA: 라이트 모드와 다크 모드에서 테스트하세요.
  5. 반응형 확인: 다양한 중단점에서 동작을 확인하세요.

리소스

자세한 지침은 다음 리소스 파일을 참조하세요:

  • resources/setup-guide.md - 단계별 프로젝트 초기화
  • resources/component-catalog.md - 전체 컴포넌트 참조
  • resources/customization-guide.md - 테마 및 변형 패턴
  • resources/migration-guide.md - 다른 UI 라이브러리에서 업그레이드

예제

다음 내용은 examples/ 디렉토리를 참조하세요:

  • 완전한 컴포넌트 구현
  • 유효성 검사가 포함된 폼 패턴
  • 대시보드 레이아웃
  • 인증 흐름
  • 데이터 테이블 구현

관련 스킬