Tach: Python 코드베이스를 시각화하고 의존성을 정리하는 도구
요약
Tach는 Rust로 작성된 Python 도구로, 프로젝트의 의존성과 인터페이스를 강제하여 코드베이스의 구조적 건전성을 높입니다. 모듈형 모놀리스 아키텍처에서 영감을 받아, 가져오기(import)와 모듈 간 호출이 선언된 규칙을 따르도록 합니다. `tach check` 명령어를 통해 의존성 위반을 검사하고, 시각화 및 보고 기능을 제공하여 개발 과정에 통합하기 용이합니다.
핵심 포인트
- 의존성과 인터페이스를 강제하는 Python 도구입니다.
- 모듈형 모놀리스 아키텍처 원칙을 적용했습니다.
- `tach check`로 의존성 위반을 검사하고 CI/CD에 통합 가능합니다.
- 의존성 그래프 시각화 및 상세 보고 기능을 제공합니다.
Tach는 Rust로 작성된 Python 도구로, 의존성 및 인터페이스를 강제합니다.
Tach는 모듈형 모놀리스(modular monolith) 아키텍처에서 영감을 받았습니다.
Tach.Demo.mp4
Tach가 강제할 수 있는 것들:
- 📋 가져오기(Imports)는 선언된 의존성으로부터만 발생해야 합니다.
- 🤝 모듈 간 호출은 공개 인터페이스(public interface)를 사용해야 합니다.
- ⛓️💥 의존성 그래프에 순환 참조가 없어야 합니다.
Tach의 특징:
- 🌎 오픈 소스입니다.
- 🐍 pip으로 설치 가능합니다.
- 🔧 점진적으로 도입할 수 있습니다.
- ⚡ 실행 시 영향(runtime impact)이 없습니다.
- ♾️ 기존 시스템과 상호 운용성이 뛰어납니다.
pip install tach
Tach가 초기 프로젝트 설정을 안내해 줄 것입니다.
다음 명령어를 실행하세요:
tach init
도입 메시지 이후, 대화형으로 프로젝트를 구성할 수 있는 파일 트리 인터페이스가 나타납니다.
방향키를 사용하여 탐색하고 'Enter' 키로 각 모듈 경계를 표시합니다. 최상위 Python 패키지 전체를 표시하거나 추적하려는 몇몇 패키지만 지정할 수 있습니다.
FAQ: 모듈이란 무엇인가요?
Python 코드가 프로젝트 루트 아래에 있거나, 여러 Python 패키지를 가진 모노레포(monorepo)에서 작업하는 경우, 's' 키를 사용하여 Python 소스 루트를 표시하세요.
Tach는 방금 설정한 경계를 강제할 수 있는 CLI 명령어를 제공합니다! Python 프로젝트의 루트에서 다음을 실행하세요:
tach check
다음과 같이 확인할 수 있습니다:
✅ 모든 모듈이 유효성 검사되었습니다!
Tach가 작동하는지 확인하려면 다음 중 하나를 수행할 수 있습니다:
tach.toml파일의depends_on키에서 항목을 제거하거나,- 두 모듈 간에 이전에 가져오기(import)하지 않았던 것을 추가하여 사용 중단(deprecated)으로 표시합니다.
두 가지를 모두 시도한 다음 tach check를 다시 실행해 보세요. 그러면 다음과 같은 오류가 발생할 것입니다:
❌ tach/check.py[L8]: 'tach.filesystem'을 사용할 수 없습니다. 모듈 'tach'는 'tach.filesystem'에 의존할 수 없습니다.
각 오류는 의존성을 위반하는 가져오기(import)를 나타냅니다. 터미널이 하이퍼링크를 지원하면 파일 경로를 클릭하여 오류 위치로 바로 이동할 수 있습니다.
tach check가 오류를 감지하면 0이 아닌 종료 코드로 종료됩니다. 이는 CI/CD, Pre-commit hooks, VS Code 등과 쉽게 통합될 수 있습니다!
의존성 그래프를 시각화하세요.
tach show [--web]
Tach는 사용자의 의존성 그래프를 생성합니다. Tach의 경우 다음과 같습니다:
[IMG:N]
참고로 이 그래프는 tach show --web을 실행할 때 tach.toml의 내용을 사용하여 원격으로 생성됩니다.
만약 GraphViz DOT 형식을 로컬에서 사용하고 싶다면, 단순히 tach show를 실행하는 것만으로 작업 디렉터리에 tach_module_graph.dot 파일을 생성할 수 있습니다.
특정 경로에 대한 의존성과 사용처를 확인할 수 있습니다:
tach report my_package/
# 또는
tach report my_module.py
예시:
> tach report python/tach/filesystem
[‘python/tach/filesystem’의 의존성]
python/tach/filesystem/install.py[L6]: 'tach.hooks.build_pre_commit_hook_content' 임포트
...
Tach는 또한 다음 기능을 지원합니다:
- 모듈의 공개 인터페이스(Public interfaces for modules)
- 개별 의존성 사용 중단(Deprecating individual dependencies)
- 계층적 아키텍처(Layered architecture)
- 점진적 도입(Incremental adoption)
- JSON 의존성 맵 생성
- 모노레포 및 네임스페이스 패키지(Monorepos and namespace packages)
- 도메인 소유권(Domain ownership)
- 인라인 '무시' 주석('ignore' comments)
- 사전 커밋 후크(Pre-commit hooks)
자세한 내용은 문서를 참고하세요. 피드백이 있으시면 이야기 나누고 싶습니다!
질문이나 문제가 발생하면 Github Issue를 제출하여 알려주세요!
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Claude Code Search의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기