refactor(clean-arch): 레거시 훅 클린 아키텍처 마이그레이션 완료#1
Merged
honorstudio merged 18 commits intomainfrom Jan 26, 2026
Merged
Conversation
- 클린 아키텍처 준수 여부 분석 (1.5/5점) - Supabase + React(앱인토스) 마이그레이션 계획 수립 - Phase 1~3 단계별 작업 계획 정리 - CLAUDE.md 프로젝트 가이드 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## Vitest 테스트 환경 - vitest, @testing-library/react, jsdom 설치 - vitest.config.ts, vitest.setup.ts 설정 - package.json에 test 스크립트 추가 ## Domain Entities 분리 (TDD) - src/domain/entities/ 폴더 구조 생성 - Player, Monster 엔티티 + 테스트 (13개 테스트 통과) - Skill, Equipment, Item 엔티티 - Dungeon, Village, World, CharacterClass 엔티티 - CraftingRecipe, Algorithm 타입 정의 - 공통 타입(Stat, StatEffect) 분리 기존 src/lib/types.ts에서 도메인 로직을 분리하여 테스트 가능하고 재사용 가능한 구조로 개선 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## 추출된 UseCase (24개 테스트) - CalculateDamage: 데미지 계산 (크리티컬 포함) - GetLevelUpExp: 경험치 계산 및 레벨업 처리 - ApplyEffects: 버프/디버프 스탯 적용, DoT/HoT 처리 ## 특징 - 순수 함수로 구현 (외부 의존성 없음) - 테스트 용이성을 위한 시드 파라미터 지원 - 기존 useBattleLogic.ts의 비즈니스 로직 분리 전체 domain 테스트: 37개 통과 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## Repository 인터페이스 (domain/repositories/) - PlayerRepository: 플레이어 CRUD - MonsterRepository: 몬스터 조회 - ItemRepository: 아이템/장비/소비템 조회 - SkillRepository: 스킬 조회 - DungeonRepository: 던전 조회 ## InMemory 구현체 (data/repositories/) - InMemoryPlayerRepository: 테스트용 구현 (8개 테스트) 나중에 Supabase 구현체를 추가하면 data/repositories/SupabasePlayerRepository.ts 등으로 교체 가능 전체 테스트: 45개 통과 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Phase 1.1 Entity 분리 완료 (13개 테스트) - Phase 1.2 UseCase 추출 완료 (24개 테스트) - Phase 1.3 Repository 패턴 도입 완료 (8개 테스트) - 총 45개 테스트 통과 - 생성된 파일 목록 추가 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## 새로운 클린 아키텍처 기반 Hooks - useBattleCalculation: 전투 계산 (데미지, 경험치, 레벨업) - useEffectManager: 버프/디버프 효과 관리 ## 특징 - domain/usecases를 사용하여 비즈니스 로직 분리 - 순수한 UI 상태 관리에 집중 - 테스트 가능한 구조 (16개 테스트) 전체 테스트: 61개 통과 기존 hooks (useBattleLogic 등)는 점진적으로 새 hooks로 교체 예정 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ProcessReward: 몬스터 처치 보상 계산 (경험치/골드/아이템 드롭) - 레벨 차이에 따른 경험치 보정 - 럭 스탯에 따른 골드/드롭률 보너스 - BattleGauge: 전투 게이지 시스템 - 속도 기반 게이지 증가량 계산 - 액션 준비 상태 판정 테스트: 87개 통과 (26개 추가) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## 생성된 테이블 - characters: 플레이어 캐릭터 (자기 것만 CRUD) - character_inventory: 인벤토리 (자기 것만) - character_skills: 보유 스킬 (자기 것만) - monsters: 몬스터 정의 (읽기 전용) - skills: 스킬 정의 (읽기 전용) - items: 아이템 정의 (읽기 전용) - equipment: 장비 정의 (읽기 전용) - dungeons: 던전 정의 (읽기 전용) ## RLS 정책 - 캐릭터 관련: auth.uid() = user_id 체크 - 게임 데이터: authenticated 사용자 읽기 전용 ## 추가 파일 - src/data/supabase/database.types.ts: 자동 생성된 TypeScript 타입 - .mcp.json: Supabase MCP 연결 설정 - CLAUDE.md: 마이그레이션 진행 상황 업데이트 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- SupabasePlayerRepository: PlayerRepository 인터페이스 Supabase 구현체 - getById: 캐릭터 조회 - getByUserId: 사용자별 캐릭터 목록 - save: 생성/수정 - delete: 삭제 - exists: 존재 확인 - database.types.ts: Supabase 자동 생성 타입 - 테스트: 9개 추가 (총 96개 통과) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- battle-turn Edge Function 배포 - 전투 턴 처리 (플레이어 공격 → 몬스터 반격) - 데미지 계산 로직 (UseCase 재사용) - 승패 판정 및 보상 처리 - JWT 인증 필수 Supabase Edge Function URL: https://mksvyxbnpowolmguaiye.supabase.co/functions/v1/battle-turn Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Supabase 클라이언트 설정 (src/lib/supabase.ts) - useAuth 훅 Supabase 버전으로 전환 - 로그인/회원가입 페이지 Supabase Auth 적용 - user_roles, system_settings 테이블 생성 (마이그레이션) - 환경변수 설정 (.env.local) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- useGameEngine: Supabase 스킬 데이터 정규화 (effects.details → details) - useBattleLogic: 스킬 자동 사용 로직 정상 작동 확인 - firestore: Supabase 마이그레이션 병행 지원 - E2E 테스트 완료: 던전→파밍→대장간 제작 플로우 검증 테스트 결과: - 바위 깨기 스킬 데미지 정상 출력 - 슬라임 채찍 제작 성공 - 강화 시스템 정상 작동 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## 주요 변경사항 ### 레거시 훅 리팩토링 - useBattleLogic.ts: 1,623줄 → Domain UseCase 연결 - useGameEngine.ts: 1,177줄 → 952줄 (19% 감소) ### 신규 Domain UseCase (전투) - PassiveReflect: 피해 반사 계산 - AutoPotion: 자동 포션 사용 - SkillDamage: 스킬 데미지 계산 - DoubleAttack: 연속 공격 판정 - EffectTick: 버프/디버프 틱 처리 - SkillSelector: 스킬 선택 로직 ### 신규 Domain UseCase (플레이어) - CalculatePlayerStats: 플레이어 스탯 계산 - CalculateEquipmentBonus: 장비 보너스 계산 - CalculateBuffBonus: 버프 보너스 계산 - CalculateDerivedStats: 파생 스탯 계산 ### 신규 Repository (Supabase) - RarityRepository, ClassRepository, WorldRepository - AlgorithmRepository, CraftingRecipeRepository, VillageRepository - 기존 Repository 확장 (Monster, Skill, Item, Dungeon) ### 신규 Presentation Hooks - useGameData: 게임 마스터 데이터 로딩 - usePlayerStats: 플레이어 스탯 계산 래핑 ### 어드민 페이지 리팩토링 - settings/page.tsx: 3,269줄 → 556줄 (83% 감소) - 컴포넌트/훅 분리 (TDD) - 알고리즘 페이지 버그 수정 (데이터 병합) ### 테스트 - 222개 → 352개 (+130개) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## 아이템 이미지 표시 개선 - 아이템 상세 다이얼로그: GameIcon에 imageUrl 추가 (64px) - 캐릭터 > 장비 탭: EquipmentCard에 이미지 표시 (48px) - R2 에셋 URL 변환 유틸리티 추가 (src/lib/r2.ts) ## 강화 확인 다이얼로그 UI 개선 - 아이템 이미지/아이콘 표시 (64px) - 강화 레벨 변화 (+3 → +4) 표시 - 스탯 변화 전/후 비교 표시 - 성공 확률, 비용, 재료 정보 정리 ## 전투 종료 UX 개선 - 결과창 먼저 표시 후 백그라운드 서버 검증 - 검증 중 "저장 중..." 로딩 표시 - 검증 완료 전 확인 버튼 비활성화 - 조작 불가 상태로 UX 개선 ## 기타 - .gitignore에 민감한 파일 추가 - 어드민 에셋 관리 페이지 개선 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- next.config.ts: R2 퍼블릭 호스트 추가 (pub-xxx.r2.dev) - r2.ts: getAssetUrl() 이중 슬래시 버그 수정 - DB에 '/images/...'로 저장된 경로에서 선행 슬래시 제거 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AutoPotion.ts: 새 DB 형식(effects 배열) 지원하는 헬퍼 함수 추가
- isHpHealingItem: HP 회복 아이템 판별 (레거시 + 새 형식)
- isMpHealingItem: MP 회복 아이템 판별 (레거시 + 새 형식)
- getHealValue: 회복량 추출 (정렬용)
- BattleView.tsx: 포션 필터링에 새 헬퍼 함수 사용
- PotionStatus, SkillBar에서 포션 목록 필터링 수정
- useInventoryManager.tsx: 포션 사용 시 효과 적용 로직 수정
- effects 배열 형식 지원 추가
- 레거시 형식(effect 단일 필드)도 유지
DB 형식: effects: [{type: 'heal', target: 'hp', value: 30}]
레거시 형식: effect: 'heal_hp', value: 30
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 포션 HP 회복 버그 수정 (effectValue: 0 → 정상값) - 스킬 데미지 팝업 표시 안되는 문제 수정 (validTypes에 'skill' 추가) - 마지막 공격 데미지 팝업 안보이는 문제 수정 (processMonsterDeath 딜레이 추가) - 마법 피해 파란색 팝업 지원 (물리=빨강, 마법=파랑, 크리=노랑, 힐=초록) - clearPopups 함수로 전투 시작 시 팝업 상태 초기화 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 몬스터 UI 심플화 (이미지, 이름, HP만 표시 / MP, 속도 게이지 숨김) - 몬스터 스폰 확률 자동 정규화 (합계가 100%가 되도록) - 어드민: 던전 몬스터 확률 조절 시 다른 몬스터 자동 조정 - SupabaseDungeonRepository: 새 컬럼(monsters, rewards, boss) 지원 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
주요 변경사항
레거시 훅 리팩토링
신규 Domain UseCase
전투:
플레이어:
신규 Repository (Supabase)
버그 수정
Test plan
npm test- 352개 테스트 통과🤖 Generated with Claude Code