1. 문제
빵야 게임 프로젝트를 진행중에 prepareNotification을 클라이언트에 보낼때 문제가 발생했다.
정상적으로 데이터가 잘가서 room의state가 prepare로 바뀌어서 클라이언트가 굳어지는 작동을 확인했는데,
캐릭터와 역할을 분배해주지 않는 문제가 있었다.
2. 원인 파악
서버에 무작정 로그를 박아서 봤지만 서버에서는 원인을 찾을 수 없었다. 그러다 클라이언트쪽에 로그를 찍으며 확인해보니 FindIndex부분에서 참조할수 없는 값이라는 에러를 확인할 수 있었다.
3. 그렇게 찾아내어도 state는 정상작동했기에 서버쪽에서 보내는 데이터에는 문제가 없을줄 알았다.
하지만 createResponse단계에서 encode전의 데이터와 decode후의 데이터를 비교해보니 인코드 전후로 characterData가 유실됨을 확인할 수 있었다.
스타트 // 인코드 전 데이터
{
"gamePrepareNotification": {
"room": {
"id": 1,
"ownerId": 5,
"name": "어딜 넘봐?",
"maxUserNum": 7,
"state": 1,
"users": [
{
"id": 5,
"nickname": "1",
"character": {
"characterType": 9,
"roleType": 3,
"hp": 4,
"weapon": 0,
"stateInfo": 0,
"equips": 0,
"debuffs": 0,
"handCards": 0,
"bbangCount": 0,
"handCardsCount": 0
}
},
{
"id": 6,
"nickname": "2",
"character": {
"characterType": 8,
"roleType": 1,
"hp": 5,
"weapon": 0,
"stateInfo": 0,
"equips": 0,
"debuffs": 0,
"handCards": 0,
"bbangCount": 0,
"handCardsCount": 0
}
}
]
}
}
}
스타트2 // 인코드 후 데이터
GamePacket {
gamePrepareNotification: S2CGamePrepareNotification {
room: RoomData {
users: [
UserData {
id: Long { low: 5, high: 0, unsigned: false },
nickname: '1',
character: CharacterData {
equips: [],
debuffs: [],
handCards: [],
characterType: 9,
roleType: 3,
hp: 4,
weapon: 0,
stateInfo: CharacterStateInfoData {},
bbangCount: 0,
handCardsCount: 0
}
},
UserData {
id: Long { low: 6, high: 0, unsigned: false },
nickname: '2',
character: CharacterData {
equips: [],
debuffs: [],
handCards: [],
characterType: 8,
roleType: 1,
hp: 5,
weapon: 0,
stateInfo: CharacterStateInfoData {},
bbangCount: 0,
handCardsCount: 0
}
}
],
id: 1,
ownerId: Long { low: 5, high: 0, unsigned: false },
name: '어딜 넘봐?',
maxUserNum: 7,
state: 1
}
}
}
4. protobuf확인
캐릭터데이터와 유저데이터는 제대로 정의되어있음을 확인할 수 있었다.
원인은 이곳이었다.
game클래스 내부에서 관리하고있는데 users의 characterData를 필드값으로 사용하고 있었다....
이것을 프로토메세지와 맞춰줘야하는데 proto에서는 characterData character 로 되어있는것을 확인했다.
userData는 userData면서 characterData는 character였던것........
해당 관련 부분을 전부 characterData로 수정하고나니 문제가 해결되었다.
Protobuf에서 필드 이름은 자유롭게 설정할 수 있지만, JavaScript 객체와 Protobuf 메시지 정의 간의 일치가 중요!!!!
꼭 기억하자.
'내일배움캠프 > 본캠프' 카테고리의 다른 글
[TIL] 24.11.01 (트래블 슈팅) (1) | 2024.11.01 |
---|---|
[TIL] 24.10.07 트래블슈팅 (0) | 2024.10.07 |
[TIL] 24.10.04 (0) | 2024.10.04 |
[TIL] 24.09.30 (3) | 2024.09.30 |
[TIL] 24.09.26 (0) | 2024.09.26 |