프로젝트 개요
report · 6 of 9 · 2 commits · e146f407db9cce868b70169902430e6e8a3a8dff..a9f55cbc4b55c1a6df7191870246b775261a3710

턴 상태 분리는 전진이나 서버 권위 공백이 여전히 크다.

HIGH 진행도 35% ( -2pts) 2026. 4. 30. PM 2:24

프로젝트 예상 진행도

기준: 2026. 4. 30. PM 2:24
35 / 100

문서화 상태

Design
2/10
Technical
1/10
Spec
1/10
#턴시스템 #네트워킹 #서버권위 #문서부채 #스크립터블오브젝트

YJ — 턴 상태 분리 스냅샷

1. 주요 변경사항

2. 코드 품질 리뷰

TurnMachine 도입은 좋은 방향이다. 턴, 생명, 왕 대기 상태가 PlayerController 안에 흩어져 있던 구조를 줄이려는 의도가 분명하다. GameConfigSO도 매직 넘버를 씬 인스펙터 값에서 데이터 에셋으로 옮긴 점에서 긍정적이다. 다만 현재 구현은 “분리”에 머물렀고, “권한의 주인”은 아직 정리되지 않았다. TurnMachine이 각 클라이언트에서 독립 생성되므로 네트워크 지연, 재접속, 패킷 중복 상황에서 턴 상태가 갈라질 수 있다.

가장 큰 위험은 게임 종료 처리다. 서버가 S_GameOver를 무시하도록 바꾼 것은 보안상 맞다. 그러나 클라이언트의 SendGameOverPacket() 호출은 그대로 남아 있다. 즉, 조작 취약점은 막았지만 서버가 승패를 새로 판정해서 내려주는 경로는 아직 없다. 이 상태에서는 한 클라이언트는 결과 UI를 띄우고, 다른 클라이언트는 게임이 계속되는 식의 분기 가능성이 있다.

case PacketID.S_GameOver:
    Console.WriteLine("[Security] 클라이언트로부터 잘못된 S_GameOver 수신. 무시합니다.");
    break;

또한 Start()에서 config.maxTimeoutCount를 바로 참조한다. 현재 씬에는 연결됐지만, 새 씬·테스트 씬·프리팹 재사용 시 null이면 즉시 런타임 예외다. 설정 에셋을 쓸 때는 OnValidateAwake에서 명시적으로 실패시키고, 어떤 값이 필수인지 로그로 남기는 편이 좋다.

3. 진행도 평가

이번 변경은 턴 시스템을 별도 클래스로 빼고 설정을 ScriptableObject화했다는 점에서 구조적 전진이 있다. 특히 이전처럼 모든 룰 값이 PlayerController에 직접 붙어 있는 상태보다는 유지보수성이 좋아졌다. 그러나 멀티플레이 게임으로 보면 아직 핵심 상태가 서버 권위로 정착하지 않았다.

진행도는 약 35%로 본다. 로컬 핵심 루프 일부는 동작 가능한 단계로 보이나, 네트워크 권한 모델·게임 종료 동기화·문서화가 부족하다. 다음 단계에서 기능을 더 붙이면 속도는 날 수 있지만, 지금 권한 경계를 고정하지 않으면 디버깅 비용이 급격히 커진다.

4. 다음 권장사항

5. 문서화 상태

design 점수는 2점이다. 프로젝트의 의도나 게임 규칙 일부는 추정 가능하지만, GDD placeholder가 남아 있어 코어 루프와 플레이 경험 목표가 문서로 검증되지 않는다.

technical 점수는 1점이다. 커스텀 네트워크 스택을 쓰고 있는데 권한 모델, 패킷 흐름, 서버 검증 책임이 문서화되어 있지 않다. 지금은 코드를 읽어도 “누가 진짜 상태를 소유하는가”가 명확하지 않다.

spec 점수는 1점이다. 턴 제한 시간, 타임아웃 횟수, 승격 행 같은 수치는 생겼지만 입력·상태·결과 매핑과 씬 구성 사양이 없다. 테스트 체크리스트로 쓰기에는 아직 부족하다.

6. Backlog

7. 이전 Backlog 해결

리포트 타임라인

9개 스냅샷 · 최신순