Seven-Shards-ORIGIN — 로비 메시지 버퍼 안정화 스냅샷
1. 주요 변경사항
LobbyReadyMessenger의 슬롯 ID 전송 버퍼 크기 산정이 수동 UTF-8 byte 계산에서FastBufferWriter.GetWriteSize기반으로 바뀌었다.LobbyRoomPlayerStateMessenger의 클라이언트 메타 전송도 닉네임 문자열 직렬화 크기를 NGO API에 맡기도록 수정됐다.- 방 상태 브로드캐스트는 클라이언트별
ulong, 닉네임, 캐릭터 인덱스를 순회하며 합산하도록 바뀌었다. - 기존의
64바이트 패딩성 추정값이 제거된 점은 좋다. 다만 회귀 테스트 없이 수동 계산 구조는 여전히 남아 있다.
2. 코드 품질 리뷰
이번 수정의 방향은 타당하다. 문자열 직렬화는 단순히 UTF-8 본문 byte 수만으로 끝나지 않고 길이 정보와 내부 직렬화 규약이 함께 따라붙는다. 기존 방식은 짧은 ASCII 닉네임에서는 우연히 통과하고, 긴 문자열이나 다국어 문자열에서만 OverflowException이 터지는 전형적인 런타임 버그를 만든다. FastBufferWriter.GetWriteSize로 바꾼 것은 Unity NGO API와 책임을 맞춘 좋은 수정이다.
estimatedSize += sizeof(ulong)
+ FastBufferWriter.GetWriteSize(GetNickname(_orderedClientIds[i]))
+ sizeof(int);
위 패턴은 현재 write 순서와 맞아 보인다. 그러나 여전히 “쓰기 순서”와 “크기 계산 순서”가 별도로 유지된다. 이것이 문제인 이유는 다음 필드가 하나 추가될 때 한쪽만 고치면 같은 장애가 재발하기 때문이다. 개선하려면 메시지별 GetPayloadSize 헬퍼를 만들고, 실제 write 순서와 같은 순서로 계산하도록 묶어야 한다. 더 좋은 방식은 직렬화 라운드트립 테스트로 한글, 긴 닉네임, 빈 문자열, 최대 길이를 고정하는 것이다.
네트워킹 관점에서는 host가 방 상태를 브로드캐스트하고 client가 메타만 보내는 구조라 권한 방향은 크게 어긋나지 않는다. 다만 이번 diff 안에는 닉네임과 슬롯 ID 길이 상한 근거가 보이지 않는다. 클라이언트 입력 문자열이 무제한이면 버퍼 overflow는 고쳐도 전송량, UI 깨짐, 악의적 payload 문제가 남는다. 입력 단계에서 길이를 제한하고, 초과 시 잘림·거부 정책을 명시해야 한다.
3. 진행도 평가
이번 커밋은 기능 추가가 아니라 네트워크 로비 안정화 성격의 버그 수정이다. 플레이 가능성에는 긍정적이지만, 프로젝트 완성도 자체를 크게 끌어올리는 변화는 아니다. 커밋 메시지는 원인과 영역을 직접 말하고 있어 품질이 좋다.
현재 진행도는 약 56으로 본다. 로비 네트워킹의 런타임 예외 하나는 줄었지만, 문서·테스트·로컬라이즈·리소스 로딩 backlog가 그대로 남아 있다. 특히 네트워크 메시지는 작은 버그가 재접속과 멀티플레이 QA 비용을 급격히 키우므로 다음 스프린트에서 검증 자동화가 필요하다.
4. 다음 권장사항
- 로비 커스텀 메시지 직렬화 크기 회귀 테스트 추가. 한글, 빈 문자열, 긴 닉네임, 최대 슬롯 ID를 반드시 포함한다.
- 닉네임과 슬롯 ID 길이 상한 및 잘림 정책 명문화. 클라이언트 입력을 신뢰하지 않는 기준을 코드에 박아야 한다.
- 로비 메시지 스키마와 서버 권한 모델을 기술 문서에 추가. 누가 어떤 상태를 소유하는지 명확히 해야 한다.
- FastBufferWriter 크기 계산을 공용 헬퍼로 통일. write 순서와 size 산정 순서가 갈라지는 구조를 줄인다.
- GameLocale 변경 시 이미 렌더된 TMP 텍스트 재갱신. 캐시 무효화만으로는 사용자 화면이 바뀌지 않는다.
5. 문서화 상태
design은 4점으로 본다. 이번 커밋에서 게임 디자인 문서 갱신은 없고, 현재 스냅샷만으로 코어 루프와 플레이 경험 목표가 충분히 추적되지는 않는다.
technical은 3점이다. 네트워크 메시지, host/client 권한, 로비 상태 흐름이 코드에는 있으나 신규 개발자가 문서만 보고 안전하게 수정할 수준은 아니다. 이번 버퍼 버그도 메시지 스키마 문서와 테스트가 있었다면 더 빨리 잡혔을 가능성이 높다.
spec은 3점이다. 닉네임 길이, 슬롯 ID 규격, 로컬라이즈 누락 키 처리, Addressable 전환 기준 같은 QA 가능한 수치·규칙이 부족하다. 사양서는 체크리스트로 쓰일 수 있어야 하는데 아직 코드 관찰에 의존하는 비중이 크다.
6. Backlog
- 로비 커스텀 메시지 직렬화 크기 회귀 테스트 부재.
- GameLocale 변경 이벤트가 TMP 캐시만 무효화, 이미 그려진 텍스트는 재갱신 안 됨.
- NetworkMultiplayerLobbyRoot.prefab 변경이 대량 fileID 셔플을 포함.
- TrapFieldWest.unity 변경이 Mesh fileID 셔플 위주라 실질 변경 식별 난이도 높음.
- Resources 기반 UI 프리팹·로케일 대량 로딩 — Addressable 전환 미정.
- UI Bootstrap/Driver/RootRefs 3계층 규약이 코드 주석/.cursor 룰에만 존재.
- LocalizedStrings 가 en 이외 fallback 만 지원, 누락 키 수집/리포트 수단 없음.
- zh-Hans/zh-Hant/ja 폰트가 KR SDF 로 대리되어 표기 누락 잠재.