Git Worktrees에서 Microservice 변경 사항을 엔드투엔드 테스트하기 (Terminal Tab Explosion 없이)
Source: Dev.to
TL;DR
저는 Git 워크트리 안에 존재하는 Claude가 생성한 코드를 테스트하는 어려움을 해결하기 위해 Recomposable이라는 시각적 CLI‑툴을 만들었습니다.
The Problem
Claude Code를 Git worktree와 함께 사용할 때 동일한 저장소의 여러 브랜치를 동시에 체크아웃하는 경우가 많습니다:
- Claude는 하나의 worktree에서 작업합니다.
- 다른 worktree에서 나머지 스택을 검토·실행합니다.
단일 서비스 프로젝트에서는 잘 동작하지만, 마이크로서비스 아키텍처에서는 금방 한계에 부딪힙니다.
Claude가 하나의 서비스에 만든 변경 사항이 나머지 스택에서도 정상적으로 동작하는지 확인해야 합니다. 즉:
- 해당 서비스만 worktree의 코드로 다시 빌드한다.
- 다른 모든 서비스는
main브랜치를 유지한다.
Docker Compose는 worktree 개념을 알지 못하고 디스크상의 파일만 인식하기 때문에, 많은 수동 경로 조작을 하게 됩니다.
Source: …
수동 워크플로 (현재 상태)
| 단계 | 수행 내용 |
|---|---|
| 1️⃣ 작업 트리 경로 찾기 | Claude는 .claude/worktrees/ 아래에 자동 생성된 이름으로 작업 트리를 만듭니다. bash\ngit worktree list\n# /Users/you/project abc1234 [main]\n# /Users/you/project/.claude/worktrees/jan-abc123 def5678 [fix‑oauth]\n |
| 2️⃣ 작업 트리에서 서비스 빌드 | 작업 트리 경로와 compose 파일 경로를 결합하고 서비스를 지정합니다. bash\ndocker compose -f /Users/you/project/.claude/worktrees/jan-abc123/docker-compose.yml build auth-service\n |
| 3️⃣ 서비스 시작 | bash\ndocker compose -f /Users/you/project/.claude/worktrees/jan-abc123/docker-compose.yml up -d auth-service\n |
| 4️⃣ 검증 | 다른 터미널을 열어 로그를 tail하고, 서비스를 호출하고, 실패 시 다시 빌드합니다. |
| 5️⃣ 원래 상태로 전환 | 단계 2‑3을 반복하되 원래 compose 파일을 가리키도록 합니다. |
각 단계마다 작업 트리 경로를 기억하거나 복사해야 하며, 어떤 compose 파일이 어느 서비스에 해당하는지도 추적해야 합니다.
어떤 서비스가 어느 브랜치에서 실행되고 있는지에 대한 개요가 없습니다.
쉘 별칭이나 Makefile을 사용해 일부 불편함을 숨길 수 있지만, 여전히 다음이 부족합니다:
- 어떤 서비스가 어느 작업 트리에서 실행되는지에 대한 빠른 시각적 표시.
- 새로운 작업 트리가 나타날 때 자동 업데이트.
Recomposable 소개 (v1.1.4)
Recomposable은 개발 워크플로를 위해 만든 Docker‑Compose TUI입니다.
버전 1.1.4에서는 워크트리 전환을 일급 기능으로 추가했습니다.
작동 방식
- UI에서 원하는 서비스에
t키를 누릅니다. git worktree list --porcelain명령으로 수집된 전체 Git 워크트리가 표시됩니다.j/k로 이동하고,Enter로 선택합니다.- 선택한 워크트리의 compose 파일을 기준으로 서비스가 중지, 재빌드된 뒤 다시 시작됩니다.
그게 전부 – 경로를 직접 지정할 필요도, 추가 docker compose -f … 플래그도, 별도 터미널 탭도 없습니다.
UI 개요
서비스가 서로 다른 브랜치에서 실행될 경우 WORKTREE 열이 자동으로 표시됩니다.
main이 아닌 브랜치는 노란색으로 강조됩니다.
SERVICE STATUS BUILT PORTS WORKTREE
auth-service running 2m ago 5001 fix-oauth
api-gateway running 1h ago 8080 main
web-app running 3d ago 3000 main
- 경로를 기억할 필요가 없습니다.
- 컨테이너가 어떤 브랜치에서 빌드됐는지 추측할 필요도 없습니다.
내부 동작
- Discovery –
git worktree list --porcelain를 compose 파일이 있는 디렉터리에서 실행해 모든 워크트리를 탐색합니다. - Mapping – 도구는 원본 compose 파일 경로를 대상 워크트리 내부의 동일한 상대 경로와 매핑합니다. 파일이나 서비스가 대상 워크트리에 존재하지 않으면 오류가 표시됩니다.
- Override storage – 선택한 워크트리 오버라이드는 서비스별로 저장되므로 이후 모든 작업(
rebuild,restart,logs,exec,watch, 의존성 기반 연쇄 재빌드)에서 자동으로 오버라이드된 compose 파일을 사용합니다. - Switch back – 다시
t키를 눌러 원래 워크트리(보통main)를 선택하면 됩니다.
Recomposable을 활용한 전형적인 워크플로
- 프로젝트 루트에서 Recomposable을 실행합니다 – 전체 스택이
main에서 실행됩니다. - Claude Code를 열고
auth-service를 새로운 워크트리에서 작업하도록 지시합니다. - Claude가 변경을 가하면, 전체 흐름을 검증해야 합니다.
- Recomposable에서
auth-service로 이동해t키를 누르고 Claude의 워크트리를 선택합니다. - 해당 서비스가 Claude의 브랜치에서 재빌드되고, 나머지 스택은 여전히
main에 머무릅니다. - 로그를 확인하고, 요청을 보내며 동작을 검증합니다 – 모두 TUI 안에서 이루어집니다.
- 작업이 끝나면 다시
t키를 눌러main으로 전환합니다.
별도 터미널 탭 없이, 경로를 뒤섞지 않고, 추측 없이.
이 방식은 확장성이 뛰어납니다: Claude가 두 개의 워크트리에서 세 개의 서비스를 작업한다면, 세 서비스를 모두 전환할 수 있으며 WORKTREE 열이 즉시 현재 실행 중인 위치를 알려줍니다.
기능 미래 대비 (아이디어 및 격차)
| 영역 | 현재 상태 | 가능한 개선 |
|---|---|---|
| 워크트리 자동 감지 | t 키를 수동으로 눌러야 합니다. | 새 워크트리(예: Claude가 생성한 경우)를 감시하고, 영향을 받은 서비스를 자동으로 전환하도록 사용자에게 안내합니다. |
| 워크트리 인식 연쇄 재빌드 | 의존성 인식 재빌드(d)는 전이적 종속성을 재시작하지만, 해당 서비스들은 현재 워크트리에 머무릅니다. | 서비스가 전환될 때 종속 서비스도 동일한 워크트리로 전환하는 “연쇄 전환” 기능을 추가합니다(옵션 토글). |
| 전환 전 차이 미리보기 | 미리보기가 없으며, 무작정 재빌드합니다. | 재빌드 전에 현재 compose 파일과 대상 워크트리 간 변경된 파일/서비스 요약을 표시하여, 전환이 가치 있는지 사용자가 판단할 수 있게 합니다. |
| 브랜치 상태 표시기 | 워크트리 이름만 표시됩니다. | 워크트리 브랜치가 main보다 앞서 있는지 뒤처지는지, 혹은 커밋되지 않은 변경이 있는지를 표시하여 어떤 워크트리를 테스트할지 결정하는 데 도움을 줍니다. |
| 배치 작업 | 서비스를 하나씩 전환합니다. | UI에서 여러 서비스를 선택하고 한 번에 동일한 워크트리로 전환할 수 있게 합니다. |
| 지속 프로필 | 오버라이드는 서비스별이며 휘발성입니다. | 명명된 “프로필”(예: Claude‑Auth)을 저장하여 서비스‑워크트리 매핑 집합을 보관하고, 단일 명령으로 로드할 수 있게 합니다. |
이 중 어느 하나라도 구현하면 Claude Code + 워크트리 패턴에 크게 의존하는 팀에게 도구가 더욱 강력해집니다.
TL;DR (again)
- Problem: Claude가 만든 변경 사항을 여러 마이크로서비스에 걸쳐 검증하려면 번거로운 워크트리 경로 처리가 필요합니다.
- Solution: Recomposable – Docker‑Compose TUI로, 한 번의 키 입력만으로 원하는 서비스의 Git 워크트리를 전환하고, 각 서비스별 현재 워크트리를 명확한 표로 보여줍니다.
- Result: 경로 복사·붙여넣기 없이, 추가
docker compose -f …플래그 없이도, 각 컨테이너가 실행 중인 브랜치를 한눈에 파악할 수 있습니다.
시도해 보시고, UI가 무거운 작업을 대신하도록 해 보세요!
# Recomposable – Multi‑service Worktree Switch
> “0 commits ahead” is a different risk profile than a change that only touches a single config file.
무엇을 하는가
Recomposable는 저장소의 모든 서비스를 하나의 Docker Compose 파일에서 동일한 작업 트리로 단일 작업으로 전환할 수 있게 합니다.
변경 사항이 여러 서비스에 걸쳐 있을 때, 이제 각 서비스를 개별적으로 전환할 필요가 없으며 마찰이 사라집니다.
설치
npm install -g recomposable
Quick start
-
Navigate to a directory that contains a
docker‑compose.ymlfile. -
Create a
recomposable.jsonthat points to the compose files you want to manage. -
Run the tool:
recomposable
The worktree feature works out‑of‑the‑box with any Git repository that has multiple worktrees.
링크
- GitHub:
- npm:
## 작동 방식
Recomposable는 저장소의 **all services**를 하나의 Docker Compose 파일에서 동일한 워크트리로 단일 작업으로 전환할 수 있게 합니다.
변경 사항이 여러 서비스에 걸쳐 있을 때, 이제 각 서비스를 개별적으로 전환할 필요가 없으며 – 불편함이 사라집니다.
## 설치
```bash
npm install -g recomposable
빠른 시작
-
Navigate를
docker‑compose.yml파일이 포함된 디렉터리로 이동합니다. -
관리하려는 compose 파일을 가리키는
recomposable.json을 Create합니다. -
도구를 Run합니다:
recomposable
워크트리 기능은 여러 워크트리를 가진 모든 Git 저장소에서 별도 설정 없이 바로 작동합니다.
링크
- GitHub:
- npm: