하아찡

[C++] 서버 DB업로드 본문

C++/이것저것서버테스트

[C++] 서버 DB업로드

하아찡 2025. 3. 20. 16:21

언리얼 버전 5.5.3

서버언어 C++로 구성했습니다.


 

공부를 하면서 왜...? DB서버를 따로 열어야 하나 늘 궁굼했는데

생각보다 DB에 데이터를 올리고 받는 과정에서 서버가 딜레이가 생기더라구요.

그래서 간단하게라도 원래 쓰던 코드에서 DB서버용으로 하나만들어서 사용했습니다.

 

로그인은 아직 그대로 게임서버에서 처리를 하게 두었고 플레이중에 처리되는것들을 앞으론 DB서버에서 처리 할 예정입니다.

 


실행결과

ㅅ위(DB서버) / 아래(게임서버)

 

 

 

마지막 종료위치 저장

 

DB 정상업데이트

 


DB서버 추가하기전 실행결과

DB서버를 사용하지 않았을때 서버 버벅임


 

DB서버와 게임서버가 서로 통신할 Protobuf를 생성해줍니다.

 

DBProtocol.proto

syntax = "proto3";
package Protocol;

import "Enum.proto";
import "Struct.proto";


message C_DB_GAINEXP
{
	uint64 characterid = 1;
	int32 level = 2;
	int32 nowexp = 3;
}

message S_DB_GAINEXP
{
	
}

message C_DB_GAINGOLD
{
	uint64 characterid = 1;
	int32 gold = 2;
	int32 logtype = 3;
}

message S_DB_GAINGOLD
{

}

message C_DB_UPDATEPOS
{
	uint64 characterid = 1;
	ObjectInfo objectinfo = 2;
}

message S_DB_UPDATEPOS
{

}

message C_DB_PING
{
	uint64 timestamp = 1;
}

message S_DB_PING
{
	uint64 timestamp = 1;
}

 

위와같이 작성하여 사용했습니다.

 

예시)

변경전 서버코드

void CharacterDB::UpdatePlayerGold( uint64 characterDBID, int gainGold, int logType)
{
	//골드 얻었을때
	DBConnection* dbConn = GDBConnectionPool->Pop();
	dbConn->Unbind();
	DBBind<3, 0> dbBind(*dbConn, "CALL AddCharacterGoldWithLog(?, ?, ?)");

	int64 DBID = characterDBID;
	int GainGold = gainGold;
	int LogType = logType;
	dbBind.BindParam(0, DBID);
	dbBind.BindParam(1, GainGold);
	dbBind.BindParam(2, LogType);

	ASSERT_CRASH(dbBind.Execute());
	GDBConnectionPool->Push(dbConn);
}

 

 

변경 후

void CharacterDB::UpdatePlayerGold( uint64 characterDBID, int gainGold, int logType)
{
	//골드 얻었을때
	Protocol::C_DB_GAINGOLD pkt;
	pkt.set_characterid(characterDBID);
	pkt.set_gold(gainGold);
	pkt.set_logtype(logType);
	SendBufferRef sendBuffer = DBServerPacketHandler::MakeSendBuffer(pkt);
	GDBManager.Broadcast(sendBuffer);
}

 

GDBManager를 통해서 DB서버에게 패킷을 전송합니다.

게임서버와 DB서버 끼리 1:1 연결이라 기존코드에있던 Broadcast를 사용해서 데이터를 전달해줬습니다.

 

 

반응형