나만의 작은 도서관

[TIL][C++] 250813 MMO 서버 개발 79일차: 게임 데이터는 엑셀로 관리하자, 또 다른 문제: 엑셀로 정의한 게임 데이터는 코드 레벨에서 어떻게 사용할 수 있는가?, 엑셀 데이터를 JSON으로 바꿀때 유의사항 본문

Today I Learn

[TIL][C++] 250813 MMO 서버 개발 79일차: 게임 데이터는 엑셀로 관리하자, 또 다른 문제: 엑셀로 정의한 게임 데이터는 코드 레벨에서 어떻게 사용할 수 있는가?, 엑셀 데이터를 JSON으로 바꿀때 유의사항

pledge24 2025. 8. 13. 23:49
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

게임 데이터는 엑셀로 관리하자

  • MMO RPG 장르가 되었든 다른 장르가 되었든, 게임을 운영하는 데 있어 아이템, 캐릭터 데이터를 정의한 파일이 필요할 것이다. 예로 들자면 아래와 같은 데이터가 있다.
item_id: 1001, item_name: 초보자의 갑옷, item_price: 1000, ...
item_id: 1002, item_name: 초보자의 글로브, item_price: 1000, ...
  • 이제부터 위 예시와 같은 데이터를 “게임 데이터(Gamedata)”라고 칭하겠다.

 

들어가기 전에: 꼭 게임 데이터를 파일 형식으로 사용해야할까?

  • 잘 생각해 보면 굳이 파일 형식으로 따로 관리하지 않고, 게임 내부에서 각 아이템을 정의한 블루프린트(유니티는 프리팹)에 데이터를 넣어도 될 것 같다. 물론, 그렇게 해도 된다. 다만, 이 방식은 추후에 데이터를 수정해야 하는 경우가 발생했을 때 굉장히 어려울 수 있다. 즉, 유지보수적인 측면에서 좋지 못하다는 것이다.
    • (사실, 조금만 개발해 보면 이 방식이 좋지 못한 방식이라는 것을 금방 알아차릴 수 있다.)

 

어떻게 관리를 해야 할까?

  • 결론만 말하자면 게임 데이터는 엑셀로 관리하는 것이 좋다고 본다. 엑셀은 데이터를 읽는 사람 입장에서 다른 방식들에 비해 1) 가독성이 높고, 2) 직관적이기 때문이다.
  • 엑셀을 사용했을 때 또 다른 장점으로 ‘개발 관련 툴에 대한 지식 및 경험이 없어도 된다’는 것이 있다.

 

엑셀 vs DB

  • 엑셀을 사용하지 않았을 때 게임데이터를 DB에 저장하곤 하는데, DB에 저장하는 방식은 안 되는 건 아니지만 여러모로 맘에 들지 않는 선택이다. 둘 다 사용해 본 입장으로써, DB 방식은 엑셀보다 1) 데이터 수정 작업이 어렵고, 2) 게임 데이터를 불러올 때 DB를 거쳐야 한다는 부담이 있다.(처음 한 번이긴 하지만)

 

또 다른 문제: 엑셀로 정의한 게임 데이터는 코드 레벨에서 어떻게 사용할 수 있는가?

  • 엑셀에 정의한 데이터는 프로그래밍 언어에서 그대로 읽어서 쓸 수 없다. 어떻게든 각 언어에 맞는 자료구조로 변환하는 과정을 거쳐야 한다. 그럼 어떻게 해야 할까?
  • 외부의 정의된 데이터 파일을 읽을 때 사용하는 대표적인 파일 형식들인 JSON, XML, csv 등을 사용하면 된다. 즉, 엑셀 파일(. xlsx)을 JSON, XML, csv 파일로 변환한 다음, 변환된 형식을 언어에서 읽어내면 된다.
    • 당연히 변환된 파일을 프로그래밍 언어가 알아서 파싱 해주진 않기 때문에 그에 맞는 라이브러리를 추가해야 한다.

 

이에 대한 개인적인 의사 결정: JSON 사용

  • 처음에는 csv를 사용하려 했지만, csv는 복잡한 중첩 구조를 표현할 수 없다는 단점이 있었다. 이 단점은 퀘스트 보상이나 특정 맵에 소환되는 몬스터 종류 등을 정의할 때 배열 및 중첩 구조가 필요한 상황에서 치명적인 문제로 다가왔고, 결국 해당 문제가 발생하지 않는 JSON으로 갈아탔다.

 

엑셀 데이터를 JSON으로 바꿀 때 유의사항

  • 굉장히 간단할 것이라 생각했지만 그렇지 않아 따로 정리해 두기로 했다.
  • 참고로, 아래의 과정은 멀티플레이, 즉, 서버가 붙는 게임을 기준으로 작성되었다.

 

1 - 엑셀의 셀에 데이터를 작성할 때는 반드시 JSON 형식에 맞게 작성해야 한다.

  • 엑셀의 셀에 게임 데이터를 작성한 다음 나중에 JSON으로 변환하기 위해서는 JSON 형식이 맞추어 데이터를 입력해야 한다. 따라서, 각 셀에 데이터를 작성할 때는 JSON 파서가 잘못 파싱 하지 않도록 JSON 문법을 따라 데이터를 작성해야 한다.
5000	3	"초급 근거리 미니언"	"melee"	50	10	{"minExp": 5, "maxExp": 10}	{"minGold": 10, "maxGold": 20}	1	1	3	5

 

2 - 각 열에는 클라이언트/서버 전용 태그를 추가해야 한다.

  • 엑셀로 작성된 게임데이터는 클라이언트/서버로 분리되어 관리되지 않고 하나의 테이블로 표현된다. 따라서, 클라이언트는 클라이언트가 들고 있어야 하는 데이터만, 서버는 서버가 들고 있어야하는 데이터만 들고 있어야 하므로, 이를 구분하는 태그를 추가한다.
template_id	level	monster_name	attack_type	max_hp	base_attack	exp_reward
BOTH	BOTH	BOTH	SERVER	SERVER	SERVER	SERVER

 

3 - 엑셀 파일을 파이썬에서 열고 싶다면 openpyxl 패키지를 사용해라

  • 파이썬 패키지인 openpyxl은 엑셀 파일을 열 수 있으며, 엑셀 파일에 존재하는 여러 데이터 시트 및 각 행에 index로 접근할 수 있다. 매우 편리하니 사용해 보는 것을 추천한다.