TCP
는 신뢰성이 높은 반면 속도가 느리고, UDP
는 속도가 빠른 반면 신뢰성이 낮은 게 주요 특징임dgram
HTTP 요청을 효율적으로 구현한 방식에 대해 설명하겠다.
위와 같이 HTTP에서 지원하는 Content-Type: application/json
을 이용해 JSON임을 명시하고, 실질적인 데이터는 JSON.Parse
및 JSON.Stringify
로 파싱 및 전달해주면 된다.
잘못된 요청의 경우 HTTP/1.1 400 Bad Request
로 응답해줬다.
일관된 데이터 처리를 위해 다음과 같이 구성해줬다.
{
"cmd" : 커맨드(checkin, mission 등),
"ops" : 파라미터 매열(campId, message 등),
}
생산성
도 떨어지고 TypeScript 등으로 리팩토링 시 타입 정의
가 까다로워진다.{
"cmd" : 커맨드(checkin, mission 등),
"success" : 불리언(true/false),
"message" : 콘솔 출력용 응답 메세지,
}
success
여부를 true/false로 확인할 수 있게 하였고,message
는 string으로 서버에서 정리해서 보내서 추가적인 처리가 필요없게 했다. 이렇게 하면 클라이언트 및 서버 연동을 위해 머리를 싸맬 필요 없이 서버만 잘 구성해주면 된다.// 처음 연결 시
const sessionInfo = [];
...
this.lastSessionId++;
const camper = new Camper(this.lastSessionId, socket);
sessionInfo.push({ // 처음 연결시 IP와 sessionId 매핑해놓고
remoteAddress: socket.remoteAddress,
sessionId: sessionId,
userStatus: camper,
});
// 재연결 시 일치하는 IP가 있으면
const found = sessionInfo.filter((info) => info.remoteAddress === socket.remoteAddress);
if (found) {
// userSatatus 재활용
const camper = found.userStatus;
}
QUIC (Quick UDP Internet Connection) 개념
QUIC
이라고 해서 TCP 대신 **UDP
기반의 프로토콜**을 널리 사용중이라고 한다. {
"compilerOptions": {
/* Language and Environment */
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
/* Modules */
"module": "commonjs", /* Specify what module code is generated. */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
/* Type Checking */
"strict": false, /* Enable all strict type-checking options. */
"skipLibCheck": true, /* Skip type checking all .d.ts files. */
"types": [
"node"
]
}
}
npm i -D typescript @types/node ts-node
# "@types/node": "^20.4.6",
# "ts-node": "^10.9.1",
# "typescript": "^5.1.6"