게임 아이템 데이터를 어디서 관리하면 좋을까?(서버? 클라이언트?)

Arthur·2023년 10월 18일
2
post-thumbnail

고민하게 된 계기


프로젝트를 진행하면서 케릭터의 무기와 같은 아이템 종류의 데이터를 Json으로 저장해서 관리하는 것을 구현했었습니다.

{
  "items": [
    {
      "id": 0,
      "name": "날카로운 칼",
      "itemType": 0,
      "price": 700,
      "prefab": "Weapon"
    },
    {
      "id": 1,
      "name": "강철 갑옷",
      "itemType": 1,
      "price": 1000,
      "prefab": "Armor"
    },
    {
      "id": 2,
      "name": "아뮬렛",
      "itemType": 2,
      "price": 600,
      "prefab": "Accessory"
    },
    {
      "id": 3,
      "name": "힐링포션",
      "itemType": 3,
      "price": 300,
      "prefab": "Misc"
    }
  ]
}

위와 같이 Json 형식으로 데이터를 저장해서 ItemManager에서 Json 데이터를 객체로 변환을 했습니다.
(ItemManager 코드 관련 깃허브 링크)

토이 프로젝트 수준이라 아이템 데이터가 적지만 규모가 커지면 덩달아 같이 커질 것 입니다.
그러면 이런 아이템 데이터를 클라이언트에서 할지, 아니면 서버에서 관리할 것인가에 대해 고민해봤습니다.



DB에 저장하면 어떨까?


DB에 저장하면 파일보다는 안정적으로 저장할 수 있을 것 같다고 생각했습니다.
파일은 저장했던 경로를 잃어버리거나 삭제도 쉽다는 것입니다.

그리고 유저가 가지고 있는 아이템 데이터면 당연히 DB에서 관리할 것입니다.
DB에 저장하면 안정성이 파일 보다는 올라가게 됩니다.

만약에 유저가 가지고 있는 아이템 데이터면 DB에 저장 했을 것입니다.
(유료 게임 같은 경우에 아이템 데이터가 중요하기 때문에 DB에 저장하지 않을까 생각했습니다.)

하지만 아이템에 대한 정보이기 때문에 DB에 저장하면 DB와 서버어 부하를 주는게 아닐까 고민하게 되었습니다.



클라이언트에서 관리하면 어떨까?


게임 서버 입장에서는 제일 편한 방식이라고 생각했습니다.
서버에서 아이템 정보 데이터를 클라이언트에게 전송해주는 로직을 구현할 소요가 줄어들기 때문입니다.

하지만 반대로 보면 클라이언트에 위임을 하면, 그만큼 게임 파일 용량도 늘어나게 될 것입니다.

그리고 아이템 데이터 정보라도 민감한 데이터가 분명히 있을 것입니다.
이런 데이터를 클라이언트에서 전부 관리하게 되면 문제가 있을 것이라고 생각했습니다.

악의적인 유저는 데이터를 추출해서 다른 방식으로 사용할 케이스도 고려했습니다.



서버 어플리케이션에 저장하면 어떨까?


서버 어플리케이션에서 아이템 데이터 정보를 Json 형식으로 관리하는 방식입니다.

클라이언트가 아이템 정보가 필요할 때 마다 아이템 정보를 보내주는 것입니다.

이 방식은 게임 아이템 정보가 업데이트 될 때도 서버만 수정하면 되는 것이 또 장점이라고 생각했습니다.

클라이언트에서 관리하면, 아이템 정보 데이터가 업데이트 될 때 새로 업데이트를 받아야 하는 소요가 생기게 됩니다.

하지만 클라이언트에서 아이템 정보가 필요할 때마다 매번 전송 요청을 보내야 합니다.

예를 들어 아이템 인벤토리를 5분 마다 열었다 닫아서 아이템 정보를 읽어 본다고 하면,
매번 아이템 정보를 서버에 요청해 아이템 정보를 불러와야 합니다.
클라이언트에서 캐싱해서 전부 가지고 있어도 되겠지만 이것 또한 부하를 줄 것 같다는 생각을 했습니다.



결론


답이 없는 내용이고 각 게임 팀마다 선호하는 방식이 다를 것입니다.

위 사진은 인프런에서 게임 개발 관련 강의를 진행하신 Rookiss님의 답변입니다.
(해당 이미지의 원본 링크)

저도 서버와 클라이언트 둘 다 같이 관리를 하는 것이 구현하는 입장에서도 편할 것 같다고 생각했습니다.

클라이언트가 가지고 있는 아이템의 리스트는 서버 DB에서 가져오고,
각 아이템에 대한 정보는 데이터시트에서 가져와 UI에 출력하는 것입니다.

서버에서도 클라이언트가 아이템을 상점에 판매할 때, 아이템 정보 데이터시트에서 아이템의 가격 정보를 가져와 유저의 소지금액을 DB에 저장할 수 있습니다.



작성하면서 느낀 점


정답이 없는 내용을 고민하면서 어떤 방식들이 있을까 생각해봤습니다.
다양한 방면에서 해결책이 있고 고려해야할 것들이 많다는 것을 느꼈습니다.

어떤 방식이 맞다고 생각 하는 것이 아닌,
각각의 장 단점을 고려하고 상황에 맞게 적용 해야 한다는 것을 알게 되었습니다.



참고 자료


  • 인프런 질문 - 서버 vs 클라 데이터 정책 => 링크
  • 아이템 목록같은 정보를 왜 DB에서 관리할까요?=> 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글