폴더 구조 개선 v2 — 상세 설계
작성: Planner | 2026-03-30 | Status: Draft 선행 문서: project-restructure-design.md (v1, Docusaurus+대시보드 통합)
1. 목표
게임 코드를 game/ 폴더로 묶어 Godot 프로젝트를 격리하고, 문서(docs/)·운영 데이터(ops/)·스크립트(scripts/)를 명확히 분리한다.
1.1 핵심 변경점 (v1 대비)
| # | v1 (현재) | v2 (목표) | 이유 |
|---|---|---|---|
| 1 | 루트 = Godot 프로젝트 (project.godot 루트) | game/ = Godot 프로젝트 | 게임/도구/문서 역할 분리 |
| 2 | res/data/ — 밸런스 JSON | game/data/ — 밸런스 JSON | res/ 밖으로 분리하되 game/ 내부 유지 |
| 3 | docs/ 안에 문서+운영+태스크 혼합 | docs/ = 기획/설계만, ops/ = 운영 | 관심사 분리 |
| 4 | scripts/ 플랫 구조 (31개 파일) | scripts/{game,agent,ops,gpu}/ 서브폴더 | 탐색성 향상 |
2. 목표 폴더 구조
the-hon-joseon/
├── game/ # Godot 프로젝트 루트
│ ├── project.godot
│ ├── .godot/ # Godot 에디터 캐시 (gitignore)
│ ├── addons/ # GdUnit4 등
│ ├── src/ # GDScript 소스코드
│ │ ├── autoloads/
│ │ ├── player/
│ │ ├── weapons/
│ │ ├── enemies/
│ │ ├── souls/
│ │ ├── equipment/
│ │ ├── systems/
│ │ ├── ui/
│ │ ├── hub/
│ │ ├── components/
│ │ ├── pickups/
│ │ ├── main.gd
│ │ └── main.tscn
│ ├── res/ # 리소스 (스프라이트, 오디오, UI, 타일셋)
│ │ ├── sprites/
│ │ ├── audio/
│ │ ├── tilesets/
│ │ └── ui/
│ ├── data/ # 밸런스 JSON (res/data/에서 승격)
│ │ ├── characters.json
│ │ ├── enemies.json
│ │ ├── weapons.json
│ │ ├── souls.json
│ │ ├── equipment.json
│ │ ├── stages.json
│ │ ├── levelup.json
│ │ ├── yinyang.json
│ │ ├── resonance.json
│ │ ├── curses.json
│ │ └── waves/
│ │ └── wave_XX.json
│ └── test/ # GdUnit4 테스트
│
├── tools/
│ └── dashboard/ # Docusaurus + 대시보드 (변경 없음)
│
├── docs/ # 기획/설계 문서만
│ ├── game/ # GDD, IA/UI, 시스템 설계
│ ├── design/ # 기술 설계 (아키텍처, ADR 아닌 설계서)
│ ├── decisions/ # ADR (결정 로그)
│ ├── setup/ # 셋업 가이드 (현 ops/에서 셋업만 이동)
│ └── comfyui_workflows/ # ComfyUI 워크플로우 JSON
│
├── ops/ # 운영 데이터 (신규 최상위)
│ ├── tasks/
│ │ └── backlog.json
│ ├── changelog.json
│ ├── milestones.json
│ ├── daily/
│ └── guides/ # 운영 가이드/체크리스트 (현 ops/에서 가이드만)
│
├── scripts/ # 자동화 스크립트 (서브폴더 분류)
│ ├── game/ # 게임 실행/테스트
│ │ ├── run-game.sh
│ │ ├── run-tests.sh
│ │ └── gdscript-lint.sh
│ ├── agent/ # 에이전트 관리
│ │ ├── start-agents.sh
│ │ ├── stop-agents.sh
│ │ ├── log-agent-idle.sh
│ │ ├── log-agent-start.sh
│ │ ├── log-agent-stop.sh
│ │ ├── log-notification.sh
│ │ ├── log-task-completed.sh
│ │ └── log-tool-use.sh
│ ├── ops/ # 운영/태스크/Slack
│ │ ├── update-task.sh
│ │ ├── add-changelog.sh
│ │ ├── slack-post.sh
│ │ ├── slack-template.sh
│ │ ├── slack-upload.sh
│ │ ├── check-pending-commands.sh
│ │ ├── check-review.sh
│ │ └── get-review-feedback.sh
│ └── gpu/ # GPU/에셋 파이프라인
│ ├── gpu-status.sh
│ ├── wol-wake.sh
│ ├── wol-sleep.sh
│ ├── comfyui-generate.sh
│ ├── acestep-generate.sh
│ ├── convert-audio.sh
│ ├── make-spritesheet.sh
│ ├── palette-remap.sh
│ └── validate-asset.sh
│
├── .claude/ # 에이전트 설정 (위치 유지)
├── .gitattributes
├── .gitignore
├── .env
└── README.md
3. 파일 이동 매핑
3.1 Godot 프로젝트 → game/
| 현재 경로 | 목표 경로 | 비고 |
|---|---|---|
project.godot | game/project.godot | Godot 프로젝트 루트 변경 |
.godot/ | game/.godot/ | 에디터 캐시, 재생성됨 |
addons/ | game/addons/ | GdUnit4 |
src/ | game/src/ | 전체 이동 |
test/ | game/test/ | 전체 이동 |
res/sprites/ | game/res/sprites/ | 스프라이트 |
res/audio/ | game/res/audio/ | 오디오 |
res/tilesets/ | game/res/tilesets/ | 타일셋 |
res/ui/ | game/res/ui/ | UI 에셋 |
res/assets.json | game/res/assets.json | 에셋 매니페스트 |
res/data/ | game/data/ | res/ 밖으로 승격 |
3.2 문서 재배치
| 현재 경로 | 목표 경로 | 비고 |
|---|---|---|
docs/game/ | docs/game/ | 변경 없음 |
docs/design/ | docs/design/ | 변경 없음 |
docs/decisions/ | docs/decisions/ | 변경 없음 |
docs/comfyui_workflows/ | docs/comfyui_workflows/ | 변경 없음 |
docs/ops/Mac_셋업.md | docs/setup/Mac_셋업.md | 셋업 → docs/setup/ |
docs/ops/Windows_셋업.md | docs/setup/Windows_셋업.md | 셋업 → docs/setup/ |
docs/ops/에이전트_셋업.md | docs/setup/에이전트_셋업.md | 셋업 → docs/setup/ |
docs/ops/운영_가이드.md | ops/guides/운영_가이드.md | 운영 → ops/ |
docs/ops/운영_체크리스트.md | ops/guides/운영_체크리스트.md | 운영 → ops/ |
docs/CLAUDE.md | docs/CLAUDE.md | 내용 업데이트 필요 |
res/CLAUDE.md | game/res/CLAUDE.md | game/ 내부로 이동 |
src/CLAUDE.md | game/src/CLAUDE.md | game/ 내부로 이동 |
3.3 운영 데이터 → ops/
| 현재 경로 | 목표 경로 | 비고 |
|---|---|---|
docs/tasks/backlog.json | ops/tasks/backlog.json | 태스크보드 |
docs/changelog.json | ops/changelog.json | 변경이력 |
docs/milestones.json | ops/milestones.json | 마일스톤 |
docs/daily/ | ops/daily/ | 데일리 로그 |
3.4 스크립트 서브폴더 분류
| 현재 경로 | 목표 경로 | 카테고리 |
|---|---|---|
scripts/run-game.sh | scripts/game/run-game.sh | game |
scripts/run-tests.sh | scripts/game/run-tests.sh | game |
scripts/gdscript-lint.sh | scripts/game/gdscript-lint.sh | game |
scripts/start-agents.sh | scripts/agent/start-agents.sh | agent |
scripts/stop-agents.sh | scripts/agent/stop-agents.sh | agent |
scripts/log-*.sh (6개) | scripts/agent/log-*.sh | agent |
scripts/update-task.sh | scripts/ops/update-task.sh | ops |
scripts/add-changelog.sh | scripts/ops/add-changelog.sh | ops |
scripts/slack-*.sh (3개) | scripts/ops/slack-*.sh | ops |
scripts/check-*.sh (2개) | scripts/ops/check-*.sh | ops |
scripts/get-review-feedback.sh | scripts/ops/get-review-feedback.sh | ops |
scripts/gpu-status.sh | scripts/gpu/gpu-status.sh | gpu |
scripts/wol-*.sh (2개) | scripts/gpu/wol-*.sh | gpu |
scripts/comfyui-generate.sh | scripts/gpu/comfyui-generate.sh | gpu |
scripts/acestep-generate.sh | scripts/gpu/acestep-generate.sh | gpu |
scripts/convert-audio.sh | scripts/gpu/convert-audio.sh | gpu |
scripts/make-spritesheet.sh | scripts/gpu/make-spritesheet.sh | gpu |
scripts/palette-remap.sh | scripts/gpu/palette-remap.sh | gpu |
scripts/validate-asset.sh | scripts/gpu/validate-asset.sh | gpu |
4. 경로 참조 변경 목록
4.1 Godot res:// 경로 — 핵심 영향
Godot의 res://는 project.godot가 있는 디렉토리를 기준으로 한다. project.godot가 game/으로 이동하면:
현재 res:// 경로 | 새 res:// 경로 | 이유 |
|---|---|---|
res://src/... | res://src/... | 변경 없음 (src/는 game/ 안에서 상대위치 동일) |
res://res/... | res://res/... | 변경 없음 (res/도 game/ 안에서 동일) |
res://res/data/... | res://data/... | 변경 — data/가 res/ 밖으로 승격 |
res://addons/... | res://addons/... | 변경 없음 |
res://test/... | res://test/... | 변경 없음 |
핵심: game/ 내부에서의 상대 구조는 현재와 거의 동일. 유일한 변경은
res://res/data/→res://data/.
4.2 GDScript 코드 수정
| 파일 | 현재 | 변경 후 | 영향도 |
|---|---|---|---|
src/autoloads/data_manager.gd:6 | const DATA_PATH = "res://res/data/" | const DATA_PATH = "res://data/" | HIGH — 모든 JSON 로딩의 기준 경로 |
data_manager.gd의DATA_PATH하나만 수정하면 모든 JSON 로딩이 자동 반영됨. 다른 GDScript 파일은DataManager.get_weapon()등 API를 사용하므로 직접 경로 참조 없음.
4.3 .tscn 파일 내부 경로
.tscn 파일은 res:// 기반 경로를 사용한다. 현재 확인된 res:// 참조:
res://src/main.tscn → [ext_resource ... path="res://src/..."]
res://src/systems/game_world.tscn
res://src/player/player.tscn
res://src/enemies/enemy_base.tscn
...
src/,res/가 game/ 내부에서 동일 위치이므로.tscn내res://src/...,res://res/...경로는 수정 불필요. 단,.tscn내에res://res/data/참조가 있다면res://data/로 수정 필요 — 현재.tscn에서 data JSON 직접 참조는 없음 (DataManager 경유).
4.4 project.godot 내부 경로
run/main_scene="res://src/main.tscn" # 변경 없음
EventBus="*res://src/autoloads/event_bus.gd" # 변경 없음
...
enabled=PackedStringArray("res://addons/gdUnit4/plugin.cfg") # 변경 없음
game/ 내부 상대 구조 유지이므로
project.godot내부의 모든res://경로 수정 불필요.
4.5 스크립트 내부 경로 참조
| 스크립트 | 참조 | 변경 내용 |
|---|---|---|
scripts/update-task.sh:14 | $PROJECT_ROOT/docs/tasks/backlog.json | → $PROJECT_ROOT/ops/tasks/backlog.json |
scripts/add-changelog.sh:16 | $PROJECT_ROOT/docs/changelog.json | → $PROJECT_ROOT/ops/changelog.json |
scripts/run-tests.sh | Godot 실행 경로 | 프로젝트 루트 → game/ 지정 필요 |
scripts/run-game.sh | Godot 실행 경로 | 프로젝트 루트 → game/ 지정 필요 |
scripts/comfyui-generate.sh | res/sprites/ 출력 경로 | → game/res/sprites/ |
scripts/acestep-generate.sh | res/audio/ 출력 경로 | → game/res/audio/ |
scripts/validate-asset.sh | 에셋 경로 검증 | game/ 접두사 반영 |
scripts/make-spritesheet.sh | res/sprites/ 참조 | → game/res/sprites/ |
scripts/palette-remap.sh | 이미지 경로 | game/ 접두사 반영 |
scripts/start-agents.sh:64 | ./scripts/stop-agents.sh | → ./scripts/agent/stop-agents.sh |
scripts/log-notification.sh:30 | ./scripts/slack-post.sh | → ./scripts/ops/slack-post.sh |
$PROJECT_ROOT 유지: 모든 스크립트는
$PROJECT_ROOT를 기준으로 경로를 해석하므로,PROJECT_ROOT는 여전히 레포 루트를 가리킨다. 변경되는 것은 그 이후의 상대 경로.
4.6 .claude/ 에이전트 설정 참조
| 파일 | 현재 참조 | 변경 필요 |
|---|---|---|
.claude/CLAUDE.md | docs/tasks/backlog.json, res/data/, scripts/ 등 | 전면 업데이트 |
.claude/agents/planner.md | res/data/*.json, docs/game/, res://data/waves/ | 경로 업데이트 |
.claude/agents/leader.md | docs/tasks/, docs/changelog.json, scripts/*.sh | 경로 업데이트 |
.claude/agents/coder.md | src/, test/ | game/src/, game/test/ |
.claude/agents/artist.md | res/sprites/, scripts/ | game/res/sprites/, 스크립트 경로 |
.claude/agents/composer.md | res/audio/, scripts/ | game/res/audio/, 스크립트 경로 |
.claude/agents/devops.md | scripts/, tools/dashboard/ | 스크립트 서브폴더 경로 |
.claude/rules/json-data.md | res://data/, res/data/ | game/data/, res://data/ |
.claude/rules/gdscript-style.md | res://data/ | 변경 없음 (이미 res://data/) |
.claude/rules/pixel-art.md | scripts/validate-asset.sh | 서브폴더 경로 |
.claude/settings.json | ./scripts/log-*.sh 등 | 서브폴더 경로 |
docs/CLAUDE.md | tasks/, changelog.json 등 | 구조 업데이트 |
src/CLAUDE.md | res/data/ | data/ (game/ 내부 상대경로) |
4.7 대시보드 참조
| 파일 | 현재 | 변경 |
|---|---|---|
tools/dashboard/server/api.js:20 | docs/tasks/backlog.json | → ops/tasks/backlog.json |
tools/dashboard/CLAUDE.md | docs/tasks/backlog.json | → ops/tasks/backlog.json |
tools/dashboard/docusaurus.config.js | docs 경로 ../../docs | 확인 필요 (상대경로 동일) |
4.8 .gitattributes — 변경 없음
현재 패턴(*.png, *.ogg 등)은 확장자 기반이므로 폴더 이동에 영향 없음.
4.9 .gitignore — 업데이트 필요
| 현재 | 변경 |
|---|---|
.godot/ | game/.godot/ |
| 기타 Godot 관련 패턴 | game/ 접두사 추가 |
5. Godot project.godot 이동 시 고려사항
5.1 res:// 경로 체계
- Godot의
res://는project.godot위치 기준 project.godot를game/으로 이동하면,game/이 새로운res://루트- game/ 내부에
src/,res/,addons/,test/,data/를 배치하므로 기존res://src/...,res://res/...경로 유지 - 유일한 변경:
res://res/data/→res://data/(data/ 승격)
5.2 .godot/ 캐시
.godot/는 Godot 에디터가 자동 생성하는 캐시 디렉토리- 이동 후 Godot 에디터를
game/project.godot으로 열면game/.godot/가 자동 재생성됨 - 기존 루트의
.godot/는 삭제 가능 (gitignore 대상) - 주의:
.godot/imported/에 임포트 캐시가 있으나 재빌드 가능하므로 이동 불필요
5.3 에디터 실행 방법 변경
# 현재
godot --path .
# 변경 후
godot --path game/
# 또는
cd game/ && godot
5.4 GdUnit4 테스트
test/가game/test/로 이동하므로res://test/...경로 유지scripts/run-tests.sh에서--path인자를game/으로 변경 필요
5.5 .uid 파일
- Godot 4.x는
*.uid파일을 사용하여 리소스 고유 ID 관리 git mv로 파일 이동하면.uid파일도 함께 이동되어 ID 유지.godot/uid_cache.bin은 재생성 가능