
AI 시대의 JS/TS 분석 도구 fallow 사용해 보기
요약
AI 에이전트가 주도하는 코드 생성 시대에 맞춰 코드베이스 전체를 분석하는 도구인 fallow를 소개합니다. fallow는 Rust 기반의 빠른 속도로 미사용 코드, 중복, 복잡도, 아키텍처 경계 위반 등을 통합적으로 점검합니다.
핵심 포인트
- fallow는 파일 단위가 아닌 프로젝트 전체 코드베이스를 분석함
- Rust 기반으로 타입 정보 없이 구문 분석만 수행하여 매우 빠름
- 미사용 코드, 중복, 복잡도, 아키텍처 경계 위반을 통합 리포트 제공
- MCP 서버 및 Agent Skills를 지원하여 AI 에이전트와 연동 가능
서론
2026년 5월, Bun이 Rust로 통째로 다시 작성되는 Pull Request가 머지되었습니다. 이 PR은 업계에서 큰 화제가 되었습니다.
이 PR에서는,
약 100만 행의 추가 (1,009,257 행 추가 / 2,188 파일 / 6,755 커밋) - 게다가 거의 AI 에이전트 (Claude) 주도의 이식 (claude/phase-a-port와 같은 병렬 브랜치가 여러 개 존재)
이 이루어졌으며, 인간이 코드 리뷰를 할 수 있는 범위를 이미 한참 넘어섰습니다. AI 에이전트의 진화로 인해 엔지니어의 작업 방식이 변하고, 개발에 있어 **"코드 리뷰가 엔지니어의 주요 업무가 될 것이다"**라고 말해왔습니다. 하지만 Bun의 이러한 움직임을 보며, 코드 리뷰조차 AI 에이전트가 수행하게 될 미래가 올 것이라고 느꼈습니다. 지금까지의 "인간이 코드를 전부 읽고 파악한다"는 대전제는 무너지고, 앞으로는 기존의 테스트와 벤치마크를 "객관적인 합격 라인"으로 삼아, AI 에이전트가 루프를 돌며 생성과 검증을 반복하는 방식이 될 것으로 보입니다.
이러한 미래에는 AI가 생성한 코드를 AI 스스로 점검하고 정리하게 하는 것도 필요해집니다. fallow는 바로 이러한 맥락에 딱 맞는 도구입니다.
서론이 길어졌습니다만, fallow에 대해 "무엇을 할 수 있는가?", "ESLint나 Prettier와 무엇이 다른가?"부터, AI 에이전트가 스스로 fallow를 실행하여 코드를 정리하는 앞으로의 주류가 될 사용법까지 소개하겠습니다.
fallow란
fallow (공식 문서)는 JavaScript, TypeScript를 위한 "코드베이스 분석 도구"입니다.
주요 특징을 꼽자면 다음과 같습니다.
타입 정보 없이 동작: tsc (TypeScript의 타입 체크)에 의존하지 않고 구문 분석(Parsing)만으로 빠르게 동작합니다 (게다가 Rust로 작성되어 있어 매우 빠릅니다).
- 올인원 (All-in-one): 미사용 코드 / 중복 / 복잡도 / 순환 의존 / 아키텍처 경계를 하나의 리포트로 정리해 줍니다.
- 프레임워크 자동 인식: Vite / Jest / Storybook / ESLint 등 약 95개 전후의 플러그인을 내장하여 엔트리 포인트(Entry point)를 자동으로 검출합니다.
- AI 에이전트 연동 지원: MCP 서버, commit 게이트, LSP, 공식 Agent Skills도 준비되어 있습니다.
실제로 무엇을 분석하는지는 명령어별로 다음과 같이 나뉩니다.
| 분석 | 확인 내용 |
|---|---|
dead-code | 미사용 파일 / export / 타입 / 의존성 / 순환 의존 |
dupes | 코드 중복 |
health | 복잡도 (cyclomatic / cognitive / CRAP) · 유지보수성 · 핫스팟 |
boundaries | 아키텍처 경계 위반 |
ESLint / Prettier와 무엇이 다른가
코드 정적 분석 도구로서 "ESLint, biome 또는 Prettier와 무엇이 다른가?"라고 생각하시는 분도 계실 것입니다.
공식 문서에는 다음과 같이 적혀 있습니다.
"Linters check files. TypeScript checks types. Fallow checks the codebase."
(린터는 파일을, TypeScript는 타입을, fallow는 코드베이스 전체를 체크한다)
비교하면 다음과 같습니다.
| 도구 | 확인 단위 | 예시 |
|---|---|---|
| Prettier | 1개 파일의 외관 | 인덴트(들여쓰기) · 쿼트 · 마지막 쉼표 |
| ESLint | 1개 파일 내의 규칙 위반 | 미정의 변수, hooks의 의존성 누락 |
| fallow | 프로젝트 전체의 import 그래프 | 도달 불가능한 파일, 고립된 export, 순환 의존, 미사용 의존 패키지 |
fallow는 모듈 그래프 (Module graph) (어떤 파일이 어떤 파일을 import하고 있는지에 대한 지도)를 구축하여 전체를 횡단하며 살펴봅니다. 파일 하나씩 확인하는 ESLint로는 원리적으로 알아차릴 수 없는, 프로젝트 전체에 관계된 코드베이스 문제를 찾아내 줍니다.
- 어디에서도 import되지 않은 파일 (즉, 더 이상 아무도 사용하지 않는 고립된 파일)
- 배럴 파일 (barrel file) (
index.ts...
배럴 파일 (barrel file) (index.ts 등에서 모아 re-export하는 것)을 통해 실제로는 사용되지 않는 export
package.json에 포함되어 있지만 한 번도 import되지 않은 의존성 패키지- 순환 의존 (Circular Dependency) (A가 B를, B가 A를... 서로 참조하며 루프를 형성하는 상태) 파일 식별
ESLint에도 no-unused-modules와 같은 추가 플러그인 (plugin)이 있습니다. 하지만 공식 문서에 따르면, 대규모 프로젝트의 경우 lint에 +320초가 추가로 소요될 뿐만 아니라, TypeScript (TS)의 경로 별칭 (path alias)이나 배럴 파일의 re-export 처리에 취약하다고 합니다. fallow는 동일한 탐지를 1초 미만에 해냅니다.
그리고 중요한 점은
「몇 줄의 코드에서・몇 군데가」 중복되었는지와 파일 및 행 범위까지 알려줍니다. 저의 경우, 남아있던 중복의 정체는 유사한 제품 모듈(typeA / typeB / typeC …)이 동일한 Input 로직을 복사하여 붙여넣기(copy-paste)한 것이었습니다. 이는 공통화 작업을 위한 좋은 단서가 됩니다.
health: 건전도를 점수로 파악
코드베이스 전체를 0~100점 + 알파벳 등급으로 점수화하며, 세부 내역(유지보수성(maintainability), 중복률(duplication rate), 데드 코드(dead code) 비율, 복잡도(complexity) 등)도 출력해 줍니다.
● Health score: 84 B
■ Metrics: 117,018 LOC · dead files 0.0% · maintainability 92.6 (good) · duplication 5.8%
각 함수의 복잡도와 함께 출력되는 CRAP 점수(Complexity and Ratio of Attributable Programmatic errors; 복잡하면서도 테스트가 없는 함수일수록 높아짐)가 은근히 유용하여, "어떤 함수부터 우선적으로 테스트를 작성할지" 감을 잡을 수 있습니다. "중복을 줄이면 → 점수가 올라간다"와 같이 개선 사항이 수치로 보이는 것도 동기 부여가 됩니다.
audit: 변경분만 "게이트(gate)" 하기
fallow audit은 변경한 파일만을 대상으로 dead-code / dupes / health를 한꺼번에 체크하고, pass / fail을 반환합니다. 기본값(gate=new-only)에서는 "이번 변경으로 새롭게 늘어난" 문제만 fail 처리하므로, 예전부터 존재하던 기술 부채 때문에 작업이 막히는 일은 없습니다.
Audit scope: 1 changed file vs develop (ac83a0c..HEAD)
✓ No issues in 1 changed file
AI 시대의 사용법: 에이전트가 스스로 실행하여 코드를 청소하기
여기까지는 "편리한 도구구나"라는 이야기였지만, AI 시대에 어떻게 활용할지에 대해서도 소개하겠습니다.
① 공식 Agent Skills (fallow-rs/fallow-skills)
fallow는 공식적으로 Agent Skills를 배포하고 있습니다.
Claude Code에 도입하기:
# 플러그인 마켓플레이스(plugin marketplace)를 통해
/plugin marketplace add fallow-rs/fallow-skills
/plugin install fallow-skills@fallow-rs/fallow-skills
...
스킬이 에이전트에게 부여하는 것은 단순한 API가 아니라 **판단의 지식(knowledge of judgment)**입니다.
- command knowledge: 태스크마다 어떤 fallow 명령어와 플래그(flag)를 사용할지
- output parsing: JSON 결과를 어떻게 해석할지
- guardrails:
fix실행 전에 반드시 dry-run 또는watch를 실행하지 않도록 하거나, 비 TTY 환경에서는--yes를 사용하도록 하는 등의 가드레일
도입 후에는 다음과 같은 요청의 정밀도가 향상됩니다.
예)
- "사용하지 않는 export를 정리해줘"
- "이 PR이 품질 리스크를 높이고 있지는 않아?"
- "왜 이 export가 미사용으로 판정된 거야?"
② 구조화된 출력: CLI 에이전트에게 결과를 "읽기 쉬운 형태"로 전달하는 두 가지 방법
먼저 CLI의 --format json 옵션입니다. kind라는 종류 태그가 붙은 정해진 형식의 JSON으로 반환해주기 때문에, 셸(shell) 명령어를 실행할 수 있는 에이전트라면 무엇이든 사용할 수 있는 가장 범용적인 방법입니다.
그 외의 선택지로 fallow-mcp도 준비되어 있습니다. analyze / audit / find_dupes / trace_export(특정 export가 어디서 사용되는지 추적하는 기능) 등 **18개의 구조화된 도구(structured tools)**를 공개하고 있어, 텍스트나 JSON을 직접 파싱하는 수고 없이 확인할 수 있습니다. 내부 분석 엔진은 CLI의 얇은 래퍼(wrapper)이므로 결과도 정확히 일치합니다.
{ "mcpServers": { "fallow": { "command": "fallow-mcp" } } }
③ commit 게이트 (에이전트가 git commit 시 실행하도록 설정: fallow hooks install --target agent)
Claude Code에 도입하여 에이전트가 스스로 코드를 관리하게 할 수 있습니다.
/ git push
을 하려고 하기 직전에 fallow audit
을 자동으로 실행하여, 새롭게 늘어난 문제가 있다면 중단해 주는 메커니즘입니다. 기본적으로 "새롭게 추가된 지적 사항만" 확인해 주기 때문에, 오래전부터 존재하던 기술 부채(Technical Debt)는 눈감아 주어 기존 프로젝트에도 도입하기 쉽습니다.
AI 에이전트에 의한 자기 정화(Self-cleaning) 플로우 이미지
이것들을 조합하면 다음과 같은 루프가 돌아갑니다.
에이전트가 기능을 구현한다
↓
사람 "코드베이스를 청소해줘" 또는 에이전트 스스로가 hooks 등을 기점으로 자율적으로 움직인다
...
요약
내용이 길어졌으므로 핵심만 요약하겠습니다.
- Bun의 100만 행 Rust 포팅이 보여주듯, 인간이 모든 코드를 읽지 않게 되는 시대에는 AI가 코드베이스를 자율적으로 점검하고 청소하게 만드는 메커니즘이 효과를 발휘할 것입니다. fallow는 이를 위한 훌륭한 도구입니다.
- fallow는 미사용 코드, 중복, 복잡도, 순환 의존성(Circular Dependency)을 일괄적으로 시각화해 주는 Rust 기반의 JS/TS 분석 도구입니다.
npx fallow로 즉시 테스트할 수 있습니다. - ESLint / Prettier와는 살펴보는 단위가 다릅니다 (파일 단위 vs 프로젝트 전체의 import 그래프). 충돌 관계가 아닌 보완 관계이며, CI(지속적 통합)에서 병행하여 실행하는 것을 권장합니다.
- 기본적으로는 설정이 필요 없습니다. 물론 설정 파일을 통해 세부적인 설정도 가능합니다. **런타임 계산(glob)이나 비관습적인 멀티 엔트리(Multi-entry)**는 설정 파일로 알려줄 필요가 있습니다.
- 공식 Agent Skills / MCP / commit 게이트를 통해, AI 에이전트가 안전한 절차에 따라 자율적으로 fallow를 실행하고 코드를 청소하는 플로우를 구축할 수 있습니다.
개인적으로는 npx fallow로 우선 바로 시도해 볼 수 있는 간편함이 가장 큰 추천 포인트입니다. 관심이 생기셨다면 꼭 한 번 자신의 프로젝트에 시도해 보세요!
참고
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기