-
[TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-7)TIL-sparta 2024. 7. 1. 22:57
학습 키워드: Node.js, net, TCP, socket, Buffer, Protobuf
1. 완료한 과제 진행 사항
1) 프로젝트 기초 세팅:
- 주특기 플러스 강의에서 작성된 코드를 기반으로 프로젝트의 베이스 코드 작성을 진행함
- Object.freeze(protoMessages) 를 사용하여 protoMessages를 readOnly 상태로 변경
2. 과제 진행 간 문제점
1) Packet parser의 decodePayload 함수에서 namespace와 typeName이 undefined인 문제:
const decodePayload = (handlerId, payload) => { try { const { namespace, typeName } = getProtoTypeNameByHandlerId(handlerId).split("."); const PayloadType = protoMessages[namespace][typeName]; // decode throws error on missing req fields const decoded = PayloadType.decode(payload); // verifyPayloadFields(PayloadType.fields, decoded); return decoded; } catch (err) { if (err instanceof protobuf.util.ProtocolError) { err.code = errorCodes.PACKET_DECODE_ERROR; err.message = `Error decoding packet payload: ${err.message}`; } throw err; } };
Packet parser 기능의 일부인 decodePayload 함수인데, 위에서처럼 TypeError가 출력되는 문제가 있었다. 에러 메세지를 읽어보면 namespace와 typeName이 undefined여서 발생하는 문제여서 처음에는 proto message가 매핑이 안됐나 싶어서 확인했으나, getProtoTypeNameByHandlerId 함수 내에서는 모든 값이 정상적으로 나타났다. 그러다 문득 구조 분해 할당에 문제가 있는건가 싶어서 3번 줄의 중괄호를 대괄호로 교체해봤더니 정상적으로 동작했다.
// const { namespace, typeName } = getProtoTypeNameByHandlerId(handlerId).split("."); const [namespace, typeName] = getProtoTypeNameByHandlerId(handlerId).split(".");
String의 split()은 문자열을 delimeter를 기준으로 나눠서 배열로 만들어 주는 method다. 이전에는 구조 분해 할당에 중괄호를 사용했었는데, 중괄호의 경우 객체에서 동일한 이름의 key를 찾기 때문에 split의 반환값인 배열에는 key가 존재하지 않으므로 undefined가 출력된 것 이었다. 배열의 구조 분해 할당은 대괄호를 사용하여 진행해야 한다.
2) packet parsing이 두 번 되던 문제:
// data.event.js ... switch (packetType) { case headerConstants.packetTypes.PING: console.log(`PING`); break; case headerConstants.packetTypes.NORMAL: const parsedNormal = parsePacket(packet); console.log(`NORMAL | parsed: ${parsedNormal}`, parsedNormal); case headerConstants.packetTypes.LOCATION: const parsedLocation = parsePacket(packet); console.log(`LOCATION | parsed: ${parsedLocation}`, parsedLocation); } ...
단순히 case 끝에 break를 하지 않아서 두 케이스가 모두 실행된 것이었다. 각각의 끝에 break를 추가하여 해결했다.
--
REFERENCES:Chapter 5 게임서버 주특기 플러스 개인과제 | Notion
Intro: “지금까지는 튜토리얼”
teamsparta.notion.site
> 과제 spec
GitHub - donkim1212/sparta-ch5-tcp-game-server: [내일배움캠프] 스파르타) Chapter 5 게임서버 주특기 플러스
[내일배움캠프] 스파르타) Chapter 5 게임서버 주특기 플러스 개인과제. Contribute to donkim1212/sparta-ch5-tcp-game-server development by creating an account on GitHub.
github.com
> 개인 과제 repo
https://nbcamp.gitbook.io/javascript-handbook/part-06./undefined-1
> javascript handbook, "구조 분해 할당"
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-5) (2) 2024.07.03 [TIL] 스파르타) Chapter 5 주특기 플러스 개인 과제 진행 (TCP 게임 서버, D-6) (0) 2024.07.02 [TIL] 프로토콜 버퍼 (protobuf) - 2 (2) 2024.06.30 [TIL] 프로토콜 버퍼 (protobuf) - 1 (0) 2024.06.29 [TIL] 스파르타) Node.js 게임서버 주특기 플러스 3주차 강의 수강 (DB, connection pool, migration) (0) 2024.06.28