بنقرة واحدة
verify-data-persistence
플레이어 데이터의 DTO/Service 구조, 암호화 처리, 로컬 저장소 정합성을 검증합니다.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
플레이어 데이터의 DTO/Service 구조, 암호화 처리, 로컬 저장소 정합성을 검증합니다.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
| name | verify-data-persistence |
| description | 플레이어 데이터의 DTO/Service 구조, 암호화 처리, 로컬 저장소 정합성을 검증합니다. |
플레이어 데이터 레이어의 현대화된 아키텍처(DTO/Service/Encryption/Repository)가 안전하고 올바르게 동작하는지 검증합니다:
PlayerDataDTO가 필드 위주로 구성되어 있고 로직을 포함하지 않는지 확인PlayerDataService가 IPlayerDataService를 구현하고 암호화/저장소 의존성을 명시적으로 주입받는지 확인EncryptionService를 통해 데이터가 암호화되어 저장되는지, PlayerPrefs가 잔존하지 않는지 확인await 여부) 및 실시간 저장 흐름 확인PlayerDataDTO.cs)를 변경했을 때PlayerDataService.cs, LocalPlayerDataRepository.cs)을 수정했을 때| File | Purpose |
|---|---|
Assets/_Game/Scripts/Data/DTOs/PlayerDataDTO.cs | 플레이어 데이터 전송 객체 (POCO) |
Assets/_Game/Scripts/Data/DTOs/ServerSessionDTO.cs | 서버 서비스 세션 DTO (Auth/GameData/Post) |
Assets/_Game/Scripts/Data/DTOs/ScenePayloadDTO.cs | 씬 전환 통합 페이로드 DTO |
Assets/_Game/Scripts/Data/Services/PlayerDataService.cs | 데이터 관리 비즈니스 로직 서비스 |
Assets/_Game/Scripts/Data/Services/EncryptionService.cs | RSA/AES 암호화 서비스 |
Assets/_Game/Scripts/Data/LocalPlayerDataRepository.cs | 로컬 파일 시스템 저장소 |
Assets/_Game/Scripts/Data/ServerManager.cs | 서버 서비스 팩토리 (싱글톤 제거 확인용) |
PlayerDataDTO가 데이터를 담는 용도로만 사용되는지, 필드명이 표준(PascalCase)을 따르는지 확인합니다.
파일: Assets/_Game/Scripts/Data/DTOs/PlayerDataDTO.cs
검사:
# 1. MonoBehaviour 상속 여부 확인 (상속하지 않아야 함)
grep "class PlayerDataDTO : MonoBehaviour" Assets/_Game/Scripts/Data/DTOs/PlayerDataDTO.cs
# 2. 필드 명명 규칙 확인 (모두 PascalCase 여부)
# lowercase로 시작하는 public 필드가 있는지 탐색
grep "public [a-z]" Assets/_Game/Scripts/Data/DTOs/PlayerDataDTO.cs
PASS: MonoBehaviour를 상속받지 않으며, 모든 public 필드가 대문자로 시작함
FAIL: MonoBehaviour 잔존 또는 camelCase 필드 존재
수정: POCO로 변경하고 필드명 일괄 수정
PlayerDataService의 생성자가 필요한 의존성을 모두 주입받고 있는지 확인합니다.
파일: Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
검사:
grep "public PlayerDataService(" Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
PASS: EncryptionService 및 LocalPlayerDataRepository 매개변수 존재
FAIL: 기본 생성자만 있거나 싱글톤 참조 사용
수정: Constructor Injection 패턴 적용
LobbyUIViewManager 및 GameManager 등 주요 매니저들이 ScenePayloadDTO를 통해 데이터를 수신하고 초기화하는지 확인합니다.
검사:
# 1. GameManager에서의 페이로드 캐스팅 확인
grep "if (payload is ScenePayloadDTO scenePayload)" Assets/_Game/Scripts/InGame/Manager/GameManager.cs
# 2. LobbyUIViewManager에서의 페이로드 캐스팅 확인 (InGame.Data 네임스페이스 포함)
grep "if (payload is InGame.Data.ScenePayloadDTO scenePayload)" Assets/_Game/Scripts/Lobby/LobbyUIViewManager.cs
PASS: 두 파일 모두에서 ScenePayloadDTO를 사용한 조건문이 검색됨
FAIL: 검색되지 않거나 구식 방식으로 초기화 중
수정: OnInitialize(object payload) 메서드 내에서 ScenePayloadDTO 캐스팅 로직 구현
ServerManager가 싱글톤을 사용하지 않고, 팩토리로서 세션을 제공하는지 확인합니다.
파일: Assets/_Game/Scripts/Data/ServerManager.cs
검사:
# 1. Instance 필드/프로퍼티 부재 확인 (외부에서 인스턴스에 직접 접근하지 못해야 함)
grep "public static ServerManager Instance" Assets/_Game/Scripts/Data/ServerManager.cs
# 2. GetSession 메서드 존재 확인
grep "public ServerSessionDTO GetSession()" Assets/_Game/Scripts/Data/ServerManager.cs
PASS: Instance가 검색되지 않거나(또는 비공개), GetSession이 존재함
FAIL: Instance가 public으로 남아있거나 GetSession이 없음
수정: 싱글톤 패턴 제거 및 세션 반환 메서드 구현
PlayerDataService가 더 이상 AddCalculation을 사용하지 않고, 클라이언트 주도의 절대값 업로드를 수행하는지 확인합니다.
파일: PlayerDataService.cs, GameManager.cs
검사:
# 1. UpdateCurrencyDeltaAsync 메서드 폐기 확인 (grep 결과가 없어야 함)
grep "UpdateCurrencyDeltaAsync" Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
# 2. AddCalculation 키워드 사용 여부 확인 (기존 코드에서 제거되었는지 확인)
grep "AddCalculation" Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
# 3. GameManager.SaveGameResult에서 includeCurrency: true를 사용한 전체 업로드 확인
grep "UploadToServerAsync(includeCurrency: true)" Assets/_Game/Scripts/InGame/Manager/GameManager.cs
PASS: UpdateCurrencyDeltaAsync 및 AddCalculation이 발견되지 않으며, GameManager에서 절대값 업로드를 대기함
FAIL: 구식 합산 방식이 남아있거나 절대값 업로드 호출 누락
수정: UpdateCurrencyDeltaAsync 삭제 및 절대값 업로드 로직으로 통합
서버에 저장된 AddCalculation 데이터({"number": val, "operator": "+"})를 안전하게 파싱하여 로컬 m_data에 반영하는지 확인합니다.
파일: Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
검사:
# 1. targetData가 Object이고 "number" 키를 포함하는지 체크하는 로직 확인
grep "targetData.IsObject && targetData.Keys.Contains(\"number\")" Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
# 2. 추출된 number가 m_data의 해당 필드(Currency1, Currency2 등)에 할당되는지 확인
grep -A 5 "targetData\[\"number\"\].ToString()" Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
PASS: IsObject 확인 후 number 값을 추출하여 m_data 필드에 할당하는 로직 존재
FAIL: 오브젝트 형식 처리 누락 또는 m_data 반영 전 단순 리턴
수정: ParseIntSafe/ParseFloatSafe 내에 오브젝트 하위 필드 추출 및 할당 로직 보강
재화 변경 시 실시간 저장이 이루어지는지, 핵심 저장 로직이 씬 전환 전에 완료되는지 확인합니다.
검사:
# 1. PlayerDataService에서 재화 변경 시 SaveData() 호출 확인
grep -A 5 "m_data.Currency1 +=" Assets/_Game/Scripts/Data/Services/PlayerDataService.cs | grep "SaveData()"
# 2. GameManager에서 씬 전환 전 SaveGameResult를 기다리는지(await) 확인
# SaveAndCleanupAsync가 Forget()으로 실행되는지 await로 실행되는지 체크
grep -n "SaveAndCleanupAsync().Forget()" Assets/_Game/Scripts/InGame/Manager/GameManager.cs
PASS: 재화 변경 시 즉시 저장되며, 중요 시점(GameOver 등)에서 저장 완결성이 보장됨
FAIL: Forget() 사용으로 인해 씬 전환 시 저장이 취소될 위험이 있거나 저장 호출 누락
수정: UniTaskVoid 대신 UniTask를 반환하고 씬 로드 전 await 처리
서버 로드 실패 시의 폴백 로직과 데이터 덮어쓰기 위험을 확인합니다.
파일: Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
검사:
# LoadFromServerAsync에서 실패 시(catch/null)의 처리 확인
grep -A 10 "catch (Exception ex)" Assets/_Game/Scripts/Data/Services/PlayerDataService.cs
PASS: 예외 발생 시 로그를 남기고 false를 반환하여 호출 측에서 인지 가능함
FAIL: 에러 발생 시 부분적인 데이터만 덮어씌워져 정합성이 깨질 위험이 있음
수정: 원자적(Atomic) 업데이트 로직 적용 또는 로드 실패 시 경고 팝업 고도화
| 검사 항목 | 상태 | 상세 |
|---|---|---|
| DTO 정합성 | PASS | POCO 및 PascalCase 준수 |
| 서비스 주입 | PASS | DI 패턴 및 GameDataService 주입 확인 |
| 서버 동기화 | PASS | 실시간 업로드 및 완결 대기 확인 |
| 데이터 유실 방지 | PASS | 씬 전환 시 저장 완결성 확인 |
| 보안성 | PASS | PlayerPrefs 완전 제거됨 |
PlayerPrefs는 볼륨 설정이나 간단한 옵션 데이터에는 예외적으로 허용될 수 있으나, 게임 진행 데이터에는 금지합니다.PlayerPrefs는 검사에서 제외합니다.인게임 핵심 시스템(GameManager, UIManager), 초기화 순서 안전성, UI 데이터 바인딩을 검증합니다.
로비 UI의 팝업 관리 및 뒤로가기(ESC) 로직을 검증합니다. PopupManager 등록 및 중복 입력 처리 여부를 확인합니다.
타이틀 씬의 로그인 흐름(MVVM), 어드레서블 로딩, 앱 업데이트 관리를 검증합니다.
프로젝트 전체의 사운드 구현 패턴을 검증합니다. 싱글톤(Singleton) 대신 인터페이스 주입(DI) 방식의 사용을 권장합니다.
세션 변경사항을 분석하여 검증 스킬 누락을 탐지합니다. 기존 스킬을 동적으로 탐색하고, 새 스킬을 생성하거나 기존 스킬을 업데이트한 뒤 GEMINI.md를 관리합니다.
프로젝트의 모든 verify 스킬을 순차 실행하여 통합 검증 보고서를 생성합니다. 기능 구현 후, PR 전, 코드 리뷰 시 사용.