Claude Code에는 simplify (code-simplifier)라는 스킬이 있다. Anthropic 공식 플러그인으로, 코드를 리팩토링할 때 자동으로 적용되는 가이드라인 세트다. 일반 프롬프트와 차이가 있을까?
3가지 유형의 "지저분한 코드"를 준비하고, 동일한 리팩토링 요청을 스킬 없이 vs 있이 비교해봤다.
이 스킬은 뭘 하는가
code-simplifier는 Anthropic 공식 플러그인으로, /simplify 명령으로 호출하면 코드를 리팩토링해주는 에이전트다.
핵심 철학:
- 기능 보존 — 코드가 하는 일은 절대 바꾸지 않는다
- 명확성 > 압축 — 읽기 쉬운 코드가 짧은 코드보다 낫다
- 중첩 삼항 금지 — switch나 if/else 선호
- 과도한 단순화 금지 — 너무 clever한 솔루션 지양
- 불필요한 추상화 제거 — 하지만 유용한 추상화는 유지
주의: 설치한다고 자동 실행되지 않는다
스킬 설명에 "코드 변경 후 자동으로 리팩토링"이라고 적혀 있지만, 실제로는 /simplify를 직접 호출해야 실행된다. 코딩할 때마다 알아서 돌아가는 것이 아니다. 자동 실행을 원하면 hooks를 설정해야 한다 — 예를 들어 "파일 저장 후 simplify 실행" 같은 걸 settings.json에 구성하는 방식.
스킬의 정체는 마크다운으로 된 가이드라인 문서다. "이렇게 리팩토링해라"는 원칙을 시스템 프롬프트에 주입하는 것.
테스트 설계
테스트 일시: 2026년 3월 29일 | 모델: Claude Opus 4.6 (1M context)
프롬프트: "이 코드를 리팩토링해줘. 기능은 그대로 유지하면서 코드 품질을 개선해줘."
3가지 유형의 코드에 동일 프롬프트를 적용:
| 테스트 | 코드 유형 | 원본 라인 수 |
|---|---|---|
| #1 | Python — 12단계 중첩 조건문 | 108줄 |
| #2 | React TSX — 모놀리식 컴포넌트 | 239줄 |
| #3 | TypeScript — 과도한 추상화 (6개 클래스) | 215줄 |
테스트 #1: Python 중첩 조건문
주문 처리 함수. 원본은 if 안에 if가 12단계까지 중첩되어 있다.
| 항목 | Without | With Skill |
|---|---|---|
| 라인 수 | 86줄 (−20%) | 73줄 (−32%) |
| 얼리 리턴 | ✅ 적용 | ✅ 적용 |
| 헬퍼 함수 분리 | ✅ 3개 (모듈 레벨) | 1개 (내부 함수) |
| 할인율 딕셔너리 | ✅ 상수로 분리 | ✅ 로컬 변수 |
| 구조 | 검증/할인/처리 분리 | 단일 함수, 플랫 |
관찰: 양쪽 모두 핵심 기법(얼리 리턴, 딕셔너리 매핑)은 동일하게 적용. Without은 함수 3개로 더 잘게 쪼갰고, With는 단일 함수로 유지하면서 더 짧게 만들었다. 스킬의 "명확성 > 압축" 원칙이 반영되어 불필요한 분리를 하지 않은 것.
테스트 #2: React 모놀리식 컴포넌트
239줄짜리 UserProfileDashboard. 12개의 useState, 탭 전환, 모달, CRUD 전부 한 파일.
| 항목 | Without | With Skill |
|---|---|---|
| 라인 수 | 387줄 (+62%) | 379줄 (+59%) |
| 컴포넌트 분리 | ✅ 6개+ | ✅ 4개+ |
| 상태 통합 | ✅ EditFormState | ✅ EditFormData |
| 삼항 연산자 제거 | 부분 제거 | ✅ switch + 룩업 테이블 |
| API 레이어 분리 | ✅ | ❌ |
| 명시적 Props 타입 | 부분 적용 | ✅ 전체 적용 |
관찰: 양쪽 모두 줄 수가 오히려 늘었다 — 이건 정상이다. 컴포넌트 분리를 하면 Props 인터페이스, import 등이 추가된다. 핵심 차이는 스킬 버전이 "중첩 삼항 금지" 원칙을 충실히 따라 switch문과 룩업 테이블을 사용한 것. Without은 삼항을 일부 남겨뒀다.
테스트 #3: 과도한 추상화
CSV→JSON 변환이라는 단순한 작업을 6개 클래스(Logger, ValidatorRegistry, TransformStep, Pipeline + 커스텀 에러 3종)로 구현한 코드.
| 항목 | Without | With Skill |
|---|---|---|
| 라인 수 | 26줄 (−88%) | 28줄 (−87%) |
| 클래스 제거 | ✅ 전부 제거 | ✅ 전부 제거 |
| 에러 처리 | 조건 합쳐서 1줄 | 조건 분리해서 2줄 (더 명시적) |
| 에러 메시지 | 통합 메시지 1개 | 케이스별 메시지 2개 |
관찰: 이 케이스는 양쪽이 거의 동일한 결론에 도달했다. "6개 클래스가 필요 없다"는 판단은 스킬 없이도 자명하기 때문. 미세한 차이: 스킬 버전은 에러 조건을 분리해서 각각 다른 메시지를 줬다 — "명시적 코드 > 압축된 코드" 원칙의 반영.
종합 비교
| 지표 | Without | With Skill |
|---|---|---|
| 총 토큰 | 38,465 | 39,560 |
| 총 소요 시간 | 117초 | 115초 |
| 비용 차이 | 거의 동일 (+3%) | |
결론: 쓸 가치가 있나?
미묘하다. frontend-design보다 차이가 작다.
스킬이 나은 점
- 삼항 연산자를 확실히 제거
- 에러 메시지를 더 명시적으로
- "과도한 분리" 자제 (Test1)
- Props 타입을 빠짐없이 정의
스킬 없이도 된 점
- 얼리 리턴 패턴 — 양쪽 동일
- 불필요한 추상화 제거 — 양쪽 동일
- 컴포넌트 분리 — 양쪽 모두 수행
- API 레이어 분리 — Without만 수행
Claude는 스킬 없이도 리팩토링을 잘 한다. 얼리 리턴, 추상화 제거 같은 큰 구조 변경은 양쪽이 동일하다. 차이는 세부 원칙의 일관성에서 나온다.
예를 들어 "중첩 삼항 금지"라는 규칙이 없으면 Without은 삼항을 일부 남겨둔다. 코드는 작동하지만, 팀 컨벤션이 "삼항 금지"라면 매번 수동으로 잡아야 한다. 스킬은 이런 스타일 가이드를 자동으로 강제하는 역할이다.
한 줄 요약: simplify 스킬은 "리팩토링 능력을 높이는 도구"가 아니라 "팀 코딩 컨벤션을 자동으로 적용하는 린터"에 가깝다.
추천 사용법: CLAUDE.md에 팀 코딩 컨벤션을 자세히 적고 simplify를 활성화하면, 코드 작성 → 자동 리팩토링 파이프라인이 만들어진다. 스킬 자체를 그대로 쓰기보다, 팀 규칙에 맞게 커스터마이징해서 쓰는 게 진짜 가치.
Member discussion: