[C++ / DB] ORM
·
Study/C++ & C#
자체적인 ORM을 작성해 보기로 했었다. 이제 필요한 것은 실행 시 XML 파일과 실제 DB를 비교하고 동기화하는 것이다. 1. 클래스 작성 양이 많아서 일부만 옮긴다. A. ConsoleLog 먼저 콘솔에 로그를 더 효율적으로 찍기 위한 클래스를 작성한다. // ConsoleLog.h #pragma once enum class Color { BLACK, WHITE, RED, GREEN, BLUE, YELLOW, }; class ConsoleLog { enum { BUFFER_SIZE = 4096 }; public: ConsoleLog(); ~ConsoleLog(); public: voidWriteStdOut(Color color, const WCHAR* str, ...); voidWriteStdErr(..
[C++ / DB] XML Parser
·
Study/C++ & C#
게임에만 버전이 있는 것이 아니라 DB에도 버전이 있다. 따라서 게임 버전에 DB 버전을 매칭시킬 필요가 있다. 예를 들어서 게임에서 A와 B라는 테이블이 있었는데, 업데이트로 인해 C, D 테이블을 새로 활용하게 됐다. 하지만 DB는 여전히 A와 B, 2개의 테이블만 갖고 있다고 한다면 문제가 생길 수밖에 없을 것이다. 이런 과정을 자동화 할 수 있는 도구를 「Object Relational Mapping (ORM)」이라고 한다. 자체적으로 비교적 단순한 ORM을 만들어 볼 것이다. 엄밀히 말하면 도구라기 보단 방법에 가깝지만 ORM Tool이라고 생각하자. 1. 밑작업 XML과 파일 입출력을 사용할 것이다. 따라서 XML 파서 및 파일 입출력용 함수를 준비할 필요가 있다. XML 파싱을 위해 Rapi..
[C++ / DB] DBBind
·
Study/C++ & C#
저번 시간의 불편함을 어느 정도 해소해 보자. 1. BindParam/Col 요주의 함수. 원래 있던건 private로 돌려서 내부에서 사용하기로 하고, public으로 새로 만들 어떤 자료형이든 받을 수 있게 함수를 쫙 작성하기로 하자. 새로 작성할 함수들은 얘네들이다. public: boolBindParam(int32 paramIndex, bool* value, SQLLEN* index); boolBindParam(int32 paramIndex, float* value, SQLLEN* index); boolBindParam(int32 paramIndex, double* value, SQLLEN* index); boolBindParam(int32 paramIndex, int8* value, SQLLEN..
[C++ / DB] DBConnection
·
Study/C++ & C#
올 것이 왔다는 느낌. 학교에서 서블릿으로 DB를 배울 때가 생각난다. 자바가 싫어서 그렇게 열심히는 안 했던 것 같지만, 이번엔 자바가 아니니까 좀 열심히 해보기로 했다. 1. 클래스 작성 역시 일꾼을 만드는 것부터 시작한다. A. DBConnectionPool 이름에서 느껴지는 이 녀석의 역할. 커넥션을 만들어 뒀다가 두고두고 쓰기 위한 저장용 풀이다. 아래와 같이 만들어 볼 수 있겠다. #pragma once #include "DBConnection.h" // 재사용 하기 위한 풀 class DBConnectionPool { public: DBConnectionPool(); ~DBConnectionPool(); boolConnect(int32 connectionCount, const WCHAR* c..
[C++] JobTimer
·
Study/C++ & C#
이거에 대해 얘기하기 전에 스마트 포인터 사이클 이슈를 해결해 보자. 1. 사이클 문제 아래와 같이 클라이언트가 종료돼도 GameSession의 소멸자가 호출되지 않는 메모리 릭 현상이 발생한다. 지금은 문제라고 부르기도 뭐한 수준이지만, 만약 이런 현상이 계속 라이브에서 발생한다고 생각해 보자. 예상치 못한 메모리 릭으로 인해 서버가 제 기능을 하지 못하게 되는 현상이 생기지 않을까? 사실 우리는 이미 사이클 문제를 인지하고 있었다. #pragma once class Player { public: uint64playerId = 0; stringname; Protocol::PlayerTypetype = Protocol::PLAYER_TYPE_NONE; GameSessionRefownerSession; /..
[C++] JobQueue (3 / 3)
·
Study/C++ & C#
지금까지의 코드에선 하나의 스레드에 일감이 몰리는 상황이 발생할 수 있었다. 목표는 이 일감을 최대한 분배해 한 스레드만 괴롭히는 현상을 해소하는 것이다. 여기선 JobQueue를 보관할 GlobalQueue를 만들어 이를 뿌리는 식으로 만들어 본다. 1. 클래스 작성 기본적인 기능만 수행할 것이기 때문에 복잡한 일은 없다. // GlobalQueue.cpp #pragma once class GlobalQueue { public: GlobalQueue(); ~GlobalQueue(); voidPush(JobQueueRef jobQueue); JobQueueRefPop(); private: LockQueue _jobQueues; }; // GlobalQueue.h #include "pch.h" #inclu..
[C++] JobQueue (2 / 3)
·
Study/C++ & C#
이전 시간에 Functor를 활용해 봤으니, 이번엔 Lambda를 활용해 볼 수도 있을 것이다. 1. Lambda 이전엔 함수에 인자를 넘겨주기 위해 tuple을 사용했는데, 람다식에선 그럴 필요가 없다. 아래의 람다식 예시 코드를 보자. void lmbd(int32 a, int32 b) { cout *memFunc)(args...); }; } void Execute() { _callback(); } private: CallbackType _callback; }; 각 변수 및 함수는 아래와 같은 역할을 한다 CallbackType 콜백 함수를 갖고 있다. 람다식으로 만든 콜백 함수를 갖게 된다. Job(CallbackType&& callback) 콜백 함수를 직접적으로 넘겨받는 생성자이다. Job(sha..
[C++] JobQueue (1 / 3)
·
Study/C++ & C#
멀티 스레드 환경이기 때문에 JobQueue의 중요성이 두드러진다. 이에 대해 알아보자. 1. JobQueue가 왜 필요한데? 스레드끼리의 경합을 예방해 더 효율적인 처리를 가능케 하기 위함이다. 밥집을 갔다고 생각해 보자. 손님들이 주문서를 작성하는 것이 아닌, 바로 주방에 와서 이것저것 주문한다. 주방엔 주방장 단 한 명. 주문이 오는 대로 주방장은 만들기 시작하고, 주방장은 한 명뿐이기 때문에 주방장이 내 주문을 만들게 하기 위한 경합이 생긴다. 먼저 주문하려고 했어도 경합에 실패에 순서가 밀릴 수도 있다. 여러 개의 음식이 갖춰져야 하는 상황이라고 했을 때 경합에 계속 실패한다면 문제가 된다. 손님들은 주방 앞에서 내 주문이 완료될 때까지 기다려야 하니 답답하다. 손님 나름대로 다른 일을 하지 못..
[C++/C#] C# 채팅 클라이언트 간보기
·
Study/C++ & C#
왜 간보기냐면 C#으로 모델을 구현하고 패킷 핸들링을 진행하지 않기 때문. 입력을 받고 출력하기만 하는 창구 역할만 수행한다. 1. 구현 방법 이미 이전에 파이썬을 활용해 패킷 자동화까지 해 놓았다. 아무래도 C#에서까지 같은 작업을 하기보단 있는 걸 끌어오는 게 편할 것 같았다. 그래서 기존의 DummyClient를 DLL로 만들어서 P/Invoke를 활용하기로 했다. 따라서 아래의 기능들이 필요하게 된다. 접속부터 패킷 핸들링 까지 할 메인 스레드 상호 간 데이터를 전달하기 위한 송수신 데이터용 Queue 데이터를 주고받기 위한 C++ 함수들 클라이언트에서 출력과 입력을 받을 각각의 스레드 2. 메인 스레드 거창할 건 없고 그냥 기존 코드의 재활용이다. extern "C" { __declspec(dl..
[C++] IOCP를 활용한 채팅 서버 구현
·
Study/C++ & C#
문제 정의 채팅 서버 구현을 위해 해결해야 할 사항들 목표 유니티 프로젝트에 외부 서버를 사용한 채팅 기능 구현. 목표가 아닌 것 게임 로직을 Server-Driven 하게 전면 재작성. 지금 당장의 목표는 아니지만 할 필요는 있음. 구현을 위한 순서 디자인 결정 패킷 설계 채팅 로직 구현 C++ 더미 채팅 클라이언트로 테스트 C# 더미 채팅 클라이언트로 테스트 유니티 프로젝트에 실장 1. 디자인 결정 서버 세션에 여러 클라이언트가 접속해 있고, 이 세션 안에서 PartySession이라는 부분집합을 구현한다. PartySession에만 Broadcast 되는 정보는 외부의 다른 클라이언트에겐 닿지 않는다. 그러나 PartySession은 서버 세션 전체에 Broadcast 되는 정보는 받을 수 있다. ..