Documentation index for AI agents

GS2-Grade 트랜잭션 액션

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

액션의 조합과 동시 실행

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

GS2-Grade의 트랜잭션 액션은 ApplyRankCapByUserId를 제외하고, 네임스페이스·사용자·그레이드 모델·프로퍼티의 조합으로 결정되는 하나의 그레이드 스테이터스를 대상으로 합니다. 스테이터스는 업데이트할 때마다 전체가 다시 쓰입니다.

조작같은 행을 겹쳤을 때중첩 너머다른 대상이 되는 경계
그레이드의 가산
AddGradeByUserId
통합되어 값이 합산된다실패한다네임스페이스·사용자·그레이드 모델·프로퍼티
그레이드의 감산
SubGradeByUserId
통합되어 값이 합산된다실패한다네임스페이스·사용자·그레이드 모델·프로퍼티
랭크 상한의 적용
ApplyRankCapByUserId
통합된다GS2-Experience 쪽의 취급을 따른다기록 대상인 GS2-Experience의 스테이터스
다른 액션으로의 전개
MultiplyAcquireActionsByUserId
통합되어 안쪽 액션이 하나의 리스트로 묶인다자신은 아무것도 업데이트하지 않는다
검증 액션 전반먼저 지정한 쪽이 남음읽기만 하므로 충돌하지 않는다대상·검증 타입·필요 그레이드

가산과 감산은 행이 다르고 경계가 같습니다. 같은 스테이터스에 대한 가산과 감산을 하나의 트랜잭션에 넣을 수는 없습니다.

ApplyRankCapByUserId는 그레이드 스테이터스를 업데이트하지 않습니다. 현재의 그레이드를 읽고 대응하는 GS2-Experience 스테이터스의 랭크 상한을 설정합니다. 같은 트랜잭션에 그 스테이터스를 대상으로 하는 GS2-Experience 액션이 포함되어 있으면 충돌하여 트랜잭션이 실패하므로, 그쪽에서 무엇을 함께 둘 수 있는지는 GS2-Experience의 기술을 확인해 주십시오.

MultiplyAcquireActionsByUserId는 그레이드를 읽고, 전달받은 액션에 배율을 곱하여 자신의 트랜잭션으로 발행합니다. 자신은 아무것도 업데이트하지 않지만, 전개 후의 액션이 속한 서비스의 제한이 그대로 해당되며, 아래의 「중첩된 트랜잭션에 주의」도 해당됩니다.

검증 액션은 트랜잭션 시작 시점의 스테이터스를 봅니다. 같은 트랜잭션에서 도달하는 그레이드를 검증할 수는 없습니다.

중첩된 트랜잭션에 주의

그레이드 스테이터스는 전체가 다시 쓰이므로, 나란히 작성하면 1건으로 통합되었을 같은 그레이드의 가산끼리라도, 한쪽이 안쪽에서 도착하는 경우에는 트랜잭션이 실패합니다. 보상이나 추첨의 내용까지 포함하여, 하나의 트랜잭션 안에서 같은 스테이터스를 업데이트하는 곳이 한 군데만 되도록 설계해 주십시오.

제한을 회피하고 싶은 경우

그레이드의 가산은 획득 액션, 감산은 소비 액션입니다. 가산끼리의 충돌은 acquireActionUseJobQueue를 활성화하면 해소되지만, 가산과 감산의 공존은 enableAtomicCommit을 비활성화하지 않으면 해소되지 않습니다.

동시 실행과 재시도

그레이드 스테이터스는 전체가 다시 쓰이므로, 가산끼리라도 GS2-Experience의 경험치처럼 「일정 범위라면 충돌하지 않는다」와 같은 완화는 없습니다. 같은 스테이터스를 여러 요청이 동시에 업데이트하면 나중에 확정된 쪽이 충돌(409)이 됩니다. 요청 내용에 문제가 있는 것은 아니므로, 재시도하면 성공합니다. 랭크 상한의 적용은 대응하는 GS2-Experience 스테이터스에 대한 동시 업데이트와도 충돌할 수 있습니다.


Verify Action

검증 액션

Gs2Grade:VerifyGradeByUserId

사용자 ID를 지정하여 그레이드 검증

지정된 사용자의 그레이드 값이 지정된 조건을 만족하는지 검증합니다(서버 사이드 작업).
6가지 비교 연산자를 지원합니다: less(미만), lessEqual(이하), greater(초과), greaterEqual(이상), equal(일치), notEqual(불일치).
조건이 충족되지 않은 경우, 기대값과 실제 값을 포함한 설명적인 오류 메시지가 반환됩니다.
multiplyValueSpecifyingQuantity가 true인 경우, 검증 임계값은 지정된 수량으로 곱해집니다.

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

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
gradeNamestring
~ 128자그레이드 모델 이름
이 스테이터스가 속한 그레이드 모델의 이름입니다. 그레이드 엔트리의 매핑, 연동된 경험치 모델, 보상 가산 테이블을 포함하는 그레이드 모델 정의를 참조합니다.
verifyType문자열 열거형
enum {
  “less”,
  “lessEqual”,
  “greater”,
  “greaterEqual”,
  “equal”,
  “notEqual”
}
검증 종류
정의설명
less그레이드가 지정한 값 미만일 것
lessEqual그레이드가 지정한 값 이하일 것
greater그레이드가 지정한 값을 초과할 것
greaterEqual그레이드가 지정한 값 이상일 것
equal그레이드가 지정한 값과 일치할 것
notEqual그레이드가 지정한 값과 일치하지 않을 것
propertyIdstring
~ 1024자프로퍼티 ID
이 그레이드 스테이터스의 개발자 정의 식별자로, 사용자와 그레이드 모델 내에서 고유합니다. 그레이드 값과 랭크 캡의 올바른 동기화를 보장하기 위해, 연동되는 GS2-Experience 스테이터스의 프로퍼티 ID와 동일한 값을 사용하는 것을 강력히 권장합니다.
gradeValuelong11 ~ 9223372036854775805현재 그레이드
이 스테이터스의 현재 그레이드 값입니다. 연동되는 GS2-Experience 모델의 랭크 캡을 결정하기 위해 그레이드 모델의 그레이드 엔트리 배열의 인덱스로 사용됩니다. 이 값이 변경되면 관련된 경험치 스테이터스의 랭크 캡이 해당 그레이드 엔트리에서 정의된 값으로 자동 갱신됩니다.
multiplyValueSpecifyingQuantityboolfalse수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Grade:VerifyGradeByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "gradeName": "[string]그레이드 모델 이름",
        "verifyType": "[string]검증 종류",
        "propertyId": "[string]프로퍼티 ID",
        "gradeValue": "[long]현재 그레이드",
        "multiplyValueSpecifyingQuantity": "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Grade:VerifyGradeByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  gradeName: "[string]그레이드 모델 이름"
  verifyType: "[string]검증 종류"
  propertyId: "[string]프로퍼티 ID"
  gradeValue: "[long]현재 그레이드"
  multiplyValueSpecifyingQuantity: "[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("grade").verify.verify_grade_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    gradeName="[string]그레이드 모델 이름",
    verifyType="[string]검증 종류",
    propertyId="[string]프로퍼티 ID",
    gradeValue="[long]현재 그레이드",
    multiplyValueSpecifyingQuantity="[bool]수량을 지정했을 때, 검증에 사용하는 값도 곱할지 여부",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Gs2Grade:VerifyGradeUpMaterialByUserId

사용자 ID를 지정하여 그레이드업에 사용하는 소재 검증

지정된 사용자의 지정된 프로퍼티의 그레이드업에 소재의 프로퍼티 ID가 유효한지 검증합니다(서버 사이드 작업).
검증은 그레이드 엔트리의 PropertyIdRegex와 GradeUpPropertyIdRegex로부터 정규표현식 패턴을 생성하고, 소재의 프로퍼티 ID가 이에 일치하는지 확인합니다.
2가지 검증 유형을 지원합니다: ‘match’(소재가 패턴에 일치해야 함)와 ’notMatch’(소재가 패턴에 일치하지 않아야 함).

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

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
gradeNamestring
~ 128자그레이드 모델 이름
이 스테이터스가 속한 그레이드 모델의 이름입니다. 그레이드 엔트리의 매핑, 연동된 경험치 모델, 보상 가산 테이블을 포함하는 그레이드 모델 정의를 참조합니다.
verifyType문자열 열거형
enum {
  “match”,
  “notMatch”
}
검증 종류
정의설명
match조건과 일치할 것
notMatch조건과 일치하지 않을 것
propertyIdstring
~ 1024자프로퍼티 ID
이 그레이드 스테이터스의 개발자 정의 식별자로, 사용자와 그레이드 모델 내에서 고유합니다. 그레이드 값과 랭크 캡의 올바른 동기화를 보장하기 위해, 연동되는 GS2-Experience 스테이터스의 프로퍼티 ID와 동일한 값을 사용하는 것을 강력히 권장합니다.
materialPropertyIdstring
~ 1024자프로퍼티 ID
이 그레이드 스테이터스의 개발자 정의 식별자로, 사용자와 그레이드 모델 내에서 고유합니다. 그레이드 값과 랭크 캡의 올바른 동기화를 보장하기 위해, 연동되는 GS2-Experience 스테이터스의 프로퍼티 ID와 동일한 값을 사용하는 것을 강력히 권장합니다.
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Grade:VerifyGradeUpMaterialByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "gradeName": "[string]그레이드 모델 이름",
        "verifyType": "[string]검증 종류",
        "propertyId": "[string]프로퍼티 ID",
        "materialPropertyId": "[string]프로퍼티 ID",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Grade:VerifyGradeUpMaterialByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  gradeName: "[string]그레이드 모델 이름"
  verifyType: "[string]검증 종류"
  propertyId: "[string]프로퍼티 ID"
  materialPropertyId: "[string]프로퍼티 ID"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("grade").verify.verify_grade_up_material_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    gradeName="[string]그레이드 모델 이름",
    verifyType="[string]검증 종류",
    propertyId="[string]프로퍼티 ID",
    materialPropertyId="[string]프로퍼티 ID",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Consume Action

소비 액션

Gs2Grade:SubGradeByUserId

사용자 ID를 지정하여 그레이드 감산

지정된 그레이드 모델과 프로퍼티에 대해, 지정된 사용자의 현재 그레이드에서 지정된 값을 감산합니다(서버 사이드 작업).
그레이드 값 갱신 후, 연결된 GS2-Experience 스테이터스에 랭크 캡이 자동으로 적용됩니다.
랭크 캡 값은 새로운 그레이드 레벨에 일치하는 그레이드 엔트리에 의해 결정됩니다.
갱신된 그레이드 스테이터스와 함께 Experience 네임스페이스명과 갱신된 Experience 스테이터스를 반환합니다.

수량 지정 가능한 액션: 예

반전 가능한 액션: 예

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
gradeNamestring
~ 128자그레이드 모델 이름
이 스테이터스가 속한 그레이드 모델의 이름입니다. 그레이드 엔트리의 매핑, 연동된 경험치 모델, 보상 가산 테이블을 포함하는 그레이드 모델 정의를 참조합니다.
propertyIdstring
~ 1024자프로퍼티 ID
이 그레이드 스테이터스의 개발자 정의 식별자로, 사용자와 그레이드 모델 내에서 고유합니다. 그레이드 값과 랭크 캡의 올바른 동기화를 보장하기 위해, 연동되는 GS2-Experience 스테이터스의 프로퍼티 ID와 동일한 값을 사용하는 것을 강력히 권장합니다.
gradeValuelong00 ~ 9223372036854775805잃는 그레이드
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Grade:SubGradeByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "gradeName": "[string]그레이드 모델 이름",
        "propertyId": "[string]프로퍼티 ID",
        "gradeValue": "[long]잃는 그레이드",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Grade:SubGradeByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  gradeName: "[string]그레이드 모델 이름"
  propertyId: "[string]프로퍼티 ID"
  gradeValue: "[long]잃는 그레이드"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("grade").consume.sub_grade_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    gradeName="[string]그레이드 모델 이름",
    propertyId="[string]프로퍼티 ID",
    gradeValue="[long]잃는 그레이드",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Acquire Action

입수 액션

Gs2Grade:AddGradeByUserId

사용자 ID를 지정하여 그레이드 가산

지정된 그레이드 모델과 프로퍼티에 대해, 사용자의 현재 그레이드에 지정된 값을 가산합니다.
그레이드 값 갱신 후, 연결된 GS2-Experience 스테이터스에 랭크 캡이 자동으로 적용됩니다.
랭크 캡 값은 새로운 그레이드 레벨에 일치하는 그레이드 엔트리에 의해 결정됩니다.
갱신된 그레이드 스테이터스와 함께 Experience 네임스페이스명과 갱신된 Experience 스테이터스를 반환합니다.

수량 지정 가능한 액션: 예

반전 가능한 액션: 예

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
gradeNamestring
~ 128자그레이드 모델 이름
이 스테이터스가 속한 그레이드 모델의 이름입니다. 그레이드 엔트리의 매핑, 연동된 경험치 모델, 보상 가산 테이블을 포함하는 그레이드 모델 정의를 참조합니다.
propertyIdstring
~ 1024자프로퍼티 ID
이 그레이드 스테이터스의 개발자 정의 식별자로, 사용자와 그레이드 모델 내에서 고유합니다. 그레이드 값과 랭크 캡의 올바른 동기화를 보장하기 위해, 연동되는 GS2-Experience 스테이터스의 프로퍼티 ID와 동일한 값을 사용하는 것을 강력히 권장합니다.
gradeValuelong00 ~ 9223372036854775805획득 그레이드
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Grade:AddGradeByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "gradeName": "[string]그레이드 모델 이름",
        "propertyId": "[string]프로퍼티 ID",
        "gradeValue": "[long]획득 그레이드",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Grade:AddGradeByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  gradeName: "[string]그레이드 모델 이름"
  propertyId: "[string]프로퍼티 ID"
  gradeValue: "[long]획득 그레이드"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("grade").acquire.add_grade_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    gradeName="[string]그레이드 모델 이름",
    propertyId="[string]프로퍼티 ID",
    gradeValue="[long]획득 그레이드",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Gs2Grade:ApplyRankCapByUserId

사용자 ID를 지정하여 GS2-Experience 스테이터스에 랭크 캡 적용

지정된 사용자의 현재 그레이드에 대응하는 랭크 캡을, 연결된 GS2-Experience 스테이터스에 적용합니다(서버 사이드 작업).
현재 그레이드 값에 일치하는 그레이드 엔트리를 참조하여 랭크 캡 값을 결정합니다.
그레이드가 외부에서 변경되어 Experience의 랭크 캡을 동기화해야 할 경우에 유용합니다.
갱신된 그레이드 스테이터스와 함께 Experience 네임스페이스명과 갱신된 Experience 스테이터스를 반환합니다.

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

반전 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
gradeNamestring
~ 128자그레이드 모델 이름
이 스테이터스가 속한 그레이드 모델의 이름입니다. 그레이드 엔트리의 매핑, 연동된 경험치 모델, 보상 가산 테이블을 포함하는 그레이드 모델 정의를 참조합니다.
propertyIdstring
~ 1024자프로퍼티 ID
이 그레이드 스테이터스의 개발자 정의 식별자로, 사용자와 그레이드 모델 내에서 고유합니다. 그레이드 값과 랭크 캡의 올바른 동기화를 보장하기 위해, 연동되는 GS2-Experience 스테이터스의 프로퍼티 ID와 동일한 값을 사용하는 것을 강력히 권장합니다.
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Grade:ApplyRankCapByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "gradeName": "[string]그레이드 모델 이름",
        "propertyId": "[string]프로퍼티 ID",
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Grade:ApplyRankCapByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  gradeName: "[string]그레이드 모델 이름"
  propertyId: "[string]프로퍼티 ID"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("grade").acquire.apply_rank_cap_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    gradeName="[string]그레이드 모델 이름",
    propertyId="[string]프로퍼티 ID",
    timeOffsetToken="[string]타임 오프셋 토큰",
})

Gs2Grade:MultiplyAcquireActionsByUserId

그레이드에 기반한 레이트로 입수 액션을 곱셈

지정된 입수 액션의 수량을 사용자의 현재 그레이드에 기반한 레이트 승수로 곱합니다.
레이트 승수는 지정된 rateName과 현재 그레이드 값을 사용하여 그레이드 모델의 acquireActionRates에서 조회됩니다.
곱해진 입수 액션은 트랜잭션으로 실행되며, 그레이드에 기반한 보상 스케일링(예: 그레이드가 높을수록 더 많은 리소스를 획득)을 실현합니다.

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

반전 가능한 액션: 아니오

타입활성화 조건필수기본값값 제한설명
namespaceNamestring
~ 128자네임스페이스 이름
네임스페이스 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다.
userIdstring
~ 128자사용자ID
#{userId}로 설정하면 로그인 중인 사용자ID로 치환됩니다.
gradeNamestring
~ 128자그레이드 모델 이름
이 스테이터스가 속한 그레이드 모델의 이름입니다. 그레이드 엔트리의 매핑, 연동된 경험치 모델, 보상 가산 테이블을 포함하는 그레이드 모델 정의를 참조합니다.
propertyIdstring
~ 1024자프로퍼티 ID
이 그레이드 스테이터스의 개발자 정의 식별자로, 사용자와 그레이드 모델 내에서 고유합니다. 그레이드 값과 랭크 캡의 올바른 동기화를 보장하기 위해, 연동되는 GS2-Experience 스테이터스의 프로퍼티 ID와 동일한 값을 사용하는 것을 강력히 권장합니다.
rateNamestring
~ 128자보상 가산 테이블 이름
그레이드 모델 내에서 이 배율 테이블을 고유하게 식별하는 이름입니다. 트랜잭션의 특정 입수 액션에 그레이드 기반 보상 스케일링을 적용할 때 참조됩니다.
acquireActionsList<AcquireAction>[]0 ~ 100 items입수 액션 목록
timeOffsetTokenstring~ 1024자타임 오프셋 토큰
{
    "action": "Gs2Grade:MultiplyAcquireActionsByUserId",
    "request": {
        "namespaceName": "[string]네임스페이스 이름",
        "userId": "[string]사용자ID",
        "gradeName": "[string]그레이드 모델 이름",
        "propertyId": "[string]프로퍼티 ID",
        "rateName": "[string]보상 가산 테이블 이름",
        "acquireActions": [
            {
                "action": "[string]입수 액션에서 실행할 액션의 종류",
                "request": "[string]액션 실행 시 사용되는 요청의 JSON 문자열"
            }
        ],
        "timeOffsetToken": "[string]타임 오프셋 토큰"
    }
}
action: Gs2Grade:MultiplyAcquireActionsByUserId
request:
  namespaceName: "[string]네임스페이스 이름"
  userId: "[string]사용자ID"
  gradeName: "[string]그레이드 모델 이름"
  propertyId: "[string]프로퍼티 ID"
  rateName: "[string]보상 가산 테이블 이름"
  acquireActions: 
    - action: "[string]입수 액션에서 실행할 액션의 종류"
      request: "[string]액션 실행 시 사용되는 요청의 JSON 문자열"
  timeOffsetToken: "[string]타임 오프셋 토큰"
transaction.service("grade").acquire.multiply_acquire_actions_by_user_id({
    namespaceName="[string]네임스페이스 이름",
    userId="[string]사용자ID",
    gradeName="[string]그레이드 모델 이름",
    propertyId="[string]프로퍼티 ID",
    rateName="[string]보상 가산 테이블 이름",
    acquireActions={
        {
            action="[string]입수 액션에서 실행할 액션의 종류",
            request="[string]액션 실행 시 사용되는 요청의 JSON 문자열"
        }
    },
    timeOffsetToken="[string]타임 오프셋 토큰",
})