TIL

2024년 10월 23일 TIL

kagan-draca 2024. 10. 24. 11:51

정말 매일매일 TIL 적는게 이렇게 어려운 일인지 세삼 깨닫는다.

 

원래는 항상 강의를 들으면서 코드도 작성하고, 블로그에 정리?를 하면서 강의를 진행했지만

 

이번에는 강의를 들으면서 코드만 작성하고 다시 강의를 한 번 더 들으면서 내용을 블로그에 정리해볼 계획이다.

(그럴 경우 강의를 2번 듣는 형식으로 좀 더 이해할 수 있지 않을까? 하는 기대효과 때문 입니다.)

 

어제 강의를 들으면서

위와 같은 오류가 발생했었다.

 

아직까지 오류 코드를 해석하고, 수정하는 능력이 떨어져 처음에는 사진에서와 같이

 

code : "ER_PARSE_ERROR" 라는 문구를 보고 packetParser.js라는 파일의 내용이 문제가 있는건가 해서 튜터님의 코드와 내가 작성한 코드를 계속 비교했다.

 

packetParser.js

import { getProtoMessages } from '../../init/loadProtos.js';
import { getProtoTypeNameByHandlerId } from '../../handlers/index.js';
import { config } from '../../config/config.js';
import CustomError from '../error/customError.js';
import { ErrorCodes } from '../error/errorCodes.js';

export const packetParser = (data) => {
  const protoMessages = getProtoMessages();

  // 공통 패킷 구조를 디코딩
  const Packet = protoMessages.common.Packet;
  let packet;
  try {
    packet = Packet.decode(data);
  } catch (error) {
    throw new CustomError(ErrorCodes.PACKET_DECODE_ERROR, '패킷 디코딩 중 오류가 발생했습니다.');
  }

  const handlerId = packet.handlerId;
  const userId = packet.userId;
  const clientVersion = packet.clientVersion;
  const sequence = packet.sequence;

  // clientVersion 검증
  if (clientVersion !== config.client.version) {
    throw new CustomError(
      ErrorCodes.CLIENT_VERSION_MISMATCH,
      '클라이언트 버전이 일치하지 않습니다.',
    );
  }

  // 핸들러 ID에 따라 적절한 payload 구조를 디코딩
  const protoTypeName = getProtoTypeNameByHandlerId(handlerId);
  if (!protoTypeName) {
    throw new CustomError(ErrorCodes.UNKNOWN_HANDLER_ID, `알 수 없는 핸들러 ID: ${handlerId}`);
  }

  const [namespace, typeName] = protoTypeName.split('.');
  const PayloadType = protoMessages[namespace][typeName];
  let payload;
  try {
    payload = PayloadType.decode(packet.payload);
  } catch (error) {
    throw new CustomError(ErrorCodes.PACKET_STRUCTURE_MISMATCH, '패킷 구조가 일치하지 않습니다.');
  }

  // 필드 검증 추가 = 중복이므로 코드 주석
  // const errorMessage = PayloadType.verify(payload);
  // if (errorMessage) {
  //   throw new CustomError(
  //     ErrorCodes.PACKET_STRUCTURE_MISMATCH,
  //     `패킷 구조가 일치하지 않습니다: ${errorMessage}`,
  //   );
  // }

  // 필드가 비어 있거나, 필수 필드가 누락된 경우 처리
  const expectedFields = Object.keys(PayloadType.fields);
  const actualFields = Object.keys(payload);
  const missingFields = expectedFields.filter((field) => !actualFields.includes(field));
  if (missingFields.length > 0) {
    throw new CustomError(
      ErrorCodes.MISSING_FIELDS,
      `필수 필드가 누락되었습니다: ${missingFields.join(', ')}`,
    );
  }

  return { handlerId, userId, payload, sequence };
};

하지만, 위의 코드는 클라이언트가 서버에 접속 후, 이벤트 호출에 따른 packet 수신 부분이라 DB와 관련된 부분이 아니었다.

 

그래서 Error 문구에 따라, onData.js, inital.handler.js, user.db.js, database.js의 코드를 튜터님의 코드와 비교해보았지만, 이상이 없었다...

 

그렇게 시간을 낭비하고 있었다. 그러다

에서 

 

check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALEUS'를 보고

 

user.querier.js에 있는

 

INSERT INTO user (id, device_id) VALUES 의

 

VALUES가 현재 "VALEUS"로 오타가 발생해 오류가 났다는 사실을 알게 됐다...

 

비록 위의 오류는 시간을 많이 소모해서 겨우겨우 발견해  어찌저찌 해결할 수 있었지만,

좀더 오류 코드를 분석해서 빠르게 고쳐야 할 필요성을 느낀다.