fix: 크로스 프로젝트 통신 버그 수정 (8건) #1

Open
tolelom wants to merge 1 commits from fix/cross-project-communication into main
Owner

배경

Unity 클라이언트 ↔ MMO 서버 ↔ Go API 서버 간 통신 로직을 전수 검증한 결과,
보스 레이드 진입 흐름에서 치명적 버그 2건을 포함하여 총 8건의 이슈를 발견하고 수정했습니다.

수정 내역

Critical (서버 시작 불가 / 기능 완전 불능)

1. Tokens 타입 불일치 — 보스 레이드 입장이 항상 실패

  • Go API 서버는 tokens를 JSON object({"user1":"abc..."})로 반환
  • MMO 서버는 이를 string?으로 역직렬화 시도 → JsonException 발생 → 3회 재시도 후 null 반환
  • 결과: BossRaidAccesssAsync가 항상 null을 반환하여 보스 레이드 입장이 100% 실패
  • 수정: string? TokensDictionary<string, string>? Tokens (BossRaidResult, BossRaidAccessResponse 양쪽)

2. return false; 컴파일 에러 (409 핸들러)

  • BossRaidAccesssAsync 반환형이 bool?BossRaidResult?로 변경되었으나, 409 핸들러의 return false;가 그대로 남음
  • 수정: return false;return null;

Medium (잘못된 동작)

3. INTO_BOSS_RAID 패킷 전송 대상 오류

  • 기존: foreach 루프 안에서 SendTo(peer, ...) → 파티장에게 파티원 수만큼 중복 전송, 파티원은 0회 수신
  • 수정: SendTo(memberPeer, ...) → 각 파티원에게 본인의 entry token과 함께 1회씩 전달
  • 이로써 파티원도 INTO_BOSS_RAID 패킷을 수신하여 씬 전환 가능 (기존 BUG 4 동시 해결)

4. GetPlayer() NullReferenceException

  • 파티원이 연결 해제된 상태에서 channel.GetPlayer(memberId).Nickname 호출 시 NRE 발생
  • 수정: null 체크 후 continue

5. BossId 하드코딩

  • 기존: BossRaidAccesssAsync(userNames, 1) — 항상 bossId=1
  • 수정: BossRaidAccesssAsync(userNames, packet.RaidId) — 클라이언트가 보낸 값 사용

Low (데이터 불완전)

6. Player 클래스 전투 스탯 필드 누락

  • PlayerInfo에 ProtoMember 10~14가 추가되었으나 Player 클래스에 대응 필드 없음
  • 수정: Player에 Experience, NextExp, AttackPower, AttackRange, SprintMultiplier 추가

7. ToPlayerInfo 새 필드 미매핑

  • 수정: ToPlayerInfo()에서 새 5개 필드 매핑 추가

8. OnIntoChannelParty Nickname이 hashKey 숫자로 설정

  • 파티 채널 이동 시 Nickname = memberId.ToString() → 닉네임이 "12345" 같은 숫자
  • 수정: Session.UserName에서 가져오도록 변경

변경 파일

파일 변경
Api/BossRaidResult.cs Tokens 타입 수정
Api/RestApi.cs Tokens 타입 수정, 409 return 수정, null 안전 처리
Game/GameServer.cs OnIntoBossRaid 전송 대상·null 체크·bossId, ToPlayerInfo 매핑, OnIntoChannelParty Nickname
Game/Player.cs 전투 스탯 5개 필드 추가

참고

  • Unity 클라이언트 측 LobbySceneController.HandleBossRaidResult에서 GoToBoss() 호출 누락 이슈가 있었으나, 이번 수정(BUG 3)으로 파티원이 직접 INTO_BOSS_RAID 패킷을 수신하게 되어 해소됨
  • Go API 서버와 Dedicated 서버 간 통신은 정상 확인 완료
## 배경 Unity 클라이언트 ↔ MMO 서버 ↔ Go API 서버 간 통신 로직을 전수 검증한 결과, 보스 레이드 진입 흐름에서 치명적 버그 2건을 포함하여 총 8건의 이슈를 발견하고 수정했습니다. ## 수정 내역 ### Critical (서버 시작 불가 / 기능 완전 불능) **1. Tokens 타입 불일치 — 보스 레이드 입장이 항상 실패** - Go API 서버는 `tokens`를 JSON object(`{"user1":"abc..."}`)로 반환 - MMO 서버는 이를 `string?`으로 역직렬화 시도 → `JsonException` 발생 → 3회 재시도 후 null 반환 - 결과: `BossRaidAccesssAsync`가 항상 null을 반환하여 보스 레이드 입장이 100% 실패 - **수정**: `string? Tokens` → `Dictionary<string, string>? Tokens` (BossRaidResult, BossRaidAccessResponse 양쪽) **2. `return false;` 컴파일 에러 (409 핸들러)** - `BossRaidAccesssAsync` 반환형이 `bool?` → `BossRaidResult?`로 변경되었으나, 409 핸들러의 `return false;`가 그대로 남음 - **수정**: `return false;` → `return null;` ### Medium (잘못된 동작) **3. INTO_BOSS_RAID 패킷 전송 대상 오류** - 기존: foreach 루프 안에서 `SendTo(peer, ...)` → 파티장에게 파티원 수만큼 중복 전송, 파티원은 0회 수신 - **수정**: `SendTo(memberPeer, ...)` → 각 파티원에게 본인의 entry token과 함께 1회씩 전달 - 이로써 파티원도 INTO_BOSS_RAID 패킷을 수신하여 씬 전환 가능 (기존 BUG 4 동시 해결) **4. GetPlayer() NullReferenceException** - 파티원이 연결 해제된 상태에서 `channel.GetPlayer(memberId).Nickname` 호출 시 NRE 발생 - **수정**: null 체크 후 continue **5. BossId 하드코딩** - 기존: `BossRaidAccesssAsync(userNames, 1)` — 항상 bossId=1 - **수정**: `BossRaidAccesssAsync(userNames, packet.RaidId)` — 클라이언트가 보낸 값 사용 ### Low (데이터 불완전) **6. Player 클래스 전투 스탯 필드 누락** - PlayerInfo에 ProtoMember 10~14가 추가되었으나 Player 클래스에 대응 필드 없음 - **수정**: Player에 Experience, NextExp, AttackPower, AttackRange, SprintMultiplier 추가 **7. ToPlayerInfo 새 필드 미매핑** - **수정**: ToPlayerInfo()에서 새 5개 필드 매핑 추가 **8. OnIntoChannelParty Nickname이 hashKey 숫자로 설정** - 파티 채널 이동 시 `Nickname = memberId.ToString()` → 닉네임이 "12345" 같은 숫자 - **수정**: `Session.UserName`에서 가져오도록 변경 ## 변경 파일 | 파일 | 변경 | |------|------| | `Api/BossRaidResult.cs` | Tokens 타입 수정 | | `Api/RestApi.cs` | Tokens 타입 수정, 409 return 수정, null 안전 처리 | | `Game/GameServer.cs` | OnIntoBossRaid 전송 대상·null 체크·bossId, ToPlayerInfo 매핑, OnIntoChannelParty Nickname | | `Game/Player.cs` | 전투 스탯 5개 필드 추가 | ## 참고 - Unity 클라이언트 측 `LobbySceneController.HandleBossRaidResult`에서 `GoToBoss()` 호출 누락 이슈가 있었으나, 이번 수정(BUG 3)으로 파티원이 직접 INTO_BOSS_RAID 패킷을 수신하게 되어 해소됨 - Go API 서버와 Dedicated 서버 간 통신은 정상 확인 완료
tolelom added 1 commit 2026-03-16 15:22:25 +00:00
- Tokens 타입 string? → Dictionary<string,string>? (Go API JSON object 역직렬화 실패 수정)
- 409 응답 핸들러 return false → return null (컴파일 에러 수정)
- INTO_BOSS_RAID 파티원 각자에게 본인 토큰과 함께 전달 (기존: 파티장에게 N번 중복)
- GetPlayer null 체크 추가 (NullReferenceException 방지)
- BossId 하드코딩 1 → packet.RaidId 사용
- Player 클래스에 Experience/AttackPower 등 전투 스탯 필드 추가
- ToPlayerInfo에서 새 필드 매핑 추가
- OnIntoChannelParty Nickname을 Session.UserName에서 가져오도록 수정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tolelom changed title from fix: 크로스 프로젝트 통신 버그 수정 to fix: 크로스 프로젝트 통신 버그 수정 (8건) 2026-03-16 15:23:26 +00:00
This pull request has changes conflicting with the target branch.
  • MMOTestServer/MMOserver/Api/BossRaidResult.cs
  • MMOTestServer/MMOserver/Api/RestApi.cs
  • MMOTestServer/MMOserver/Game/GameServer.cs
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin fix/cross-project-communication:fix/cross-project-communication
git checkout fix/cross-project-communication
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: A301/a301_mmo_game_server#1