온라인 게임에서 게임 데이터는 보통 Data Base(DB)에 저장해 놓고, 서버와 클라이언트에서 필요한 데이터를 사용합니다.


서버의 경우 DB에서 직접 읽어 들여서 사용하지만 클라이언트는 DB에 접근 할 수 없기 때문에 DB에 있는 데이터를 따로 추출한 것을 읽어 들여야 합니다.


DB에 있는 데이터를 추출할 때 여러 방법이 있지만 가장 간단하고 사용하기 편한 것인 XML 파일로 추출하는 것입니다. 클라이언트는 DB에서 추출된 XML 파일을 읽어서 게임에서 직접 사용하던가 읽은 데이터 중에서 필요한 것만 빼서 이진 파일을 만들어서 사용하면 됩니다.

 

보통 클라이언트는 보안이나 데이터 크기를 작게하고, 빠르게 읽기 위해서 정해진 형식의 이진 파일을 사용하지만 이진 파일은 직접 볼수 없다는 단점이 있어서 XML 파일을 CVS 포맷으로 변환해서 사용하던가 아니면 XML 파일 그 자체로 사용하기도 합니다.


이 글에서는 DB의 Item 테이블에서 추출된 아이템 정보 XML 파일을 TinyXml 라이브러리를 사용하는 DBDataXMLReader 클래스를 만들어서 사용하는 방법을 간단하게 소개합니다.

 

 

TinyXml 이란?

TinyXml은 성능이 좋고, 작으며, 꼭 필요로하는 기능만 있는 라이브러리입니다. 그래서 사용하기가 무척 간단합니다.

 

TinyXml의 홈페이지는 여기( http://www.grinninglizard.com/tinyxml/ )이며 다운로드는 여기서( http://www.sourceforge.net/projects/tinyxml/ ) 받을 수 있습니다.

 

 

TinyXml 사용

가장 간단하게는 TinyXml 라이브러리 파일을 프로젝트에 포함하여 tinyxml.h를 include 하여 사용하면 됩니다. 또는 TinyXml 파일을 DLL 파일로 만들어서 tinyxml.h와 .dll 파일을 프로젝트에 포함한 후 사용합니다.

 

이 글에 포함된 예제 프로젝트는 STL을 사용하는 디버그 버전(/MTD 옵션 사용)의 DLL을 사용하였습니다.

 

 

예제 프로젝트의 구성

1.jpg

총 5개의 파일로 되어있습니다. DBDataXMLReader.h와 DBDataXMLReader.cpp는 DB 데이터 XML 파일을 읽는 클래스입니다. ErrorDefine.h는 에러 결과를 정의하였습니다. 



DB 데이터 XML 파일 구성

2.jpg

DB에 있는 Item 테이블에 저장되어 있는 데이터를 XML 파일로 뽑은 것입니다.

보통 추출 방법이나 DB에 따라서 2행에 있는 <dataroot> 노드가 아닌 다른 이름의 노드가 들어갑니다.3 행부터 레코드 단위로 그룹 지어집니다. 하나의 레코드는 테이블 이름 테그로 시작하며 테이블의 필드 이름을 자식 노드를 가집니다.

위의 경우 <Item> 노드 안에 Item 테이블에 있는 ItemCd, Name, Kind, UseLevel, BuyMoney 필드가 자식 노드로 되어있습니다.



XML 파일을 읽어 보자

DBDataXMLReader 클래스를 사용하여 XML 파일을 로딩하여 데이터를 읽어들입니다.

DBDataXMLReader 클래스의 주 사용 멤버는

   // xml 파일 로딩
   char LoadXML( const char* XmlDocName );

    // 첫 번째 레코드(DB의 테이블 기준) 접근
    char FirstRow(const char* TableName );

    // 다음 레코드 접근
    char NextRow( const char* TableName );

    // int 타입 데이터
    char GetData( const char* FieldName, int& Value );

등 입니다.

 

 

XML 파일을 읽는 순서는 아주 간단합니다.

1 . LoadXML("xml 파일 이름")를 사용하여 XML 파일 로딩

2. FirstRow("테이블 이름")을 사용하여 첫 번째 레코드에 접근합니다.
3. GetData( "필드 이름", 저장할 변수 )를 사용하여 필드에 있는 데이터를 읽습니다.
4. NextRow("테이블 이름")사용하여 다음 레코드로 이동합니다.


XML 파일 저장 형식이 UTF-8로 되어 있으므로 문자열의 경우는 유니코드로 변환해야 합니다.

만약 문자열을 멀티바이트 코드로 읽고 싶다면 XML 파일 저장 형식을 ANSI 형식으로 저장해야 됩니다.


< 예제 코드 >

int main()
{
    char Result = ERR_NONE;
    DBDataXMLReader Reader;

    Result = Reader.LoadXML("Item.xml");
    if( ERR_NONE != Result )
    {
        cout << "Error - " << Result << endl;
    }
   
    Result = Reader.FirstRow("Item");
    if( ERR_NONE != Result )
    {
        cout << "Error - Not Find Row" << Result << endl;
    }

   
    vector<ItemData> Items;

    // 레코드를 순회하면서 아이템 정보를 Items에 저장한다.
    while(true)
    {
        int iTemp = 0;
        ItemData tItem;

        Reader.GetData( "ItemCd", tItem.ItemCd );
        Reader.GetData( "Name", 256, tItem.Name );
        Reader.GetData( "Kind", iTemp );        tItem.Kind = static_cast<char>( iTemp );
        Reader.GetData( "UseLevel", iTemp );    tItem.UseLevel = static_cast<short>( iTemp );
        Reader.GetData( "BuyMoney", tItem.BuyMoney );
       
        Items.push_back( tItem );

        if( ERR_NONE != Reader.NextRow("Item") )
        {
            break;
        }
    }
       
    return 0;
}

</ 예제 코드 >



코드가 간단하니 자세한 부분은 제가 만든 예제 코드를 보시기 바랍니다.

 

VS 2008을 사용하였습니다.XMLToBinaryFile.zip

 

이 글은 스프링노트에서 작성되었습니다.

신고
by 흥배 2009.03.29 17:26
| 1 |

티스토리 툴바