이번에도 강의와 함께 과제를 주셨습니다. 이번 과제는 tcp를 이용한 멀티 플레이 게임 서버를 구현해보는 과제입니다.
그리고 이번엔 튜터님께서 일일 퀘스트처럼 진행 사항을 참고하라고 만들어 주셨습니다. 와우!!
1일차 프로젝트 생성 및 이벤트 별 코드 처리
2일차 환경변수 및 상수, 에러 처리
3일차 프로토콜 버퍼 적용 및 패킷 파싱
4일차 유저 세션 및 게임 세션 관리
5일차 접속 및 이동 패킷 교환
6일차 DB 연동
7일차 DB 연동
8일차 레이턴시 매니저, 추측항법 적용 - 서버
9일차 핑 체크 - 클라이언트
10일차 최종 확인 및 테스트
프로젝트 폴더를 하나 만들고 시작해 보았습니다.
먼저 초반 디렉토리 구조입니다.
📦src
┣ 📂config
┃ ┗ 📜config.js
┣ 📂constants
┃ ┣ 📜env.js
┃ ┗ 📜header.js
┣ 📂events
┃ ┣ 📜onConnection.js
┃ ┣ 📜onData.js
┃ ┣ 📜onEnd.js
┃ ┗ 📜onError.js
┣ 📂init
┣ 📂session
┃ ┗ 📜session.js
┣ 📂utils
┗ 📜server.js
설치한 라이브러리(모듈) : prettier, nodemon, dotenv
서버테스트도 해보았습니다.
sever.js
import net from 'net';
import { config } from './config/config.js';
import { onConnection } from './events/onConnection.js';
const server = net.createServer(onConnection);
server.listen(config.server.port, config.server.host, () => {
console.log(`서버가 ${config.server.host}:${config.server.port}에서 실행 중 입니다.`);
console.log(server.address());
});
각각의 이벤트들을 파일로 나누어 관리하게 나누었습니다.
onConnection.js
import { onData } from './onData.js';
import { onEnd } from './onEnd.js';
import { onError } from './onError.js';
export const onConnection = (socket) => {
socket.on('data', onData(socket));
socket.on('data', onEnd(socket));
socket.on('data', onError(socket));
};
onData.js
export const onData = (socket) => (data) => {};
onEnd.js
export const onEnd = (socket) => () => {
console.log('클라이언트와의 연결이 종료되었습니다.');
};
onError.js
export const onError = (socket) => (err) => {};
그리고 환경변수 및 모든 필요한 상수를 관리하는 constants폴더를 만들어 관리하였습니다.
env.js
import dotenv from 'dotenv';
dotenv.config();
export const PORT = process.env.PORT || 3000;
export const HOST = process.env.HOST || 'localhost';
export const CLIENT_VERSION = process.env.CLIENT_VERSION || '1.0.0';
// 게임 DB 정보
export const DB1_NAME = process.env.DB1_NAME || 'database1';
export const DB1_USER = process.env.DB1_USER || 'user1';
export const DB1_PASSWORD = process.env.DB1_PASSWORD || 'password1';
export const DB1_HOST = process.env.DB1_HOST || 'localhost';
export const DB1_PORT = process.env.DB1_PORT || 3306;
// 유저 DB 정보
export const DB2_NAME = process.env.DB2_NAME || 'database2';
export const DB2_USER = process.env.DB2_USER || 'user2';
export const DB2_PASSWORD = process.env.DB2_PASSWORD || 'password2';
export const DB2_HOST = process.env.DB2_HOST || 'localhost';
export const DB2_PORT = process.env.DB2_PORT || 3306;
header.js
export const TOTAL_LENGTH = 4;
export const PACKET_TYPE_LENGTH = 1;
그다음 config.js파일에서 모든 상수를 이용할 수 있게 관리하여 사용합니다.
import { CLIENT_VERSION, HOST, PORT } from '../constants/env.js';
import { PACKET_TYPE_LENGTH, TOTAL_LENGTH } from '../constants/header.js';
// 구성별로 config변수를 이용해 모든 환경변수, 상수들을 관리하여 사용합니다.
export const config = {
server: {
port: PORT,
host: HOST,
},
client: {
version: CLIENT_VERSION,
},
packet: {
totalLength: TOTAL_LENGTH,
typeLength: PACKET_TYPE_LENGTH,
},
};
오늘의 회고
일단 프로젝트를 시작하는 것이 많이 늦었지만 늦은만큼 완성도 있게 개인과제를 완료해 볼려고합니다. 그럼 오늘도 화이팅!