Documentation index for AI agents

GS2-SerialKey 트랜잭션 액션

검증/소비/입수 각 트랜잭션 액션의 사양

액션의 조합과 동시 실행

모든 서비스에 공통되는 전제는 트랜잭션 액션의 조합에 정리되어 있습니다. 먼저 그쪽을 읽어 주십시오. 이 절의 나머지는 GS2-SerialKey 고유의 내용입니다.

GS2-SerialKey의 트랜잭션 액션은 네임스페이스와 시리얼 코드의 조합으로 결정되는 하나의 시리얼 키를 대상으로 합니다. 시리얼 키는 사용 완료 여부와 누가 사용했는지를 기록하는 것으로, 업데이트할 때마다 전체가 다시 쓰입니다.

조작같은 행을 겹쳤을 때중첩 너머다른 대상이 되는 경계
키의 사용
UseByUserId
발행 시에 오류실패한다네임스페이스·코드
사용의 취소
RevertUseByUserId
발행 시에 오류실패한다네임스페이스·코드
키의 발행
IssueOnce
각각이 새로운 키를 발행한다. 충돌하지 않는다충돌하지 않는다발행할 때마다 다른 대상
코드의 검증
VerifyCodeByUserId
먼저 지정한 쪽이 남음읽기만 하므로 충돌하지 않는다검증 타입·사용자·코드·캠페인

사용과 취소는 행이 다르고 경계가 같습니다. 하나의 키를 같은 트랜잭션에서 사용하고 취소할 수는 없습니다. 키가 다르면 다른 대상이므로, 여러 키를 사용하는 것은 문제없습니다. 같은 키에 대한 취소를 하나의 트랜잭션에 2건 놓은 경우에도 사용과 마찬가지로 발행 시에 오류가 됩니다. 하나의 트랜잭션에 2건 나열할 용도가 없는 데다, 1건째에서 미사용으로 되돌아간 이상 2건째는 반드시 실패하기 때문입니다.

시리얼 키는 한 번만 사용할 수 있습니다. 그것이 시리얼 키의 존재 이유입니다. 같은 키의 두 번째 사용은 같은 트랜잭션에서든 이후의 트랜잭션에서든 실패합니다. 같은 키의 사용을 하나의 트랜잭션에 2건 놓은 경우에는 발행 시에 오류가 됩니다. 2건째를 1건째에 합성할 수는 없으므로, 하나의 트랜잭션에 1건만 놓아 주십시오. 경계에 사용자는 포함되지 않습니다. 시리얼 키는 누가 사용했는지를 기록하지만, 도달하는 곳은 네임스페이스와 코드만으로 결정되는 한 행이므로, 같은 코드의 사용을 서로 다른 사용자에 대해 2건 나열하더라도 하나의 대상으로 취급되어 마찬가지로 오류가 됩니다. 시리얼 키를 사용하는 진열 상품을 수량 2 이상으로 구입한 경우에도 액션이 개수만큼 쌓이므로 여기에 해당합니다. 같은 코드를 요구하는 여러 스킬 트리 노드를 한꺼번에 해방한 경우도 마찬가지입니다.

키를 발행하고 같은 트랜잭션에서 사용할 수는 없습니다. 사용은 트랜잭션 시작 시점의 상태에서 움직이므로, 그 시점에는 키가 아직 존재하지 않기 때문입니다. 검증 액션도 같은 시작 시점의 상태를 보므로, 같은 트랜잭션에서 사용한 코드도 미사용으로 읽힙니다.

키의 사용은 그 캠페인이 주는 것을 배분합니다. 그것은 자신의 트랜잭션으로 발행되므로, 주는 것이 속한 서비스의 제한이 그대로 해당되며 아래의 내용도 해당됩니다. 하나의 트랜잭션에서 여러 시리얼 키를 사용하는 것 자체는 GS2-SerialKey 쪽에서는 문제없지만, 그것들이 주는 것은 모두 같은 트랜잭션에 모입니다. 두 캠페인이 같은 아이템이나 같은 통화를 배분하는 경우에는 그 서비스의 페이지를 확인해 주십시오.

중첩된 트랜잭션에 주의

같은 시리얼 키가 안쪽에서 사용되고 바깥쪽에서 취소되면 트랜잭션이 실패합니다.

제한을 회피하고 싶은 경우

키의 사용은 소비 액션, 사용의 취소와 발행은 획득 액션입니다. acquireActionUseJobQueue로 분리할 수 있는 것은 부여끼리뿐이며, 사용 자체로부터는 분리되지 않습니다. enableAtomicCommit을 비활성화하면 충돌은 해소되지만, 이 판단은 신중하게 해 주십시오. 사용 완료가 된 시리얼 키는 그 후에 부여가 실패해도 다시 사용할 수 없습니다.

같은 키의 사용끼리도, 취소끼리도 우회 수단은 없습니다. 검사는 어느 설정보다도 먼저 실행되며, 시리얼 코드는 한 번만 사용할 수 있는 것이므로, 활성화해도 달라지지 않습니다. 검사는 네임스페이스와 코드만 보므로, 몇 번이든 사용할 수 있는 캠페인 코드라도 같은 코드를 2건 나열하면 마찬가지로 오류가 됩니다. 트랜잭션을 나누고, 시리얼 키를 사용하는 진열 상품은 1개씩 구입하며, 같은 코드를 요구하는 스킬 트리 노드는 따로따로 해방해 주십시오.

동시 실행과 재시도

시리얼 키의 사용은 이미 사용되지 않았음을 확인합니다. 그 때문에 같은 코드를 동시에 사용하려고 하면 나중에 확정된 쪽이 실패합니다. 이것이 하나의 코드를 이중으로 사용하지 못하게 하는 구조이며, 사용 완료가 된 이상 재시도해도 달라지지 않습니다.

시리얼 키가 다르면 다른 대상이므로, 다른 코드를 동시에 사용해도 GS2-SerialKey 자체 안에서는 충돌하지 않습니다.


Verify Action

검증 액션

Gs2SerialKey:VerifyCodeByUserId

사용자 ID를 지정하여 시리얼 코드의 유효성 확인

지정된 사용자의 시리얼 코드를 소비하지 않고 검증합니다. 특정 캠페인 모델 이름에 대한 검증을 지원하며, 코드가 active(미사용)인지 inactive(사용 완료)인지 확인할 수 있습니다.

수량 지정 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
codestring
~ 48자시리얼 코드
“XXXXX-XXXX-XXXXX-XXXX-XXXX” 형식의 시리얼 코드 문자열입니다. 각 코드는 고유하며 캠페인 식별 정보를 포함합니다. 코드의 형식과 데이터 길이는 고정되어 있어 변경할 수 없습니다.
campaignModelNamestring~ 128자캠페인 이름
이 시리얼 코드가 속한 캠페인 모델의 이름입니다. 캠페인 정보는 시리얼 코드 자체에 포함되어 있으므로 코드를 사용할 때는 네임스페이스만 지정하면 됩니다.
verifyType문자열 열거형
enum {
  “active”,
  “inactive”
}
검증 타입
정의설명
active유효
inactive비활성
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2SerialKey:VerifyCodeByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "code": "[string]시리얼 코드",
        "campaignModelName": "[string]캠페인 이름",
        "verifyType": "[string]검증 타입",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2SerialKey:VerifyCodeByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  code: "[string]시리얼 코드"
  campaignModelName: "[string]캠페인 이름"
  verifyType: "[string]검증 타입"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("serialKey").verify.verify_code_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    code="[string]시리얼 코드",
    campaignModelName="[string]캠페인 이름",
    verifyType="[string]검증 타입",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Consume Action

소비 액션

Gs2SerialKey:UseByUserId

사용자 ID를 지정하여 시리얼 코드 사용 처리

지정된 사용자에 의해 시리얼 코드를 사용 완료로 표시합니다. 코드가 존재하고 아직 사용되지 않았음을 검증합니다.

수량 지정 가능한 액션: 아니오

반전 가능한 액션: 예

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
codestring
~ 48자시리얼 코드
“XXXXX-XXXX-XXXXX-XXXX-XXXX” 형식의 시리얼 코드 문자열입니다. 각 코드는 고유하며 캠페인 식별 정보를 포함합니다. 코드의 형식과 데이터 길이는 고정되어 있어 변경할 수 없습니다.
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2SerialKey:UseByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "code": "[string]시리얼 코드",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2SerialKey:UseByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  code: "[string]시리얼 코드"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("serialKey").consume.use_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    code="[string]시리얼 코드",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Acquire Action

입수 액션

Gs2SerialKey:RevertUseByUserId

사용자 ID를 지정하여 시리얼 코드 미사용 처리

사용 완료된 시리얼 코드를 미사용 상태로 되돌립니다. 되돌리기 전에 코드가 현재 사용 완료 상태임을 검증합니다.

수량 지정 가능한 액션: 아니오

반전 가능한 액션: 예

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
codestring
~ 48자시리얼 코드
“XXXXX-XXXX-XXXXX-XXXX-XXXX” 형식의 시리얼 코드 문자열입니다. 각 코드는 고유하며 캠페인 식별 정보를 포함합니다. 코드의 형식과 데이터 길이는 고정되어 있어 변경할 수 없습니다.
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2SerialKey:RevertUseByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "code": "[string]시리얼 코드",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2SerialKey:RevertUseByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  code: "[string]시리얼 코드"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("serialKey").acquire.revert_use_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    code="[string]시리얼 코드",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Gs2SerialKey:IssueOnce

시리얼 코드 1건 발행

시리얼 코드를 1건 즉시 발행합니다. 코드는 AES 암호화와 base32 인코딩을 사용하여 XXXXX-XXXX-XXXXX-XXXX-XXXXX 형식으로 생성됩니다. 배치 발행 작업과 달리 동기적으로 코드를 생성하여 반환합니다.

수량 지정 가능한 액션: 아니오

반전 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
campaignModelNamestring
~ 128자캠페인 모델 이름
metadatastring~ 2048자메타데이터
메타데이터에는 임의의 값을 설정할 수 있습니다.
이 값들은 GS2의 동작에는 영향을 주지 않으므로, 게임 내에서 사용하는 정보를 저장하는 용도로 사용할 수 있습니다.
{
    "action": "Gs2SerialKey:IssueOnce",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "campaignModelName": "[string]캠페인 모델 이름",
        "metadata": "[string]메타데이터"
    }
}
action: Gs2SerialKey:IssueOnce
request:
  namespaceName: "[string]네임스페이스 이름"
  campaignModelName: "[string]캠페인 모델 이름"
  metadata: "[string]메타데이터"
transaction.service("serialKey").acquire.issue_once({
    namespaceName="[string]네임스페이스 이름",
    campaignModelName="[string]캠페인 모델 이름",
    metadata="[string]메타데이터",
})