Skip to content

refactor(clean-arch): 레거시 훅 클린 아키텍처 마이그레이션 완료#1

Merged
honorstudio merged 18 commits intomainfrom
refactor/clean-architecture-migration
Jan 26, 2026
Merged

refactor(clean-arch): 레거시 훅 클린 아키텍처 마이그레이션 완료#1
honorstudio merged 18 commits intomainfrom
refactor/clean-architecture-migration

Conversation

@honorstudio
Copy link
Copy Markdown
Owner

Summary

  • 레거시 훅(useBattleLogic, useGameEngine) 클린 아키텍처 리팩토링
  • 신규 Domain UseCase 12개 추가 (전투 6개, 플레이어 4개)
  • Supabase Repository 10개 추가 (TDD)
  • 어드민 페이지 83% 코드 감소 (3,269줄 → 556줄)
  • 테스트 130개 추가 (222개 → 352개)

주요 변경사항

레거시 훅 리팩토링

파일 시작 최종 감소율
useGameEngine.ts 1,177줄 952줄 19%
settings/page.tsx 3,269줄 556줄 83%

신규 Domain UseCase

전투:

  • PassiveReflect, AutoPotion, SkillDamage
  • DoubleAttack, EffectTick, SkillSelector

플레이어:

  • CalculatePlayerStats, CalculateEquipmentBonus
  • CalculateBuffBonus, CalculateDerivedStats

신규 Repository (Supabase)

  • RarityRepository, ClassRepository, WorldRepository
  • AlgorithmRepository, CraftingRecipeRepository, VillageRepository
  • MonsterRepository, SkillRepository, ItemRepository, DungeonRepository 확장

버그 수정

  • 알고리즘 페이지 데이터 로딩 버그 수정 (기본값 병합)

Test plan

  • npm test - 352개 테스트 통과
  • E2E 테스트 - 게임 전투 시스템 검증 (플레이어/몬스터 공격, 스킬)
  • E2E 테스트 - 관리자 페이지 전체 동작 확인

🤖 Generated with Claude Code

honorstudio and others added 18 commits January 25, 2026 10:45
- 클린 아키텍처 준수 여부 분석 (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>
@honorstudio honorstudio merged commit 6512933 into main Jan 26, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant