우편 아이템 질문

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 :
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

우편 쪽 확인중인데 우편 발송시 테이블이름과 Row를 보내면서 null 처리를 한다고 하셧는데 만약 Player_Inventory 라는 테이블에 Row 하나를 슬롯이라 가정해서
Class Item
{
int itemID;
int itemCount;
}
이런식으로 저장하거나 Row 자체를 ItemID로 하고 값을 Count로 쓰는 방식일때 특정 갯수를 지정해서 못보내고 해당 Row에 잇는 값 전부를 보내야 하나요??

안녕하세요 개발자님.

질문의 내용을 잘 이해하지 못하여 예시를 통해 설명 진행하겠습니다.

콘솔에서 차트의 아이템1을 선택하고 개수를 999개로 보내면 아래와 같이 보내지게 됩니다.

{
    "postList": [
        {
            "content": "아이템이 1개인 우편입니다",
            "expirationDate": "2021-12-21T10:33:27.711Z",
            "reservationDate": "2021-12-20T10:33:27.711Z",
            "nickname": "나는야유저1",
            "inDate": "2021-12-20T10:33:27.711Z",
            "title": "아이템 1개만 보냅니다",
            "author": "GM런처",
            "sentDate": "2021-12-20T10:33:27.711Z",
            "items": [ // 아이템 정보
                {
                    "item": {
                        "chartFileName": "아이템 차트 파일.xlsx",
                        "itemID": "i101",
                        "itemName": "아이템1",
                        "hpPower": "1"
                    },
                    "itemCount": 999,
                    "chartName": "Chart"
                }
            ]
        }
    ]
}

해당 경우에는 다음과 같이 컬럼별로 아이템 아이디를 만들어 저장할 수 있습니다.
(예외처리가 들어가지 않은 기본 코드입니다.)

var bro = Backend.UPost.GetPostList(PostType.Admin);
JsonData item = bro.GetReturnValuetoJSON()["postList"][0]["items"][0];
string itemId = item["item"]["itemID"];
int count = Int32.Parse(item["itemCount"]); // 혹은 기존 가지고 있는 카운트에 더하기

Param param = new Param();
param.Add(itemId, count);

Backend.GameData.Update("Player_Inventory", new Where(), param);

하지만 생성 가능한 컬럼의 최대 갯수는 290 미만으로 이후 확장성을 위해서는 어려울 수 있습니다.

따라서 컬럼명으로 작성하는 것 보다는 dictionary를 이용하여 한번에 저장하는 것을 추천드립니다.

Dictionary<string, int> items = new Dictionary<string, int>();

var bro = Backend.UPost.GetPostList(PostType.Admin);
JsonData item = bro.GetReturnValuetoJSON()["postList"][0]["items"][0];
string itemId = item["item"]["itemID"];
int count =  Int32.Parse(item["itemCount"]); // 혹은 기존 가지고 있는 카운트에 더하기

items[itemId] = items[itemId] + count; // items안에 아이템들이 이미 추가된 상태라는 가정하에

Param param = new Param();
param.Add("items", items);

Backend.GameData.Update("Player_Inventory", new Where(), param);

추측되는 바로는 1번과 같이 itemId별로 하나의 컬럼을 만들어 사용하는 방법에 대해 질문하신 것으로 추측되오며, 코드를 통해 질문에 대한 내용이 맞는지 확인해주시면 감사하겠습니다.

답변 감사드립니다

  1. Player_Inventory테이블에 컬럼(Inventory) 하나에 모든 인벤정보를 Dictionary로 형태로 저장해두라는 뜻인가요?
  2. Dictionary 형태로 저장할 경우 데이터가 업데이트 될때마다 쓰는 읽기쓰기량이 커지지 않나요?
  3. PostItem 자료형을 만들때 테이블명과 컬럼값을 넣는데 우편을 발송하게 되면 해당 테이블의 컬럼값이 null로 바뀌는것으로 알고 있습니다. 위와 같이 Dictionary로 저장하게 되면 컬럼값에 인벤토리 전체 Dictionary 데이터가 들어가는데 이부분을 어떻게 해야되나요?

유저 우편에 대해서 질문해주셨군요. 해당 기능에 대해서는 아래와 같은 로직을 추천드립니다.

우편 보내기/받기 전용 테이블을 만들기

  1. 보낼 때 원하는 개수만큼 차감하여 업데이트(트랜잭션 추천)
  2. 차감된 값으로 우편 전용 테이블에 생성(트랜잭션 추천)
  3. 보내고 해당 row 삭제
  4. 받는 유저는 우편을 받고 자신의 값 수정

다음은 질문에 대해 답변드리겠습니다.

  1. 네 맞습니다. 게임 로직의 경우, 많은 개발자분들이 아이템을 Dictionary에 저장하기 때문에 우편 또한 해당 Dictionary를 이용하는 방식입니다.

  2. 네 읽기량은 커질 수 있으며 해당 부분에 대해서는 설명이 부족한 점 죄송했습니다. 다만 컬럼수가 200개이상이 넘어갈 경우에는 아예 로직을 수정해야할 위험이 있으니 참고해주시면 감사하겠습니다. 컬럼이 280가 넘지 않을 경우에는 dic보다는 아이템당 컬럼을 지정하여 하는 것을 추천드립니다.

  3. 앞서 말씀드린 로직을 적용하면 수를 완전히 보내는 것이 아닌 차감하여 보낼 수 있습니다.

좋아요 1