2024/11 14

C# .csv파일 변환 방법과 예시

글의 목적  .csv 파일을 읽어서 데이터를 클래스나 다른 형태로 활용하는 방법은 다양한 언어와 라이브러리에서 가능합니다. 여기서는 C#에서 .csv 파일을 읽고 데이터를 클래스에 매핑하는 예제를 소개하겠습니다. 1. .csv 파일 분석ItemCode,Name,ItemType,Prefab# This file contains item data for the game# ItemType :# 0 = Material# 1 = Equipment# 2 = Junk1000,Wood,0,Wood1001,SolidWood,0,SolidWood1010,Iron,0,Iron1011,Steel,0,Steel1100,Garbage,2,Garbage각 줄의 역할:1번째 줄 (헤더):ItemCode, Name, ItemType, ..

TIL 2024.11.26

Class와 Structure의 차이점 및 사용 목적

1. 공통점Class와 Structure는 둘 다 데이터를 저장하고, 데이터를 처리하는 로직을 포함할 수 있는 프로그래밍 언어의 데이터 구조입니다.둘 다 멤버 변수(필드), 메서드, 생성자 등을 가질 수 있습니다.객체 지향 프로그래밍(OOP)에서 객체를 정의하기 위해 사용됩니다.2. 차이점타입classstructure기본 설계 목적참조형(Reference Type)값형(Value Type)메모리 할당 방식힙(Heap)스택(Stack) (일반적으로)상속상속 가능상속 불가기본 값 전달 방식참조 전달값 복사 전달기본 생성자 지원기본 생성자가 있음명시적으로 생성자 작성 필요디폴트 값null (참조 없음)초기화되지 않은 상태에서는 사용 불가GC의 영향가비지 컬렉터가 메모리 관리자동으로 스택에서 제거됨 3. 주요 ..

TIL 2024.11.26

자원 전쟁 프로젝트 ProtoBuf 구분 기준

우리가 서버에서 사용할 message를 모아둔 .proto 메시지를 SessionServer, GameServer, 그리고 공용으로 나누기 위해서는 각 서버의 역할과 메시지의 사용 목적에 따라 구분해야 합니다. 아래는 메시지를 나누는 기준과 구체적인 분류입니다.구분 기준SessionServer:사용자 인증, 토큰 관리, 대기실 매칭 등 사용자 관리와 세션 관련 로직을 처리.로그인, 회원가입, 토큰 갱신 등의 메시지가 여기에 해당.GameServer:게임 플레이와 관련된 실시간 데이터 동기화와 게임 상태 관리를 처리.플레이어 동기화, 게임 상태, 유닛 상태, 액션 관련 메시지가 여기에 해당.대기실에 관한것 부터 이제 GameServer에 해당.공용:SessionServer와 GameServer 모두에서 사..

TIL 2024.11.15

Tower Defense Online Project 트러블 슈팅 - 5

게임 종료 후 인터벌 매니저가 남아 발생하는 오류게임이 끝나도 인터벌 매니저를 종료하지 않아서 그랬다.따라서 clearAll을 추가함. endGameHandler.jsconst user = gameSession.getUser(socket.uuid);const intervalManager = user.getIntervalManager();intervalManager.clearAll(); // 인터벌 메니저 클리어 그래도 동일하게 오류가 발생했다. 나가는 사람은 두 사람인데 한 사람이 일방적으로 세션을 먼저 종료하고 나갔기 때문에마지막에 문닫는 사람이 게임 세션을 종료시켜야함.const user = gameSession.getUser(socket.uuid);const intervalManager = user..

TIL 2024.11.12

Tower Defense Online Project 트러블 슈팅 - 4

한판 한 뒤 끝내면 서버 에러socket.id = 게임 세션 ID (애당초 socket.id에 무언갈 담으려한 우리의 잘못 나중에 코드 보고 놀란 우리 모두들)게임 세션 id를 가지고 있는 경우에 onEnd 이벤트가 발생하면 상태동기화를 해제하고 게임세션을 제거하려고함. -> 이 기능이 오류남.게임을 한판 한 경우 게임 세션 ID가 남아 있어 상태동기화 해제 및 게임세션 제거 동작을 하기 때문에 오류가 발생. endGame.handler.js에서 게임이 끝났을 때 소켓에 저장된 세션ID를 없애려고했음. socket.id = null; // 세션ID 초기화 endGame.handler.js에서 게임이 끝났을 때 소켓에 저장된 세션ID를 없애려고했음, 하지만 클라이언트에게 특별히 응답을 주는 내용이 없기 때..

TIL 2024.11.12

Tower Defense Online Project 트러블 슈팅 - 3

상대 게임 탈주시 상태동기화 인터벌이 날뛰는 문제user 클래스 안에서 intervalManager가 상태동기화를 일정 주기로 관리해주고 있음.현재 onEnd 이벤트에서 누군가 한명이 꺼지면 게임세션을 날려버림.그래서 남은 사람 intervalManager가 혼자 갈길을 잃은 것. 수정 전 onEnd 이벤트 한 명만 나가도 게임세션이 삭제됨.export const onEnd = (socket) => async () => { await removeUser(socket); // 매칭 돌려 유저 세션에 등록된 경우 유저 세션에서 제거 if (socket.id && ) { removeGameSession(socket.id); } else { } console.log('클라이언트 연결이 종료되었습니..

TIL 2024.11.12

Tower Defense Online Project 트러블 슈팅 - 2

MySQL, Redis가 연결이 안된 경우 계속 시도하는 문제레디스의 경우 연결이 실패한 경우 계속해서 연결 시도를 반복함.이 과정에서 무의미하게 로그가 계속해서 쌓임.DB연결에 실패한 경우 서버가 종료되도록 수정함. 해결 코드import dbPool from '../../db/database.js';import { config } from '../../config/config.js';export const testConnection = async () => { try { const [rows] = await dbPool.query('SELECT 1 + 1 AS solution'); console.log(`${config.database.database} 테스트 쿼리 결과:`, rows[0]..

TIL 2024.11.12

Tower Defense Online Project 트러블 슈팅 - 1

이상한 페이로드 출력  id를 꺼낸 경우C2SRegisterRequest { id: '\n\x04asdf\x12\x04asdf\x1A\x04asdf' } 제대로 파싱을 하지 못하는 에러가 발생함. test codeconsole.log("패킷 타입 : "+packetType) console.log("페이로드 길이 : "+payloadLength) switch (packetType) { case PACKET_TYPE.REGISTER_REQUEST: { const protoMessages = getProtoMessages(); const Register = protoMessages.common.C2SRegisterRequest; ..

TIL 2024.11.12

스파르타 최종 프로젝트 3조 회의 - 1

클라팀 : 권용수, 김현진, 문주원서버팀 : 박용현, 이정수, 문민철 회의 내용저번 회의 마지막내용: 장르 정함 ( 액션 어드벤처 로그라이크 전략 RPG)클라팀에서 했던 최종 프로젝트 용수님이 만든걸 토대로 진행하려고 했음. 이정수 : 어떻게 어떻게 재미없다라기 보다는 결론은 이 최종클라 프로젝트를 베이스로 하는건 너무 별로다.서버에서는 서버에서 여러 연산이 필요한 게임을 찾자. 김현진: 클라팀끼리 회의를했는데 베이스를 가지고 하는것일 뿐 게임 기반으로 삼지못하는 이유, 에셋이 팀 프로젝트에서 용수님이 하나도 소유하지 않고 있음, 용수님 팀 프로젝트 했을때 게임을 그대로 사용하려면 용수님의 팀의 동의가 필요하다.  박용현: 도의적인 이야기이기 때문에 굳이 허락을 맡아야하나? 이정수: 기획에 관한 저작권도..

회고록 2024.11.11

TowerDefenseOnline 프로젝트: 인메모리에서 Redis의 데이터 저장 전환

레디스 용도TowerDefenseOnline 프로젝트에서 Redis는 게임 데이터를 효율적이고 안정적으로 관리하기 위해 사용특히, 빠른 데이터 접근 속도와 지속성 있는 DB 역할을 수행인메모리 데이터 관리 방식에서 발생할 수 있는 데이터 유실 문제를 해결하기 위한 솔루션우리 프로젝트의 특징인 TCP통신이기 때문에 실시간 게임 플레이 중에도 데이터 일관성을 유지하면서 높은 성능을 제공레디스가 쓰이는 곳기능로그인매칭상태 동기화타워 구매몬스터 생성타워 공격몬스터 공격넥서스 HP업데이트몬스터 처치게임 오버게임 종료로그인 ( redisClient.hmset(`user:${user.userId}`, userData); )클라이언트에서 request로 payloadData가 들어오면 const { id, passwo..

기타 2024.11.11