← 목록으로
Claude Code 스킬로 React 코딩 컨벤션 자동화하기

들어가며

AI 코드 어시스턴트에게 "React 컴포넌트 만들어줘"라고 말하면, 코드는 나옵니다. 하지만 내 팀의 컨벤션대로 나올까요? props 네이밍, 폴더 구조, 상태관리 패턴, 테스트 방식 — 매번 같은 피드백을 반복하고 있다면, 문제는 AI가 아니라 컨텍스트의 부재입니다.

Claude Code에는 이 문제를 해결하는 기능이 있습니다. 스킬(Skill) 시스템입니다. 스킬은 .claude/skills/ 디렉토리에 마크다운 파일로 정의하는 규칙 세트로, Claude가 코드를 작성할 때 자동으로 참조합니다.

이 글에서는 직접 만든 load28-react 스킬의 설계 의도, 구조, 사용법, 그리고 확장 방법을 다룹니다.

왜 만들었는가

React 프로젝트에서 반복되는 문제가 있었습니다.

  1. 컴포넌트 내부에 컴포넌트를 정의해서 매 렌더마다 state가 소실되는 버그
  2. useEffect에서 파생 상태를 계산해서 불필요한 이중 렌더가 발생하는 코드
  3. props를 state에 복사해서 동기화가 어긋나는 패턴
  4. any 타입이 전파되어 TypeScript를 쓰는 의미가 없어지는 상황

사람이 리뷰할 때도 이런 패턴을 매번 잡아내기 어렵습니다. 78개의 규칙을 머릿속에 유지하면서 코드를 검토하는 건 비현실적입니다. 그래서 이 검증 과정 자체를 Claude에게 위임하기로 했습니다.

핵심 원칙은 하나입니다: "기억에 의존하지 마라. 검증을 강제하라."

스킬의 구조

load28-react 스킬은 3단계 프로토콜과 6개 카테고리의 규칙, 그리고 레퍼런스 코드로 구성됩니다.

.claude/skills/load28-react/
├── SKILL.md                    # 3단계 프로토콜 정의
├── architecture.md             # 아키텍처 규칙 (A-01~10)
├── component-patterns.md       # 컴포넌트 패턴 (C-01~15)
├── naming-conventions.md       # 네이밍 규칙 (N-01~08)
├── state-and-data.md           # 상태관리 & 데이터 흐름 (S-01~17)
├── performance.md              # 성능 최적화 (P-01~14)
├── testing-a11y.md             # 테스트 & 접근성 (T-01~15)
└── reference-code/             # 패턴별 레퍼런스 구현
    ├── _tags.md                # 태그 정의서
    ├── compound-component--context--generic.md
    ├── http-client--acl--dependency-inversion.md
    ├── msw--mock--integration-test.md
    └── ... (28개 레퍼런스 파일)

3단계 프로토콜

SKILL.md가 전체 워크플로우를 정의합니다. Claude는 코드를 작성할 때 반드시 이 순서를 따릅니다.

Phase 1: 레퍼런스 조회 — 구현을 시작하기 전에 reference-code/ 디렉토리에서 관련 패턴을 검색합니다. 파일명이 태그 형식(tag1--tag2--tag3.md)으로 되어 있어 필요한 패턴을 빠르게 찾을 수 있습니다.

Phase 2: 검증 — 코드 작성 후 78개 규칙을 기준으로 검증합니다. 모든 규칙을 매번 확인하는 것은 아니고, 고빈도 위반 규칙(C-01, C-02, S-02, S-06, P-04, P-05, T-04, N-03, N-04)은 반드시 확인합니다.

Phase 3: 리포팅 — 적용한 규칙, 수정한 내용, 완료 상태를 구조화된 형식으로 보고합니다.

6개 카테고리, 78개 규칙

각 규칙은 분류(ALWAYS/NEVER), WHY(이유), 코드 예시, 검증 기준으로 구성됩니다. 몇 가지 대표적인 규칙을 살펴보겠습니다.

A-01: 단방향 의존성

허용: app → features → shared
금지: shared → features, features → features

양방향 의존성은 순환 참조를 만들고, 하나의 변경이 예측 불가능한 곳에 전파됩니다. 이 규칙으로 Feature 간 직접 import를 차단합니다.

S-02: useEffect 내 파생 상태 계산 금지

// ❌ useEffect로 파생 상태 → 이중 렌더
const [items, setItems] = useState<Item[]>([]);
const [total, setTotal] = useState(0);
useEffect(() => {
  setTotal(items.reduce((sum, item) => sum + item.price, 0));
}, [items]);

// ✅ 렌더 중 직접 계산
const total = items.reduce((sum, item) => sum + item.price, 0);

useEffect로 파생 상태를 계산하면 렌더가 두 번 발생합니다. 렌더 본문에서 직접 계산하거나, 비용이 크면 useMemo를 사용합니다.

C-01: 컴포넌트 내부 컴포넌트 정의 금지

// ❌ 매 렌더마다 Child가 새 타입으로 생성 → state 소실
function Parent() {
  const Child = () => <input />;
  return <Child />;
}

// ✅ 외부에 정의
const Child = () => <input />;
function Parent() {
  return <Child />;
}

렌더 함수 안에서 컴포넌트를 정의하면 매 렌더마다 새로운 함수 참조가 생성됩니다. React reconciler가 이를 다른 타입으로 인식해 state가 소실됩니다.

레퍼런스 코드

reference-code/ 디렉토리에는 28개의 패턴별 구현 예시가 있습니다. 파일명 자체가 태그 역할을 합니다.

compound-component--context--generic.md
http-client--acl--dependency-inversion.md
controlled--uncontrolled--discriminated-union.md
msw--mock--integration-test.md

레퍼런스 코드의 핵심 제약은 도메인 비의존성입니다. workspace, chat, order 같은 프로젝트 특화 용어 대신 Entity, Resource 같은 범용 플레이스홀더를 사용합니다. "이 레퍼런스를 다른 프로젝트에 그대로 복사할 수 있는가?"가 판단 기준입니다.

CRUD, 인증, 검색, 리스트 필터링 같은 공통 시나리오는 별도 디렉토리로 분류되어 있어, 복잡한 기능을 구현할 때 여러 레퍼런스를 조합할 수 있습니다.

사용 방법

기본 사용

스킬은 .claude/skills/ 디렉토리에 두는 것만으로 활성화됩니다. Claude Code가 프로젝트를 열면 자동으로 스킬을 인식합니다.

# 레포지토리에 스킬 추가
git clone https://github.com/load28/remote.git
cp -r remote/.claude/skills/load28-react .claude/skills/

이후 Claude에게 React 코드를 요청하면, 3단계 프로토콜에 따라 레퍼런스를 참조하고, 규칙을 검증한 결과를 함께 보고합니다.

검증 결과 예시

Claude가 컴포넌트를 작성하면 다음과 같은 리포트가 함께 나옵니다.

[Phase 2 검증 결과]
✅ C-01: 외부에 컴포넌트 정의 — 통과
✅ S-02: 파생 상태 렌더 본문에서 계산 — 통과
✅ N-03: 이벤트 핸들러 handle* 접두사 — 통과
⚠️ C-04: props 8개 → 7개 이하로 분리 필요
  → UserCard에서 avatar 관련 props를 AvatarProps로 그룹화

단순히 코드를 생성하는 것이 아니라, 왜 그렇게 작성했는지를 규칙 번호와 함께 설명합니다.

확장 방법

규칙 추가

기존 카테고리에 새 규칙을 추가하는 것이 가장 간단합니다. 규칙은 일관된 포맷을 따릅니다.

## S-18: 새로운 상태관리 규칙

**분류:** NEVER

**WHY:** 이 패턴이 왜 문제인지 한 문장으로 설명합니다.

// ❌ BAD: 안티패턴 코드
// ✅ GOOD: 권장 패턴 코드

**검증:** 이 규칙 위반을 어떻게 탐지하는지 기준을 기술합니다.

각 규칙에 WHY가 반드시 포함되어야 합니다. "왜"가 없는 규칙은 맹목적인 관례가 되고, Claude도 상황에 맞게 유연하게 적용하지 못합니다.

레퍼런스 코드 추가

새로운 패턴이 필요하면 reference-code/에 태그 형식의 파일을 추가합니다.

  1. _tags.md에 새 태그를 등록합니다
  2. tag1--tag2--tag3.md 형식으로 파일을 생성합니다
  3. 도메인 비의존적인 코드로 작성합니다
# 예: React Hook Form + Zod 검증 패턴 추가
touch reference-code/react-hook-form--zod--validation.md

새 카테고리 추가

프로젝트에 특화된 규칙이 필요하다면 새 마크다운 파일을 추가합니다. 예를 들어 Next.js App Router 규칙이라면 nextjs-app-router.md를 추가하고, SKILL.md의 검증 목록에 새 카테고리를 포함시킵니다.

다른 기술 스택으로 확장

load28-react는 React에 특화되어 있지만, 같은 구조로 다른 기술 스택의 스킬을 만들 수 있습니다.

.claude/skills/
├── load28-react/       # React 컨벤션
├── load28-nestjs/      # NestJS 백엔드 컨벤션
└── load28-infra/       # 인프라/배포 컨벤션

3단계 프로토콜(레퍼런스 조회 → 검증 → 리포팅)은 기술 스택과 무관하게 재사용할 수 있는 프레임워크입니다. 규칙 내용만 바꾸면 됩니다.

마치며

코딩 컨벤션은 문서화만으로는 부족합니다. 문서는 읽히지 않고, 읽혀도 잊히고, 잊히면 리뷰에서 매번 같은 피드백이 반복됩니다. load28-react 스킬은 이 반복을 자동화된 검증 프로세스로 전환합니다.

78개의 규칙이 많아 보일 수 있지만, 핵심은 단순합니다. 컴포넌트 설계, 상태관리, 성능, 테스트에서 자주 발생하는 실수를 패턴으로 정리하고, 코드 작성 시점에 자동으로 검증하는 것입니다.

AI 코드 어시스턴트의 가치는 코드를 빠르게 생성하는 데 있는 것이 아닙니다. 팀의 기준에 맞는 코드를 일관되게 생성하는 것이 진짜 가치입니다. 스킬 시스템은 그 기준을 코드로 표현할 수 있게 해줍니다.

참고