2개의 프로모션 동시 실행시 중복처리 방어로직 문제

안녕하세요.

한 게임에서 프로모션을 2개 이상 진행 시키려고 하는데요.

중복 지급을 막으려고 처리하다보니 이상한 점이 있어서 문의드립니다.

프로모션을 1개만 진행시킨다면 userkey를 키 값으로 쓰고

grantPromotionRewardForGame() 리턴 Success 받았을 때 받았다고 처리하면 되는데

2개 이상 진행시키면 내가 어떤 프로모션을 완료 했는지 알 수가 없습니다.

한 프로모션에서 바뀌지 않는 값을 리턴해주셔야 이게 될거 같습니다.

이걸 처리 하려면 request로 보낼 때 저장을 따로 해놓고 응답 받았을 때 따로 처리를 해야 되는데

그냥 grantPromotionRewardForGame() 반환값에 내가 보낸 프로모션 코드를 그대로 넘겨주시면

이걸로 키값을 사용해 중복을 막기가 쉬울 것 같습니다.

클라에서 보내기 전에 저장하고 받은 다음에 그 값을 쓰는것 보다 서버에서 제대로 받은 값으로만 처리하는게 안전해보입니다.

안녕하세요 :slight_smile:
말씀주신 내용 빠르게 검토해볼 수 있도록 하겠습니다 !

1개의 좋아요

안녕하세요 :slight_smile:
기다려주셔서 감사해요 :man_bowing:
요청시 포함하여 전달해주고 계신 promotionCode를 userkey와 함께 검증하여 중복 지급을 방지하는 방향으로 처리해주실 수 있을까요 ?
프로모션 코드를 그대로 넘겨드리는건 문제가 없으나, 현 구조에서 해당 값을 그대로 전달해야하만 하는 명확한 필요성을 아직 찾지 못한 상황이라 혹시 내부적으로 고려 중이신 배경이나 제약 사항이 있다면 함께 공유해주실 수 있을까요 ?

두 개의 프로모션 A,B 가 있다고 한다면

토스에서 처리된 프로모션이 어떤건지 확인 할 수 있는 방법이 없어서 그렇습니다.

프로모션A를 보냈고 토스에서 제대로 처리해주고 A를 리턴해줬는지 실수로 B를 리턴해줬는지 클라는 검증하기가 어렵습니다.

A를 보냈으니 당연히 결과를 A 보내줬다고 그냥 믿는 수 밖에 없다는거죠.

더 큰 문제는 두번째 인데

string pendingPromotionCode;

requestPromotion(code, account)
{
pendingPromotionCode = code;
}

receivePromotion()
{
Save[pendingPromotionCode , true]
}

프로모션 A,B 둘 다 동시에 만족
requestPromotion(A)
requestPromotion(B)
동시 호출

이런식으로 코드를 짜면 두 개 이상의 프로모션을 보내면 위험 할 수도 있기 때문입니다.

만약 동시에 조건이 만족되어서

프로모션 A,B를 한번에 보냈다고 치면

네트워크 지연 이슈등으로

receivePromotion 이 함수가 늦게 들어온다면 문제가 될겁니다.

pendingPromotionCode 이 값이 클라에서는 이미 프로모션B로 바뀌어있을 수도 있으니까요.

그럼 receivePromotion()을 받았을 때 프로모션 B만 받았다고 저장이 될겁니다.

그리고 애초에
receivePromotion(code)
{
Save[code, true]
}
이렇게 코드를 포함해서 응답을 주시면

받은 상태 그대로 저장하기에도 편합니다.

클라이언트에서 따로 글로벌 변수로 저장 할 필요도 없고요.

고유한 값이기 때문에 userkey로 저장 할 필요도 없습니다.

앗 제가 정확하게 이해를 못한 것일 수 있습니다 ..!

// A 프로모션 지급 로직
if (지급내역.find((record) => record.userKey === userKey && record.promotionCode === 'GAME_EVENT_A') {
  // 지급내역이 있으므로 중복지급하지 않음
  return;
}
const result1 = await grantPromotionRewardForGame({
  params: {
    promotionCode: 'GAME_EVENT_A',
    amount: 1000,
  },
});
if (result1 === 성공) {
  지급내역.insert([
    userKey,
    promotionCode: 'GAME_EVENT_A',
    amount: 1000
  ]);
}

요렇게 하면 들어오는 순서와 상관없지 않나요 ..?!

react 에서는 저렇게 보내고 받고 간단히 처리 할 수 있겠군요.

유니티에서는 jslib으로 인앱토스와 api 주고 받는처리 할 때

보내는 쪽 따로 받는 쪽 따로 처리해서 제 코드에서 문제가 되었나봅니다.

그냥 유니티에서 보낼 때 await Request() 로 해서 위에 예제로 보여주신 로직과 비슷하게 처리하면 될 것 같습니다.

1개의 좋아요

저는 순차적으로 보내고 있긴합니다.