> For the complete documentation index, see [llms.txt](/llms.txt)

# GS2-Mission Deploy/CDK 레퍼런스

GS2-Deploy의 스택을 생성할 때 사용하는 템플릿 포맷과, CDK를 이용한 각종 언어의 템플릿 출력 구현 예제




## 엔티티

Deploy 처리에서 조작 대상이 되는 리소스

### Namespace

네임스페이스<br>

네임스페이스는 하나의 프로젝트 내에서 동일한 서비스를 서로 다른 용도로 여러 개 이용하기 위한 엔티티입니다.<br>
GS2의 각 서비스는 네임스페이스 단위로 관리됩니다. 네임스페이스가 다르면 동일한 서비스라도 완전히 독립된 데이터 공간으로 취급됩니다.<br>

따라서 각 서비스의 이용을 시작하려면 먼저 네임스페이스를 생성해야 합니다.

#### Request

리소스 생성・갱신 요청

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| name | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| description | string |  | |  |  ~ 1024자 | 설명문 |
| transactionSetting | [TransactionSetting](#transactionsetting) |  | ✓|  |  | 트랜잭션 설정<br>미션 달성 보상 부여 시 사용되는 분산 트랜잭션 설정입니다. |
| missionCompleteScript | [ScriptSetting](#scriptsetting) |  | |  |  | 미션을 달성했을 때 실행할 스크립트 설정<br>Script 트리거 레퍼런스 - [`missionComplete`](../script/#missioncomplete) |
| counterIncrementScript | [ScriptSetting](#scriptsetting) |  | |  |  | 카운터가 상승했을 때 실행할 스크립트 설정<br>Script 트리거 레퍼런스 - [`counterIncrement`](../script/#counterincrement) |
| receiveRewardsScript | [ScriptSetting](#scriptsetting) |  | |  |  | 보상을 받았을 때 실행할 스크립트 설정<br>Script 트리거 레퍼런스 - [`receiveRewards`](../script/#receiverewards) |
| completeNotification | [NotificationSetting](#notificationsetting) |  | ✓|  |  | 미션 태스크를 달성했을 때의 푸시 통지<br>미션 태스크의 달성 조건이 충족되었을 때 GS2-Gateway를 통해 전달되는 푸시 통지 설정입니다. 게임 클라이언트가 달성 상황을 즉시 UI에 반영할 수 있도록 합니다. |
| logSetting | [LogSetting](#logsetting) |  | |  |  | 로그 출력 설정<br>이 네임스페이스에 대한 API 요청·응답 로그의 출력 대상이 되는 GS2-Log의 네임스페이스를 지정합니다. 카운터 증가, 미션 달성, 보상 수령의 디버깅에 도움이 됩니다. |

#### GetAttr

[!GetAttr](/articles/tech/deploy/#getattr) 태그로 취득 가능한 리소스 생성 결과

| | 타입 | 설명 |
| --- | --- | --- |
| Item | [Namespace](../sdk#namespace) | 작성한 네임스페이스

#### 구현 예제




**GS2-Deploy(YAML)**
```yaml

Type: GS2::Mission::Namespace
Properties:
  Name: namespace-0001
  Description: null
  TransactionSetting: 
    EnableAutoRun: true
    QueueNamespaceId: grn:gs2:ap-northeast-1:YourOwnerId:queue:queue-0001
  MissionCompleteScript: null
  CounterIncrementScript: null
  ReceiveRewardsScript: null
  CompleteNotification: null
  LogSetting: 
    LoggingNamespaceId: grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001

```

**Go**
```go

import (
    "github.com/gs2io/gs2-golang-cdk/core"
    "github.com/gs2io/gs2-golang-cdk/mission"
    "github.com/openlyinc/pointy"
)


SampleStack := core.NewStack()
mission.NewNamespace(
    &SampleStack,
    "namespace-0001",
    mission.NamespaceOptions{
        TransactionSetting: core.NewTransactionSetting(
            core.TransactionSettingOptions{
                QueueNamespaceId: pointy.String("grn:gs2:ap-northeast-1:YourOwnerId:queue:queue-0001"),
            },
        ),
        LogSetting: &core.LogSetting{
            LoggingNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001",
        },
    },
)

println(SampleStack.Yaml())  // Generate Template

```

**PHP**
```php

class SampleStack extends \Gs2Cdk\Core\Model\Stack
{
    function __construct() {
        parent::__construct();
        new \Gs2Cdk\Mission\Model\Namespace_(
            stack: $this,
            name: "namespace-0001",
            options: new \Gs2Cdk\Mission\Model\Options\NamespaceOptions(
                transactionSetting: new \Gs2Cdk\Core\Model\TransactionSetting(
                    new \Gs2Cdk\Core\Model\TransactionSettingOptions(
                        queueNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:queue:queue-0001"
                    )
                ),
                logSetting: new \Gs2Cdk\Core\Model\LogSetting(
                    loggingNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                )
            )
        );
    }
}

print((new SampleStack())->yaml());  // Generate Template

```

**Java**
```java

class SampleStack extends io.gs2.cdk.core.model.Stack
{
    public SampleStack() {
        super();
        new io.gs2.cdk.mission.model.Namespace(
                this,
                "namespace-0001",
                new io.gs2.cdk.mission.model.options.NamespaceOptions()
                        .withTransactionSetting(new io.gs2.cdk.core.model.TransactionSetting(
                            new io.gs2.cdk.core.model.options.TransactionSettingOptions()
                                .withQueueNamespaceId("grn:gs2:ap-northeast-1:YourOwnerId:queue:queue-0001")
                        ))
                        .withLogSetting(new io.gs2.cdk.core.model.LogSetting(
                            "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                        ))
        );
    }
}

System.out.println(new SampleStack().yaml());  // Generate Template

```

**C#**
```csharp

public class SampleStack : Gs2Cdk.Core.Model.Stack
{
    public SampleStack() {
        new Gs2Cdk.Gs2Mission.Model.Namespace(
            stack: this,
            name: "namespace-0001",
            options: new Gs2Cdk.Gs2Mission.Model.Options.NamespaceOptions
            {
                transactionSetting = new Gs2Cdk.Core.Model.TransactionSetting(
                    options: new Gs2Cdk.Core.Model.TransactionSettingOptions
                    {
                        queueNamespaceId = "grn:gs2:ap-northeast-1:YourOwnerId:queue:queue-0001"
                    }
                ),
                logSetting = new Gs2Cdk.Core.Model.LogSetting(
                    loggingNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                )
            }
        );
    }
}

Debug.Log(new SampleStack().Yaml());  // Generate Template

```

**TypeScript**
```typescript

import core from "@/gs2cdk/core";
import mission from "@/gs2cdk/mission";

class SampleStack extends core.Stack
{
    public constructor() {
        super();
        new mission.model.Namespace(
            this,
            "namespace-0001",
            {
                transactionSetting: new core.TransactionSetting(
                    {
                        queueNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:queue:queue-0001"
                    }
                ),
                logSetting: new core.LogSetting(
                    "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                )
            }
        );
    }
}

console.log(new SampleStack().yaml());  // Generate Template

```

**Python**
```python

from gs2_cdk import Stack, core, mission

class SampleStack(Stack):

    def __init__(self):
        super().__init__()
        mission.Namespace(
            stack=self,
            name='namespace-0001',
            options=mission.NamespaceOptions(
                transaction_setting=core.TransactionSetting(
                    options=core.TransactionSettingOptions(
                        queue_namespace_id='grn:gs2:ap-northeast-1:YourOwnerId:queue:queue-0001',
                    )
                ),
                log_setting=core.LogSetting(
                    logging_namespace_id='grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001',
                ),
            ),
        )

print(SampleStack().yaml())  # Generate Template

```


#### TransactionSetting

트랜잭션 설정<br>

트랜잭션 설정은 트랜잭션의 실행 방법·정합성·비동기 처리·충돌 회피 메커니즘을 제어하는 설정입니다.<br>
자동 실행(AutoRun), 원자적 실행(AtomicCommit), GS2-Distributor를 이용한 비동기 실행, 스크립트 결과의 일괄 적용, GS2-JobQueue를 통한 입수 액션의 비동기화 등을 조합하여 게임 로직에 맞는 견고한 트랜잭션 관리를 가능하게 합니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| enableAutoRun | bool |  |  | false |  | 발행한 트랜잭션을 서버 사이드에서 자동으로 실행할지 여부 |
| enableAtomicCommit | bool | {enableAutoRun} == true |  | false |  | 트랜잭션의 실행을 원자적으로 커밋할지 여부<br>※ enableAutoRun이(가) true 이면 활성화 |
| transactionUseDistributor | bool | {enableAtomicCommit} == true |  | false |  | 트랜잭션을 비동기 처리로 실행할지 여부<br>※ enableAtomicCommit이(가) true 이면 활성화 |
| commitScriptResultInUseDistributor | bool | {transactionUseDistributor} == true |  | false |  | 스크립트의 결과 커밋 처리를 비동기 처리로 실행할지 여부<br>※ transactionUseDistributor이(가) true 이면 활성화 |
| acquireActionUseJobQueue | bool | {enableAtomicCommit} == true |  | false |  | 입수 액션을 실행할 때 GS2-JobQueue를 사용할지 여부<br>※ enableAtomicCommit이(가) true 이면 활성화 |
| distributorNamespaceId | string |  |  | "grn:gs2:{region}:{ownerId}:distributor:default" |  ~ 1024자 | 트랜잭션 실행에 사용하는 GS2-Distributor 네임스페이스GRN |
| queueNamespaceId | string |  |  | "grn:gs2:{region}:{ownerId}:queue:default" |  ~ 1024자 | 트랜잭션 실행에 사용하는 GS2-JobQueue의 네임스페이스GRN |

#### ScriptSetting

스크립트 설정<br>

GS2에서는 마이크로서비스의 이벤트에 연결하여 커스텀 스크립트를 실행할 수 있습니다.<br>
이 모델은 스크립트 실행을 트리거하기 위한 설정을 보유합니다.<br>

스크립트 실행 방식은 크게 두 가지로, 바로 "동기 실행"과 "비동기 실행"입니다.<br>
동기 실행은 스크립트 실행이 완료될 때까지 처리가 블록됩니다.<br>
대신 스크립트 실행 결과를 이용하여 API 실행을 중단시키거나 API 응답 내용을 제어할 수 있습니다.<br>

한편, 비동기 실행에서는 스크립트 완료를 기다리기 위해 처리가 블록되는 일이 없습니다.<br>
다만 스크립트 실행 결과를 이용하여 API 실행을 중단하거나 API 응답 내용을 변경할 수는 없습니다.<br>
비동기 실행은 API의 응답 흐름에 영향을 주지 않으므로 원칙적으로 비동기 실행을 권장합니다.<br>

비동기 실행에는 실행 방식이 두 가지 있으며, GS2-Script와 Amazon EventBridge가 있습니다.<br>
Amazon EventBridge를 사용함으로써 Lua 이외의 언어로 처리를 작성할 수 있습니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| triggerScriptId | string |  |  |  |  ~ 1024자 | API 실행 시 동기적으로 실행되는 GS2-Script의 스크립트GRN<br>"grn:gs2:"로 시작하는 GRN 형식의 ID로 지정해야 합니다. |
| doneTriggerTargetType | 문자열 열거형<br>enum {<br>"none",<br>"gs2_script",<br>"aws"<br>}<br> |  |  | "none" |  | 비동기 스크립트의 실행 방법<br>비동기 실행에서 사용할 스크립트의 종류를 지정합니다.<br>"비동기 실행의 스크립트를 사용하지 않음(none)", "GS2-Script를 사용함(gs2_script)", "Amazon EventBridge를 사용함(aws)" 중에서 선택할 수 있습니다.none: 없음 / gs2_script: GS2-Script / aws: Amazon EventBridge /  |
| doneTriggerScriptId | string | {doneTriggerTargetType} == "gs2_script" |  |  |  ~ 1024자 | 비동기 실행할 GS2-Script 스크립트GRN<br>"grn:gs2:"로 시작하는 GRN 형식의 ID로 지정해야 합니다.<br>※ doneTriggerTargetType이(가) "gs2_script" 이면 활성화 |
| doneTriggerQueueNamespaceId | string | {doneTriggerTargetType} == "gs2_script" |  |  |  ~ 1024자 | 비동기 실행 스크립트를 실행하는 GS2-JobQueue 네임스페이스GRN<br>비동기 실행 스크립트를 직접 실행하지 않고 GS2-JobQueue를 경유하는 경우 GS2-JobQueue의 네임스페이스GRN을 지정합니다.<br>GS2-JobQueue를 이용해야 할 이유는 많지 않으므로, 특별한 이유가 없다면 지정할 필요는 없습니다.<br>※ doneTriggerTargetType이(가) "gs2_script" 이면 활성화 |

#### NotificationSetting

푸시 통지에 관한 설정<br>

GS2의 마이크로서비스 내에서 어떠한 이벤트가 발생했을 때, 푸시 통지를 전송하기 위한 설정입니다.<br>
여기서 말하는 푸시 통지란 GS2-Gateway가 제공하는 WebSocket 인터페이스를 경유하는 처리이며, 스마트폰의 푸시 통지와는 성질이 다릅니다.<br>
예를 들어 매치메이킹이 완료되었을 때나 친구 요청이 도착했을 때 등, 게임 클라이언트의 조작과는 관계없이 상태가 변화했을 때 GS2-Gateway를 경유하여 푸시 통지를 함으로써, 게임 클라이언트는 상태 변화를 감지할 수 있습니다.<br>

GS2-Gateway의 푸시 통지는 통지 대상 디바이스가 오프라인이었을 때 추가 처리로 모바일 푸시 통지를 전송할 수 있습니다.<br>
모바일 푸시 통지를 잘 활용하면, 매치메이킹 중에 게임을 종료하더라도 모바일 푸시 통지를 사용하여 플레이어에게 알리고, 게임으로 복귀하도록 하는 흐름을 구현할 수 있을 가능성이 있습니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| gatewayNamespaceId | string |  |  | "grn:gs2:{region}:{ownerId}:gateway:default" |  ~ 1024자 | 푸시 통지에 사용할 GS2-Gateway의 네임스페이스<br>"grn:gs2:"로 시작하는 GRN 형식으로 GS2-Gateway의 네임스페이스 ID를 지정합니다. |
| enableTransferMobileNotification | bool? |  |  | false |  | 모바일 푸시 통지로 전달할지 여부<br>이 통지를 전송하려 할 때, 통지 대상 디바이스가 오프라인일 경우 모바일 푸시 통지로 전달할지 여부를 지정합니다. |
| sound | string | {enableTransferMobileNotification} == true |  |  |  ~ 1024자 | 모바일 푸시 통지에서 사용할 사운드 파일명<br>여기서 지정한 사운드 파일명은 모바일 푸시 통지를 전송할 때 사용되며, 특별한 사운드로 통지를 출력할 수 있습니다.<br>※ enableTransferMobileNotification이(가) true 이면 활성화 |
| enable | 문자열 열거형<br>enum {<br>"Enabled",<br>"Disabled"<br>}<br> |  |  | "Enabled" |  | 푸시 통지를 활성화할지 여부Enabled: 활성화 / Disabled: 비활성화 /  |

#### LogSetting

로그 출력 설정<br>

로그 데이터의 출력 설정을 관리합니다. 이 타입은 로그 데이터를 출력하기 위해 사용되는 GS2-Log 네임스페이스의 식별자(Namespace ID)를 보관합니다.<br>
로그 네임스페이스ID(loggingNamespaceId)에는 로그 데이터를 수집하여 저장하는 GS2-Log의 네임스페이스를 GRN 형식으로 지정합니다.<br>
이 설정을 하면 설정된 네임스페이스 내에서 발생한 API 요청·응답 로그 데이터가 대상 GS2-Log 네임스페이스 쪽으로 출력됩니다.<br>
GS2-Log에서는 실시간으로 로그가 제공되어 시스템 모니터링, 분석, 디버깅 등에 활용할 수 있습니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| loggingNamespaceId | string |  | ✓ |  |  ~ 1024자 | 로그를 출력할 GS2-Log의 네임스페이스GRN<br>"grn:gs2:"로 시작하는 GRN 형식의 ID로 지정해야 합니다. |

---

### CurrentMissionMaster

현재 활성화된 미션 모델의 마스터 데이터<br>

현재 네임스페이스 내에서 유효한 미션 모델의 정의를 기술한 마스터 데이터입니다.<br>
GS2에서는 마스터 데이터 관리에 JSON 형식의 파일을 사용합니다.<br>
파일을 업로드함으로써 실제로 서버에 설정을 반영할 수 있습니다.<br>

JSON 파일을 작성하는 방법으로, 매니지먼트 콘솔 내에 마스터 데이터 에디터를 제공하고 있습니다.<br>
또한 게임 운영에 더 적합한 도구를 직접 제작하여 적절한 포맷의 JSON 파일을 출력함으로써도 서비스를 이용할 수 있습니다.
**ℹ️ Note**

JSON 파일 형식에 대해서는 [GS2-Mission 마스터 데이터 레퍼런스](api_reference/mission/master_data/)를 참조해 주세요.

#### Request

리소스 생성・갱신 요청

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| namespaceName | string |  | ✓|  |  ~ 128자 | 네임스페이스 이름<br>네임스페이스 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| mode | 문자열 열거형<br>enum {<br>"direct",<br>"preUpload"<br>}<br> |  | | "direct" |  | 업데이트 모드direct: 마스터 데이터를 직접 업데이트 / preUpload: 마스터 데이터를 업로드한 후 업데이트 /  |
| settings | string | {mode} == "direct" | ✓※|  |  ~ 5242880 바이트 (5MB) | 마스터 데이터<br>※ mode이(가) "direct" 이면 필수 |
| uploadToken | string | {mode} == "preUpload" | ✓※|  |  ~ 1024자 | 사전 업로드로 획득한 토큰<br>업로드한 마스터 데이터를 적용하기 위해 사용됩니다.<br>※ mode이(가) "preUpload" 이면 필수 |

#### GetAttr

[!GetAttr](/articles/tech/deploy/#getattr) 태그로 취득 가능한 리소스 생성 결과

| | 타입 | 설명 |
| --- | --- | --- |
| Item | [CurrentMissionMaster](../sdk#currentmissionmaster) | 갱신된 현재 활성화된 미션 모델의 마스터 데이터

#### 구현 예제




**GS2-Deploy(YAML)**
```yaml

Type: GS2::Mission::CurrentMissionMaster
Properties:
  NamespaceName: namespace-0001
  Mode: direct
  Settings: {
    "version": "2019-05-28",
    "groups": [
      {
        "name": "daily",
        "resetType": "daily",
        "metadata": "DAILY",
        "tasks": [
          {
            "name": "quest_x10",
            "metadata": "QUEST_X10",
            "counterName": "quest_complete",
            "targetValue": 10,
            "completeAcquireActions": [
              {
                "action": "Gs2Experience:AddExperienceByUserId",
                "request": {
                  "namespaceName": "namespace-0001",
                  "experienceName": "player",
                  "propertyId": "player",
                  "experienceValue": 30,
                  "truncateExperienceWhenRankUp": false,
                  "userId": "#{userId}"
                }
              }
            ]
          },
          {
            "name": "quest_x20",
            "metadata": "QUEST_X20",
            "counterName": "quest_complete",
            "premiseMissionTaskName": "quest_x10",
            "targetValue": 20,
            "completeAcquireActions": [
              {
                "action": "Gs2Experience:AddExperienceByUserId",
                "request": {
                  "namespaceName": "namespace-0001",
                  "experienceName": "player",
                  "propertyId": "player",
                  "experienceValue": 30,
                  "truncateExperienceWhenRankUp": false,
                  "userId": "#{userId}"
                }
              }
            ]
          },
          {
            "name": "gacha",
            "metadata": "GACHA",
            "counterName": "lot_gacha",
            "targetValue": 1,
            "completeAcquireActions": [
              {
                "action": "Gs2Experience:AddExperienceByUserId",
                "request": {
                  "namespaceName": "namespace-0001",
                  "experienceName": "player",
                  "propertyId": "player",
                  "experienceValue": 30,
                  "truncateExperienceWhenRankUp": false,
                  "userId": "#{userId}"
                }
              }
            ]
          }
        ],
        "resetHour": 10
      },
      {
        "name": "weekly",
        "resetType": "weekly",
        "metadata": "WEEKLY",
        "tasks": [
          {
            "name": "quest_x100",
            "metadata": "QUEST_X100",
            "counterName": "quest_complete",
            "targetValue": 100,
            "completeAcquireActions": [
              {
                "action": "Gs2Experience:AddExperienceByUserId",
                "request": {
                  "namespaceName": "namespace-0001",
                  "experienceName": "player",
                  "propertyId": "player",
                  "experienceValue": 30,
                  "truncateExperienceWhenRankUp": false,
                  "userId": "#{userId}"
                }
              }
            ]
          },
          {
            "name": "quest_x1000",
            "metadata": "QUEST_X1000",
            "counterName": "quest_complete",
            "premiseMissionTaskName": "quest_x100",
            "targetValue": 1000,
            "completeAcquireActions": [
              {
                "action": "Gs2Experience:AddExperienceByUserId",
                "request": {
                  "namespaceName": "namespace-0001",
                  "experienceName": "player",
                  "propertyId": "player",
                  "experienceValue": 30,
                  "truncateExperienceWhenRankUp": false,
                  "userId": "#{userId}"
                }
              }
            ]
          }
        ],
        "resetDayOfWeek": "monday",
        "resetHour": 10
      },
      {
        "name": "story",
        "resetType": "notReset",
        "metadata": "STORY",
        "tasks": [
          {
            "name": "quest_1-1",
            "metadata": "QUEST_1-1",
            "counterName": "quest1",
            "targetValue": 1
          },
          {
            "name": "quest_1-2",
            "metadata": "QUEST_1-2",
            "counterName": "quest1",
            "premiseMissionTaskName": "quest_1-1",
            "targetValue": 1
          },
          {
            "name": "quest_1-3",
            "metadata": "QUEST_1-3",
            "counterName": "quest1",
            "premiseMissionTaskName": "quest_1-2",
            "targetValue": 1
          },
          {
            "name": "quest_1-4",
            "metadata": "QUEST_1-4",
            "counterName": "quest1",
            "premiseMissionTaskName": "quest_1-3",
            "targetValue": 1
          },
          {
            "name": "quest_2-1",
            "metadata": "QUEST_2-1",
            "counterName": "quest2",
            "premiseMissionTaskName": "quest_1-4",
            "targetValue": 1
          }
        ]
      }
    ],
    "counters": [
      {
        "name": "quest_complete",
        "scopes": [
          {
            "resetType": "daily",
            "resetHour": 5
          },
          {
            "resetType": "weekly",
            "resetDayOfWeek": "monday",
            "resetHour": 5
          }
        ],
        "metadata": "QUEST_COMPLETE"
      },
      {
        "name": "lot_gacha",
        "scopes": [
          {
            "resetType": "daily",
            "resetHour": 5
          }
        ],
        "metadata": "LOT_GACHA"
      },
      {
        "name": "quest1",
        "scopes": [
          {
            "resetType": "notReset"
          }
        ],
        "metadata": "QUEST1"
      },
      {
        "name": "quest2",
        "scopes": [
          {
            "resetType": "notReset"
          }
        ],
        "metadata": "QUEST2"
      }
    ]
  }
  UploadToken: null

```

**Go**
```go

import (
    "github.com/gs2io/gs2-golang-cdk/core"
    "github.com/gs2io/gs2-golang-cdk/mission"
    "github.com/gs2io/gs2-golang-cdk/experience"
    "github.com/openlyinc/pointy"
)


SampleStack := core.NewStack()
mission.NewNamespace(
    &SampleStack,
    "namespace-0001",
    mission.NamespaceOptions{},
).MasterData(
    []mission.MissionGroupModel{
        mission.NewMissionGroupModel(
            "daily",
            mission.MissionGroupModelResetTypeDaily,
            mission.MissionGroupModelOptions{
                Metadata: pointy.String("DAILY"),
                Tasks: []mission.MissionTaskModel{
                    mission.NewMissionTaskModel(
                        "quest_x10",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_X10"),
                            CompleteAcquireActions: []core.AcquireAction{
                                experience.AddExperienceByUserId(
                                    "namespace-0001",
                                    "player",
                                    "player",
                                    pointy.Int64(30),
                                    pointy.Bool(false),
                                ),
                            },
                        },
                    ),
                    mission.NewMissionTaskModel(
                        "quest_x20",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_X20"),
                            CompleteAcquireActions: []core.AcquireAction{
                                experience.AddExperienceByUserId(
                                    "namespace-0001",
                                    "player",
                                    "player",
                                    pointy.Int64(30),
                                    pointy.Bool(false),
                                ),
                            },
                            PremiseMissionTaskName: pointy.String("quest_x10"),
                        },
                    ),
                    mission.NewMissionTaskModel(
                        "gacha",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("GACHA"),
                            CompleteAcquireActions: []core.AcquireAction{
                                experience.AddExperienceByUserId(
                                    "namespace-0001",
                                    "player",
                                    "player",
                                    pointy.Int64(30),
                                    pointy.Bool(false),
                                ),
                            },
                        },
                    ),
                },
                ResetHour: pointy.Int32(10),
            },
        ),
        mission.NewMissionGroupModel(
            "weekly",
            mission.MissionGroupModelResetTypeWeekly,
            mission.MissionGroupModelOptions{
                Metadata: pointy.String("WEEKLY"),
                Tasks: []mission.MissionTaskModel{
                    mission.NewMissionTaskModel(
                        "quest_x100",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_X100"),
                            CompleteAcquireActions: []core.AcquireAction{
                                experience.AddExperienceByUserId(
                                    "namespace-0001",
                                    "player",
                                    "player",
                                    pointy.Int64(30),
                                    pointy.Bool(false),
                                ),
                            },
                        },
                    ),
                    mission.NewMissionTaskModel(
                        "quest_x1000",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_X1000"),
                            CompleteAcquireActions: []core.AcquireAction{
                                experience.AddExperienceByUserId(
                                    "namespace-0001",
                                    "player",
                                    "player",
                                    pointy.Int64(30),
                                    pointy.Bool(false),
                                ),
                            },
                            PremiseMissionTaskName: pointy.String("quest_x100"),
                        },
                    ),
                },
                ResetDayOfWeek: mission.MissionGroupModelResetDayOfWeekMonday.Pointer(),
                ResetHour: pointy.Int32(10),
            },
        ),
        mission.NewMissionGroupModel(
            "story",
            mission.MissionGroupModelResetTypeNotReset,
            mission.MissionGroupModelOptions{
                Metadata: pointy.String("STORY"),
                Tasks: []mission.MissionTaskModel{
                    mission.NewMissionTaskModel(
                        "quest_1-1",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_1-1"),
                        },
                    ),
                    mission.NewMissionTaskModel(
                        "quest_1-2",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_1-2"),
                            PremiseMissionTaskName: pointy.String("quest_1-1"),
                        },
                    ),
                    mission.NewMissionTaskModel(
                        "quest_1-3",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_1-3"),
                            PremiseMissionTaskName: pointy.String("quest_1-2"),
                        },
                    ),
                    mission.NewMissionTaskModel(
                        "quest_1-4",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_1-4"),
                            PremiseMissionTaskName: pointy.String("quest_1-3"),
                        },
                    ),
                    mission.NewMissionTaskModel(
                        "quest_2-1",
                        mission.MissionTaskModelVerifyCompleteTypeCounter,
                        mission.MissionTaskModelOptions{
                            Metadata: pointy.String("QUEST_2-1"),
                            PremiseMissionTaskName: pointy.String("quest_1-4"),
                        },
                    ),
                },
            },
        ),
    },
    []mission.CounterModel{
        mission.NewCounterModel(
            "quest_complete",
            []mission.CounterScopeModel{
                mission.NewCounterScopeModel(
                    mission.CounterScopeModelScopeTypeResetTiming,
                    mission.CounterScopeModelResetTypeDaily,
                    mission.CounterScopeModelOptions{
                        ResetHour: pointy.Int32(5),
                    },
                ),
                mission.NewCounterScopeModel(
                    mission.CounterScopeModelScopeTypeResetTiming,
                    mission.CounterScopeModelResetTypeWeekly,
                    mission.CounterScopeModelOptions{
                        ResetDayOfWeek: mission.CounterScopeModelResetDayOfWeekMonday.Pointer(),
                        ResetHour: pointy.Int32(5),
                    },
                ),
            },
            mission.CounterModelOptions{
                Metadata: pointy.String("QUEST_COMPLETE"),
            },
        ),
        mission.NewCounterModel(
            "lot_gacha",
            []mission.CounterScopeModel{
                mission.NewCounterScopeModel(
                    mission.CounterScopeModelScopeTypeResetTiming,
                    mission.CounterScopeModelResetTypeDaily,
                    mission.CounterScopeModelOptions{
                        ResetHour: pointy.Int32(5),
                    },
                ),
            },
            mission.CounterModelOptions{
                Metadata: pointy.String("LOT_GACHA"),
            },
        ),
        mission.NewCounterModel(
            "quest1",
            []mission.CounterScopeModel{
                mission.NewCounterScopeModel(
                    mission.CounterScopeModelScopeTypeResetTiming,
                    mission.CounterScopeModelResetTypeNotReset,
                    mission.CounterScopeModelOptions{},
                ),
            },
            mission.CounterModelOptions{
                Metadata: pointy.String("QUEST1"),
            },
        ),
        mission.NewCounterModel(
            "quest2",
            []mission.CounterScopeModel{
                mission.NewCounterScopeModel(
                    mission.CounterScopeModelScopeTypeResetTiming,
                    mission.CounterScopeModelResetTypeNotReset,
                    mission.CounterScopeModelOptions{},
                ),
            },
            mission.CounterModelOptions{
                Metadata: pointy.String("QUEST2"),
            },
        ),
    },
)

println(SampleStack.Yaml())  // Generate Template

```

**PHP**
```php

class SampleStack extends \Gs2Cdk\Core\Model\Stack
{
    function __construct() {
        parent::__construct();
        (new \Gs2Cdk\Mission\Model\Namespace_(
            stack: $this,
            name: "namespace-0001"
        ))->masterData(
            [
                new \Gs2Cdk\Mission\Model\MissionGroupModel(
                    name:"daily",
                    resetType: \Gs2Cdk\Mission\Model\Enums\MissionGroupModelResetType::DAILY,
                    options: new \Gs2Cdk\Mission\Model\Options\MissionGroupModelOptions(
                        metadata:"DAILY",
                        tasks:[
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_x10",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_X10",
                                    completeAcquireActions: [
                                        new \Gs2Cdk\Experience\StampSheet\AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        ),
                                    ],
                                ),
                            ),
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_x20",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_X20",
                                    completeAcquireActions: [
                                        new \Gs2Cdk\Experience\StampSheet\AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        ),
                                    ],
                                    premiseMissionTaskName: "quest_x10",
                                ),
                            ),
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "gacha",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "GACHA",
                                    completeAcquireActions: [
                                        new \Gs2Cdk\Experience\StampSheet\AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        ),
                                    ],
                                ),
                            ),
                        ],
                        resetHour:10
                    )
                ),
                new \Gs2Cdk\Mission\Model\MissionGroupModel(
                    name:"weekly",
                    resetType: \Gs2Cdk\Mission\Model\Enums\MissionGroupModelResetType::WEEKLY,
                    options: new \Gs2Cdk\Mission\Model\Options\MissionGroupModelOptions(
                        metadata:"WEEKLY",
                        tasks:[
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_x100",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_X100",
                                    completeAcquireActions: [
                                        new \Gs2Cdk\Experience\StampSheet\AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        ),
                                    ],
                                ),
                            ),
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_x1000",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_X1000",
                                    completeAcquireActions: [
                                        new \Gs2Cdk\Experience\StampSheet\AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        ),
                                    ],
                                    premiseMissionTaskName: "quest_x100",
                                ),
                            ),
                        ],
                        resetDayOfWeek:\Gs2Cdk\Mission\Model\Enums\MissionGroupModelResetDayOfWeek::MONDAY,
                        resetHour:10
                    )
                ),
                new \Gs2Cdk\Mission\Model\MissionGroupModel(
                    name:"story",
                    resetType: \Gs2Cdk\Mission\Model\Enums\MissionGroupModelResetType::NOT_RESET,
                    options: new \Gs2Cdk\Mission\Model\Options\MissionGroupModelOptions(
                        metadata:"STORY",
                        tasks:[
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_1-1",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_1-1",
                                ),
                            ),
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_1-2",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_1-2",
                                    premiseMissionTaskName: "quest_1-1",
                                ),
                            ),
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_1-3",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_1-3",
                                    premiseMissionTaskName: "quest_1-2",
                                ),
                            ),
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_1-4",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_1-4",
                                    premiseMissionTaskName: "quest_1-3",
                                ),
                            ),
                            new \Gs2Cdk\Mission\Model\MissionTaskModel(
                                name: "quest_2-1",
                                verifyCompleteType: \Gs2Cdk\Mission\Model\Enums\MissionTaskModelVerifyCompleteType::COUNTER,
                                options: new \Gs2Cdk\Mission\Model\Options\MissionTaskModelOptions(
                                    metadata: "QUEST_2-1",
                                    premiseMissionTaskName: "quest_1-4",
                                ),
                            ),
                        ]
                    )
                )
            ],
            [
                new \Gs2Cdk\Mission\Model\CounterModel(
                    name:"quest_complete",
                    scopes:[
                        new \Gs2Cdk\Mission\Model\CounterScopeModel(
                            scopeType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelScopeType::RESET_TIMING,
                            resetType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelResetType::DAILY,
                            options: new \Gs2Cdk\Mission\Model\Options\CounterScopeModelOptions(
                                resetHour: 5,
                            ),
                        ),
                        new \Gs2Cdk\Mission\Model\CounterScopeModel(
                            scopeType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelScopeType::RESET_TIMING,
                            resetType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelResetType::WEEKLY,
                            options: new \Gs2Cdk\Mission\Model\Options\CounterScopeModelOptions(
                                resetDayOfWeek: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelResetDayOfWeek::MONDAY,
                                resetHour: 5,
                            ),
                        ),
                    ],
                    options: new \Gs2Cdk\Mission\Model\Options\CounterModelOptions(
                        metadata:"QUEST_COMPLETE"
                    )
                ),
                new \Gs2Cdk\Mission\Model\CounterModel(
                    name:"lot_gacha",
                    scopes:[
                        new \Gs2Cdk\Mission\Model\CounterScopeModel(
                            scopeType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelScopeType::RESET_TIMING,
                            resetType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelResetType::DAILY,
                            options: new \Gs2Cdk\Mission\Model\Options\CounterScopeModelOptions(
                                resetHour: 5,
                            ),
                        ),
                    ],
                    options: new \Gs2Cdk\Mission\Model\Options\CounterModelOptions(
                        metadata:"LOT_GACHA"
                    )
                ),
                new \Gs2Cdk\Mission\Model\CounterModel(
                    name:"quest1",
                    scopes:[
                        new \Gs2Cdk\Mission\Model\CounterScopeModel(
                            scopeType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelScopeType::RESET_TIMING,
                            resetType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelResetType::NOT_RESET,
                        ),
                    ],
                    options: new \Gs2Cdk\Mission\Model\Options\CounterModelOptions(
                        metadata:"QUEST1"
                    )
                ),
                new \Gs2Cdk\Mission\Model\CounterModel(
                    name:"quest2",
                    scopes:[
                        new \Gs2Cdk\Mission\Model\CounterScopeModel(
                            scopeType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelScopeType::RESET_TIMING,
                            resetType: \Gs2Cdk\Mission\Model\Enums\CounterScopeModelResetType::NOT_RESET,
                        ),
                    ],
                    options: new \Gs2Cdk\Mission\Model\Options\CounterModelOptions(
                        metadata:"QUEST2"
                    )
                )
            ]
        );
    }
}

print((new SampleStack())->yaml());  // Generate Template

```

**Java**
```java

class SampleStack extends io.gs2.cdk.core.model.Stack
{
    public SampleStack() {
        super();
        new io.gs2.cdk.mission.model.Namespace(
            this,
            "namespace-0001"
        ).masterData(
            Arrays.asList(
                new io.gs2.cdk.mission.model.MissionGroupModel(
                    "daily",
                    io.gs2.cdk.mission.model.enums.MissionGroupModelResetType.DAILY,
                    new io.gs2.cdk.mission.model.options.MissionGroupModelOptions()
                        .withMetadata("DAILY")
                        .withTasks(Arrays.asList(
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_x10",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_X10")
                                    .withCompleteAcquireActions(Arrays.asList(
                                        new io.gs2.cdk.experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30L,
                                            false,
                                            "#{userId}"
                                        )
                                    ))
                            ),
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_x20",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_X20")
                                    .withCompleteAcquireActions(Arrays.asList(
                                        new io.gs2.cdk.experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30L,
                                            false,
                                            "#{userId}"
                                        )
                                    ))
                                    .withPremiseMissionTaskName("quest_x10")
                            ),
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "gacha",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("GACHA")
                                    .withCompleteAcquireActions(Arrays.asList(
                                        new io.gs2.cdk.experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30L,
                                            false,
                                            "#{userId}"
                                        )
                                    ))
                            )
                        ))
                        .withResetHour(10)
                ),
                new io.gs2.cdk.mission.model.MissionGroupModel(
                    "weekly",
                    io.gs2.cdk.mission.model.enums.MissionGroupModelResetType.WEEKLY,
                    new io.gs2.cdk.mission.model.options.MissionGroupModelOptions()
                        .withMetadata("WEEKLY")
                        .withTasks(Arrays.asList(
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_x100",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_X100")
                                    .withCompleteAcquireActions(Arrays.asList(
                                        new io.gs2.cdk.experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30L,
                                            false,
                                            "#{userId}"
                                        )
                                    ))
                            ),
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_x1000",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_X1000")
                                    .withCompleteAcquireActions(Arrays.asList(
                                        new io.gs2.cdk.experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30L,
                                            false,
                                            "#{userId}"
                                        )
                                    ))
                                    .withPremiseMissionTaskName("quest_x100")
                            )
                        ))
                        .withResetDayOfWeek(io.gs2.cdk.mission.model.enums.MissionGroupModelResetDayOfWeek.MONDAY)
                        .withResetHour(10)
                ),
                new io.gs2.cdk.mission.model.MissionGroupModel(
                    "story",
                    io.gs2.cdk.mission.model.enums.MissionGroupModelResetType.NOT_RESET,
                    new io.gs2.cdk.mission.model.options.MissionGroupModelOptions()
                        .withMetadata("STORY")
                        .withTasks(Arrays.asList(
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_1-1",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_1-1")
                            ),
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_1-2",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_1-2")
                                    .withPremiseMissionTaskName("quest_1-1")
                            ),
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_1-3",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_1-3")
                                    .withPremiseMissionTaskName("quest_1-2")
                            ),
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_1-4",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_1-4")
                                    .withPremiseMissionTaskName("quest_1-3")
                            ),
                            new io.gs2.cdk.mission.model.MissionTaskModel(
                                "quest_2-1",
                                io.gs2.cdk.mission.model.enums.MissionTaskModelVerifyCompleteType.COUNTER,
                                new io.gs2.cdk.mission.model.options.MissionTaskModelOptions()
                                    .withMetadata("QUEST_2-1")
                                    .withPremiseMissionTaskName("quest_1-4")
                            )
                        ))
                )
            ),
            Arrays.asList(
                new io.gs2.cdk.mission.model.CounterModel(
                    "quest_complete",
                    Arrays.asList(
                        new io.gs2.cdk.mission.model.CounterScopeModel(
                            io.gs2.cdk.mission.model.enums.CounterScopeModelScopeType.RESET_TIMING,
                            io.gs2.cdk.mission.model.enums.CounterScopeModelResetType.DAILY,
                            new io.gs2.cdk.mission.model.options.CounterScopeModelOptions()
                                .withResetHour(5)
                        ),
                        new io.gs2.cdk.mission.model.CounterScopeModel(
                            io.gs2.cdk.mission.model.enums.CounterScopeModelScopeType.RESET_TIMING,
                            io.gs2.cdk.mission.model.enums.CounterScopeModelResetType.WEEKLY,
                            new io.gs2.cdk.mission.model.options.CounterScopeModelOptions()
                                .withResetDayOfWeek(io.gs2.cdk.mission.model.enums.CounterScopeModelResetDayOfWeek.MONDAY)
                                .withResetHour(5)
                        )
                    ),
                    new io.gs2.cdk.mission.model.options.CounterModelOptions()
                        .withMetadata("QUEST_COMPLETE")
                ),
                new io.gs2.cdk.mission.model.CounterModel(
                    "lot_gacha",
                    Arrays.asList(
                        new io.gs2.cdk.mission.model.CounterScopeModel(
                            io.gs2.cdk.mission.model.enums.CounterScopeModelScopeType.RESET_TIMING,
                            io.gs2.cdk.mission.model.enums.CounterScopeModelResetType.DAILY,
                            new io.gs2.cdk.mission.model.options.CounterScopeModelOptions()
                                .withResetHour(5)
                        )
                    ),
                    new io.gs2.cdk.mission.model.options.CounterModelOptions()
                        .withMetadata("LOT_GACHA")
                ),
                new io.gs2.cdk.mission.model.CounterModel(
                    "quest1",
                    Arrays.asList(
                        new io.gs2.cdk.mission.model.CounterScopeModel(
                            io.gs2.cdk.mission.model.enums.CounterScopeModelScopeType.RESET_TIMING,
                            io.gs2.cdk.mission.model.enums.CounterScopeModelResetType.NOT_RESET
                        )
                    ),
                    new io.gs2.cdk.mission.model.options.CounterModelOptions()
                        .withMetadata("QUEST1")
                ),
                new io.gs2.cdk.mission.model.CounterModel(
                    "quest2",
                    Arrays.asList(
                        new io.gs2.cdk.mission.model.CounterScopeModel(
                            io.gs2.cdk.mission.model.enums.CounterScopeModelScopeType.RESET_TIMING,
                            io.gs2.cdk.mission.model.enums.CounterScopeModelResetType.NOT_RESET
                        )
                    ),
                    new io.gs2.cdk.mission.model.options.CounterModelOptions()
                        .withMetadata("QUEST2")
                )
            )
        );
    }
}

System.out.println(new SampleStack().yaml());  // Generate Template

```

**C#**
```csharp

public class SampleStack : Gs2Cdk.Core.Model.Stack
{
    public SampleStack() {
        new Gs2Cdk.Gs2Mission.Model.Namespace(
            stack: this,
            name: "namespace-0001"
        ).MasterData(
            new Gs2Cdk.Gs2Mission.Model.MissionGroupModel[] {
                new Gs2Cdk.Gs2Mission.Model.MissionGroupModel(
                    name: "daily",
                    resetType: Gs2Cdk.Gs2Mission.Model.Enums.MissionGroupModelResetType.Daily,
                    options: new Gs2Cdk.Gs2Mission.Model.Options.MissionGroupModelOptions
                    {
                        metadata = "DAILY",
                        tasks = new Gs2Cdk.Gs2Mission.Model.MissionTaskModel[]
                        {
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_x10",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_X10",
                                    completeAcquireActions = new Gs2Cdk.Core.Model.AcquireAction[]
                                    {
                                        new Gs2Cdk.Gs2Experience.StampSheet.AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        )
                                    }
                                }
                            ),
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_x20",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_X20",
                                    completeAcquireActions = new Gs2Cdk.Core.Model.AcquireAction[]
                                    {
                                        new Gs2Cdk.Gs2Experience.StampSheet.AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        )
                                    },
                                    premiseMissionTaskName = "quest_x10"
                                }
                            ),
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "gacha",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "GACHA",
                                    completeAcquireActions = new Gs2Cdk.Core.Model.AcquireAction[]
                                    {
                                        new Gs2Cdk.Gs2Experience.StampSheet.AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        )
                                    }
                                }
                            )
                        },
                        resetHour = 10
                    }
                ),
                new Gs2Cdk.Gs2Mission.Model.MissionGroupModel(
                    name: "weekly",
                    resetType: Gs2Cdk.Gs2Mission.Model.Enums.MissionGroupModelResetType.Weekly,
                    options: new Gs2Cdk.Gs2Mission.Model.Options.MissionGroupModelOptions
                    {
                        metadata = "WEEKLY",
                        tasks = new Gs2Cdk.Gs2Mission.Model.MissionTaskModel[]
                        {
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_x100",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_X100",
                                    completeAcquireActions = new Gs2Cdk.Core.Model.AcquireAction[]
                                    {
                                        new Gs2Cdk.Gs2Experience.StampSheet.AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        )
                                    }
                                }
                            ),
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_x1000",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_X1000",
                                    completeAcquireActions = new Gs2Cdk.Core.Model.AcquireAction[]
                                    {
                                        new Gs2Cdk.Gs2Experience.StampSheet.AddExperienceByUserId(
                                            namespaceName: "namespace-0001",
                                            experienceName: "player",
                                            propertyId: "player",
                                            experienceValue: 30,
                                            truncateExperienceWhenRankUp: false,
                                            userId: "#{userId}"
                                        )
                                    },
                                    premiseMissionTaskName = "quest_x100"
                                }
                            )
                        },
                        resetDayOfWeek = Gs2Cdk.Gs2Mission.Model.Enums.MissionGroupModelResetDayOfWeek.Monday,
                        resetHour = 10
                    }
                ),
                new Gs2Cdk.Gs2Mission.Model.MissionGroupModel(
                    name: "story",
                    resetType: Gs2Cdk.Gs2Mission.Model.Enums.MissionGroupModelResetType.NotReset,
                    options: new Gs2Cdk.Gs2Mission.Model.Options.MissionGroupModelOptions
                    {
                        metadata = "STORY",
                        tasks = new Gs2Cdk.Gs2Mission.Model.MissionTaskModel[]
                        {
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_1-1",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_1-1"
                                }
                            ),
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_1-2",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_1-2",
                                    premiseMissionTaskName = "quest_1-1"
                                }
                            ),
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_1-3",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_1-3",
                                    premiseMissionTaskName = "quest_1-2"
                                }
                            ),
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_1-4",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_1-4",
                                    premiseMissionTaskName = "quest_1-3"
                                }
                            ),
                            new Gs2Cdk.Gs2Mission.Model.MissionTaskModel(
                                name: "quest_2-1",
                                verifyCompleteType: Gs2Cdk.Gs2Mission.Model.Enums.MissionTaskModelVerifyCompleteType.Counter,
                                options: new Gs2Cdk.Gs2Mission.Model.Options.MissionTaskModelOptions
                                {
                                    metadata = "QUEST_2-1",
                                    premiseMissionTaskName = "quest_1-4"
                                }
                            )
                        }
                    }
                )
            },
            new Gs2Cdk.Gs2Mission.Model.CounterModel[] {
                new Gs2Cdk.Gs2Mission.Model.CounterModel(
                    name: "quest_complete",
                    scopes: new Gs2Cdk.Gs2Mission.Model.CounterScopeModel[]
                    {
                        new Gs2Cdk.Gs2Mission.Model.CounterScopeModel(
                            scopeType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelScopeType.ResetTiming,
                            resetType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelResetType.Daily,
                            options: new Gs2Cdk.Gs2Mission.Model.Options.CounterScopeModelOptions
                            {
                                resetHour = 5
                            }
                        ),
                        new Gs2Cdk.Gs2Mission.Model.CounterScopeModel(
                            scopeType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelScopeType.ResetTiming,
                            resetType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelResetType.Weekly,
                            options: new Gs2Cdk.Gs2Mission.Model.Options.CounterScopeModelOptions
                            {
                                resetDayOfWeek = Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelResetDayOfWeek.Monday,
                                resetHour = 5
                            }
                        )
                    },
                    options: new Gs2Cdk.Gs2Mission.Model.Options.CounterModelOptions
                    {
                        metadata = "QUEST_COMPLETE"
                    }
                ),
                new Gs2Cdk.Gs2Mission.Model.CounterModel(
                    name: "lot_gacha",
                    scopes: new Gs2Cdk.Gs2Mission.Model.CounterScopeModel[]
                    {
                        new Gs2Cdk.Gs2Mission.Model.CounterScopeModel(
                            scopeType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelScopeType.ResetTiming,
                            resetType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelResetType.Daily,
                            options: new Gs2Cdk.Gs2Mission.Model.Options.CounterScopeModelOptions
                            {
                                resetHour = 5
                            }
                        )
                    },
                    options: new Gs2Cdk.Gs2Mission.Model.Options.CounterModelOptions
                    {
                        metadata = "LOT_GACHA"
                    }
                ),
                new Gs2Cdk.Gs2Mission.Model.CounterModel(
                    name: "quest1",
                    scopes: new Gs2Cdk.Gs2Mission.Model.CounterScopeModel[]
                    {
                        new Gs2Cdk.Gs2Mission.Model.CounterScopeModel(
                            scopeType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelScopeType.ResetTiming,
                            resetType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelResetType.NotReset
                        )
                    },
                    options: new Gs2Cdk.Gs2Mission.Model.Options.CounterModelOptions
                    {
                        metadata = "QUEST1"
                    }
                ),
                new Gs2Cdk.Gs2Mission.Model.CounterModel(
                    name: "quest2",
                    scopes: new Gs2Cdk.Gs2Mission.Model.CounterScopeModel[]
                    {
                        new Gs2Cdk.Gs2Mission.Model.CounterScopeModel(
                            scopeType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelScopeType.ResetTiming,
                            resetType: Gs2Cdk.Gs2Mission.Model.Enums.CounterScopeModelResetType.NotReset
                        )
                    },
                    options: new Gs2Cdk.Gs2Mission.Model.Options.CounterModelOptions
                    {
                        metadata = "QUEST2"
                    }
                )
            }
        );
    }
}

Debug.Log(new SampleStack().Yaml());  // Generate Template

```

**TypeScript**
```typescript

import core from "@/gs2cdk/core";
import mission from "@/gs2cdk/mission";
import experience from "@/gs2cdk/experience";

class SampleStack extends core.Stack
{
    public constructor() {
        super();
        new mission.model.Namespace(
            this,
            "namespace-0001",
        ).masterData(
            [
                new mission.model.MissionGroupModel(
                    "daily",
                    mission.model.MissionGroupModelResetType.DAILY,
                    {
                        metadata: "DAILY",
                        tasks: [
                            new mission.model.MissionTaskModel(
                                "quest_x10",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_X10",
                                    completeAcquireActions: [
                                        new experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30,
                                            false,
                                            null,
                                            "#{userId}"
                                        ),
                                    ]
                                }
                            ),
                            new mission.model.MissionTaskModel(
                                "quest_x20",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_X20",
                                    completeAcquireActions: [
                                        new experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30,
                                            false,
                                            null,
                                            "#{userId}"
                                        ),
                                    ],
                                    premiseMissionTaskName: "quest_x10"
                                }
                            ),
                            new mission.model.MissionTaskModel(
                                "gacha",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "GACHA",
                                    completeAcquireActions: [
                                        new experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30,
                                            false,
                                            null,
                                            "#{userId}"
                                        ),
                                    ]
                                }
                            ),
                        ],
                        resetHour: 10
                    }
                ),
                new mission.model.MissionGroupModel(
                    "weekly",
                    mission.model.MissionGroupModelResetType.WEEKLY,
                    {
                        metadata: "WEEKLY",
                        tasks: [
                            new mission.model.MissionTaskModel(
                                "quest_x100",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_X100",
                                    completeAcquireActions: [
                                        new experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30,
                                            false,
                                            null,
                                            "#{userId}"
                                        ),
                                    ]
                                }
                            ),
                            new mission.model.MissionTaskModel(
                                "quest_x1000",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_X1000",
                                    completeAcquireActions: [
                                        new experience.stampSheet.AddExperienceByUserId(
                                            "namespace-0001",
                                            "player",
                                            "player",
                                            30,
                                            false,
                                            null,
                                            "#{userId}"
                                        ),
                                    ],
                                    premiseMissionTaskName: "quest_x100"
                                }
                            ),
                        ],
                        resetDayOfWeek: mission.model.MissionGroupModelResetDayOfWeek.MONDAY,
                        resetHour: 10
                    }
                ),
                new mission.model.MissionGroupModel(
                    "story",
                    mission.model.MissionGroupModelResetType.NOT_RESET,
                    {
                        metadata: "STORY",
                        tasks: [
                            new mission.model.MissionTaskModel(
                                "quest_1-1",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_1-1"
                                }
                            ),
                            new mission.model.MissionTaskModel(
                                "quest_1-2",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_1-2",
                                    premiseMissionTaskName: "quest_1-1"
                                }
                            ),
                            new mission.model.MissionTaskModel(
                                "quest_1-3",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_1-3",
                                    premiseMissionTaskName: "quest_1-2"
                                }
                            ),
                            new mission.model.MissionTaskModel(
                                "quest_1-4",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_1-4",
                                    premiseMissionTaskName: "quest_1-3"
                                }
                            ),
                            new mission.model.MissionTaskModel(
                                "quest_2-1",
                                mission.model.MissionTaskModelVerifyCompleteType.COUNTER,
                                {
                                    metadata: "QUEST_2-1",
                                    premiseMissionTaskName: "quest_1-4"
                                }
                            ),
                        ]
                    }
                )
            ],
            [
                new mission.model.CounterModel(
                    "quest_complete",
                    [
                        new mission.model.CounterScopeModel(
                            mission.model.CounterScopeModelScopeType.RESET_TIMING,
                            mission.model.CounterScopeModelResetType.DAILY,
                            {
                                resetHour: 5
                            }
                        ),
                        new mission.model.CounterScopeModel(
                            mission.model.CounterScopeModelScopeType.RESET_TIMING,
                            mission.model.CounterScopeModelResetType.WEEKLY,
                            {
                                resetDayOfWeek: mission.model.CounterScopeModelResetDayOfWeek.MONDAY,
                                resetHour: 5
                            }
                        ),
                    ],
                    {
                        metadata: "QUEST_COMPLETE"
                    }
                ),
                new mission.model.CounterModel(
                    "lot_gacha",
                    [
                        new mission.model.CounterScopeModel(
                            mission.model.CounterScopeModelScopeType.RESET_TIMING,
                            mission.model.CounterScopeModelResetType.DAILY,
                            {
                                resetHour: 5
                            }
                        ),
                    ],
                    {
                        metadata: "LOT_GACHA"
                    }
                ),
                new mission.model.CounterModel(
                    "quest1",
                    [
                        new mission.model.CounterScopeModel(
                            mission.model.CounterScopeModelScopeType.RESET_TIMING,
                            mission.model.CounterScopeModelResetType.NOT_RESET
                        ),
                    ],
                    {
                        metadata: "QUEST1"
                    }
                ),
                new mission.model.CounterModel(
                    "quest2",
                    [
                        new mission.model.CounterScopeModel(
                            mission.model.CounterScopeModelScopeType.RESET_TIMING,
                            mission.model.CounterScopeModelResetType.NOT_RESET
                        ),
                    ],
                    {
                        metadata: "QUEST2"
                    }
                )
            ]
        );
    }
}

console.log(new SampleStack().yaml());  // Generate Template

```

**Python**
```python

from gs2_cdk import Stack, core, mission, experience

class SampleStack(Stack):

    def __init__(self):
        super().__init__()
        mission.Namespace(
            stack=self,
            name="namespace-0001",
        ).master_data(
            groups=[
                mission.MissionGroupModel(
                    name='daily',
                    reset_type=mission.MissionGroupModelResetType.DAILY,
                    options=mission.MissionGroupModelOptions(
                        metadata = 'DAILY',
                        tasks = [
                            mission.MissionTaskModel(
                                name='quest_x10',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_X10',
                                    complete_acquire_actions=[
                                        experience.AddExperienceByUserId(
                                            namespace_name='namespace-0001',
                                            experience_name='player',
                                            property_id='player',
                                            experience_value=30,
                                            truncate_experience_when_rank_up=False,
                                            user_id='#{userId}'
                                        ),
                                    ],
                                ),
                            ),
                            mission.MissionTaskModel(
                                name='quest_x20',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_X20',
                                    complete_acquire_actions=[
                                        experience.AddExperienceByUserId(
                                            namespace_name='namespace-0001',
                                            experience_name='player',
                                            property_id='player',
                                            experience_value=30,
                                            truncate_experience_when_rank_up=False,
                                            user_id='#{userId}'
                                        ),
                                    ],
                                    premise_mission_task_name='quest_x10',
                                ),
                            ),
                            mission.MissionTaskModel(
                                name='gacha',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='GACHA',
                                    complete_acquire_actions=[
                                        experience.AddExperienceByUserId(
                                            namespace_name='namespace-0001',
                                            experience_name='player',
                                            property_id='player',
                                            experience_value=30,
                                            truncate_experience_when_rank_up=False,
                                            user_id='#{userId}'
                                        ),
                                    ],
                                ),
                            ),
                        ],
                        reset_hour = 10
                    ),
                ),
                mission.MissionGroupModel(
                    name='weekly',
                    reset_type=mission.MissionGroupModelResetType.WEEKLY,
                    options=mission.MissionGroupModelOptions(
                        metadata = 'WEEKLY',
                        tasks = [
                            mission.MissionTaskModel(
                                name='quest_x100',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_X100',
                                    complete_acquire_actions=[
                                        experience.AddExperienceByUserId(
                                            namespace_name='namespace-0001',
                                            experience_name='player',
                                            property_id='player',
                                            experience_value=30,
                                            truncate_experience_when_rank_up=False,
                                            user_id='#{userId}'
                                        ),
                                    ],
                                ),
                            ),
                            mission.MissionTaskModel(
                                name='quest_x1000',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_X1000',
                                    complete_acquire_actions=[
                                        experience.AddExperienceByUserId(
                                            namespace_name='namespace-0001',
                                            experience_name='player',
                                            property_id='player',
                                            experience_value=30,
                                            truncate_experience_when_rank_up=False,
                                            user_id='#{userId}'
                                        ),
                                    ],
                                    premise_mission_task_name='quest_x100',
                                ),
                            ),
                        ],
                        reset_day_of_week = mission.MissionGroupModelResetDayOfWeek.MONDAY,
                        reset_hour = 10
                    ),
                ),
                mission.MissionGroupModel(
                    name='story',
                    reset_type=mission.MissionGroupModelResetType.NOT_RESET,
                    options=mission.MissionGroupModelOptions(
                        metadata = 'STORY',
                        tasks = [
                            mission.MissionTaskModel(
                                name='quest_1-1',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_1-1',
                                ),
                            ),
                            mission.MissionTaskModel(
                                name='quest_1-2',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_1-2',
                                    premise_mission_task_name='quest_1-1',
                                ),
                            ),
                            mission.MissionTaskModel(
                                name='quest_1-3',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_1-3',
                                    premise_mission_task_name='quest_1-2',
                                ),
                            ),
                            mission.MissionTaskModel(
                                name='quest_1-4',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_1-4',
                                    premise_mission_task_name='quest_1-3',
                                ),
                            ),
                            mission.MissionTaskModel(
                                name='quest_2-1',
                                verify_complete_type= mission.MissionTaskModelVerifyCompleteType.COUNTER,
                                options=mission.MissionTaskModelOptions(
                                    metadata='QUEST_2-1',
                                    premise_mission_task_name='quest_1-4',
                                ),
                            ),
                        ]
                    ),
                ),
            ],
            counters=[
                mission.CounterModel(
                    name='quest_complete',
                    scopes=[
                        mission.CounterScopeModel(
                            scope_type= mission.CounterScopeModelScopeType.RESET_TIMING,
                            reset_type=mission.CounterScopeModelResetType.DAILY,
                            options=mission.CounterScopeModelOptions(
                                reset_hour=5,
                            ),
                        ),
                        mission.CounterScopeModel(
                            scope_type= mission.CounterScopeModelScopeType.RESET_TIMING,
                            reset_type=mission.CounterScopeModelResetType.WEEKLY,
                            options=mission.CounterScopeModelOptions(
                                reset_day_of_week=mission.CounterScopeModelResetDayOfWeek.MONDAY,
                                reset_hour=5,
                            ),
                        ),
                    ],
                    options=mission.CounterModelOptions(
                        metadata = 'QUEST_COMPLETE'
                    ),
                ),
                mission.CounterModel(
                    name='lot_gacha',
                    scopes=[
                        mission.CounterScopeModel(
                            scope_type= mission.CounterScopeModelScopeType.RESET_TIMING,
                            reset_type=mission.CounterScopeModelResetType.DAILY,
                            options=mission.CounterScopeModelOptions(
                                reset_hour=5,
                            ),
                        ),
                    ],
                    options=mission.CounterModelOptions(
                        metadata = 'LOT_GACHA'
                    ),
                ),
                mission.CounterModel(
                    name='quest1',
                    scopes=[
                        mission.CounterScopeModel(
                            scope_type= mission.CounterScopeModelScopeType.RESET_TIMING,
                            reset_type=mission.CounterScopeModelResetType.NOT_RESET,        
                        ),
                    ],
                    options=mission.CounterModelOptions(
                        metadata = 'QUEST1'
                    ),
                ),
                mission.CounterModel(
                    name='quest2',
                    scopes=[
                        mission.CounterScopeModel(
                            scope_type= mission.CounterScopeModelScopeType.RESET_TIMING,
                            reset_type=mission.CounterScopeModelResetType.NOT_RESET,        
                        ),
                    ],
                    options=mission.CounterModelOptions(
                        metadata = 'QUEST2'
                    ),
                ),
            ],
        )

print(SampleStack().yaml())  # Generate Template

```


#### CounterModel

카운터 모델<br>

카운터 모델은 미션 태스크의 달성 조건으로 설정할 수 있는 엔티티입니다.<br>
카운터 값은 여러 미션 그룹에서 참조할 수 있기 때문에, 하나의 카운터를 위클리 미션과 데일리 미션 같은 여러 미션 그룹의 달성 조건으로 설정할 수 있습니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| counterId | string |  | ※ |  |  ~ 1024자 | 카운터 모델 GRN<br>※ 서버가 자동으로 설정 |
| name | string |  | ✓ |  |  ~ 128자 | 카운터 모델명<br>카운터 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| metadata | string |  |  |  |  ~ 1024자 | 메타데이터<br>메타데이터에는 임의의 값을 설정할 수 있습니다.<br>이 값들은 GS2의 동작에는 영향을 주지 않으므로, 게임 내에서 사용하는 정보를 저장하는 용도로 사용할 수 있습니다. |
| scopes | [List&lt;CounterScopeModel&gt;](#counterscopemodel) |  |  | [] | 1 ~ 20 items | 카운터의 리셋 타이밍 목록<br>이 카운터의 스코프(리셋 타이밍 또는 검증 액션 조건)를 정의합니다. 하나의 카운터에 여러 스코프를 설정할 수 있으며, 서로 다른 기간의 값(예: 데일리, 위클리, 누계를 동시에)을 추적할 수 있습니다. |
| challengePeriodEventId | string |  |  |  |  ~ 1024자 | 카운터를 조작할 수 있는 기간을 설정한 GS2-Schedule 이벤트 GRN<br>이 카운터의 증감이 가능한 기간을 정의하는 GS2-Schedule 이벤트를 지정합니다. 설정하지 않은 경우, 카운터는 언제든지 조작할 수 있습니다. |

#### CounterScopeModel

카운터 리셋 타이밍 모델<br>

카운터의 스코프를 정의하고, 카운터 값의 리셋 방법과 타이밍을 결정합니다. 스코프는 리셋 타이밍(매일, 매주, 매월, 일정 일수마다, 또는 리셋 없음) 또는 검증 액션 조건 중 하나입니다. 각 카운터는 여러 스코프를 가질 수 있으며, 서로 다른 기간의 값을 추적할 수 있습니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| scopeType | 문자열 열거형<br>enum {<br>"resetTiming",<br>"verifyAction"<br>}<br> |  |  | "resetTiming" |  | 스코프의 종류<br>카운터 스코프의 정의 방법을 결정합니다. "resetTiming" 은 정기적인 리셋 스케줄을 사용하고, "verifyAction" 은 검증 액션으로 카운터 값이 적용되는지 여부를 판정합니다.resetTiming: 리셋 타이밍 / verifyAction: 검증 액션 /  |
| resetType | 문자열 열거형<br>enum {<br>"notReset",<br>"daily",<br>"weekly",<br>"monthly",<br>"days"<br>}<br> |  |  | "notReset" |  | 리셋 타이밍<br>이 스코프의 카운터 값이 리셋되는 타이밍을 결정합니다. 리셋하지 않음(영구 누계), 매일, 매주, 매월, 일정 일수마다 중에서 선택합니다. scopeType 이 "resetTiming" 인 경우에만 사용됩니다.notReset: 리셋 안 함 / daily: 매일 / weekly: 매주 / monthly: 매월 / days: 일정 일수마다 /  |
| resetDayOfMonth | int | {resetType} == "monthly" | ✓※ |  | 1 ~ 31 | 리셋할 날짜<br>카운터 값이 리셋되는 월의 날짜입니다. 지정한 값이 해당 월의 일수를 초과하는 경우, 그 달의 마지막 날로 처리됩니다. resetType 이 "monthly" 인 경우에만 사용됩니다.<br>※ resetType이(가) "monthly" 이면 필수 |
| resetDayOfWeek | 문자열 열거형<br>enum {<br>"sunday",<br>"monday",<br>"tuesday",<br>"wednesday",<br>"thursday",<br>"friday",<br>"saturday"<br>}<br> | {resetType} == "weekly" | ✓※ |  |  | 리셋할 요일<br>카운터 값이 리셋되는 요일입니다. resetType 이 "weekly" 인 경우에만 사용됩니다.sunday: 일요일 / monday: 월요일 / tuesday: 화요일 / wednesday: 수요일 / thursday: 목요일 / friday: 금요일 / saturday: 토요일 / <br>※ resetType이(가) "weekly" 이면 필수 |
| resetHour | int | {resetType} in ["monthly", "weekly", "daily"] | ✓※ |  | 0 ~ 23 | 리셋 시각<br>카운터 값이 리셋되는 시각(0~23)입니다. 매일, 매주, 매월 리셋 타입과 조합하여 사용됩니다.<br>※ resetType이(가) "monthly","weekly","daily"이면 필수 |
| conditionName | string | {scopeType} == "verifyAction" | ✓※ |  |  ~ 128자 | 조건명<br>이 검증 액션 조건 스코프를 식별하는 고유한 이름입니다. 카운터 내에서 대응하는 스코프 값을 조회하는 데 사용됩니다. scopeType 이 "verifyAction" 인 경우에만 사용됩니다.<br>※ scopeType이(가) "verifyAction" 이면 필수 |
| condition | [VerifyAction](#verifyaction) | {scopeType} == "verifyAction" | ✓※ |  |  | 조건<br>이 스코프의 카운터 값이 적용되는지 여부를 판정하는 검증 액션입니다. scopeType이 "verifyAction"인 경우에만 사용됩니다.<br>※ scopeType이(가) "verifyAction" 이면 필수 |
| anchorTimestamp | long | {resetType} == "days" | ✓※ |  |  | 경과 일수를 계산하는 기준 일시<br>UNIX 시간(밀리초)<br>※ resetType이(가) "days" 이면 필수 |
| days | int | {resetType} == "days" | ✓※ |  | 1 ~ 2147483646 | 리셋하는 일수<br>기준 일시부터 카운트되는 카운터 값의 리셋 간격 일수입니다. resetType이 "days"인 경우에만 사용됩니다.<br>※ resetType이(가) "days" 이면 필수 |

#### MissionGroupModel

미션 그룹 모델<br>

미션 그룹은 카운터의 리셋 타이밍으로 태스크를 그룹화하는 엔티티입니다.<br>
예를 들어, 데일리 미션으로 하나의 그룹, 위클리 미션으로 하나의 그룹이 됩니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| missionGroupId | string |  | ※ |  |  ~ 1024자 | 미션 그룹 GRN<br>※ 서버가 자동으로 설정 |
| name | string |  | ✓ |  |  ~ 128자 | 미션 그룹 모델 이름<br>미션 그룹 모델 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| metadata | string |  |  |  |  ~ 1024자 | 메타데이터<br>메타데이터에는 임의의 값을 설정할 수 있습니다.<br>이 값들은 GS2의 동작에는 영향을 주지 않으므로, 게임 내에서 사용하는 정보를 저장하는 용도로 사용할 수 있습니다. |
| tasks | [List&lt;MissionTaskModel&gt;](#missiontaskmodel) |  |  | [] | 0 ~ 1000 items | 미션 태스크 리스트<br>이 그룹에 속하는 미션 태스크입니다. 각 태스크는 달성 조건(카운터의 임계값 또는 검증 액션)과 달성 시 부여되는 보상을 정의합니다. |
| resetType | 문자열 열거형<br>enum {<br>"notReset",<br>"daily",<br>"weekly",<br>"monthly",<br>"days"<br>}<br> |  |  | "notReset" |  | 리셋 타이밍<br>미션 그룹의 달성 상황이 리셋되는 타이밍을 결정합니다. 리셋하지 않음(영구), 매일, 매주, 매월, 기준 일시부터 일정 일수마다 중에서 선택합니다.notReset: 리셋 안 함 / daily: 매일 / weekly: 매주 / monthly: 매월 / days: 일정 일수마다 /  |
| resetDayOfMonth | int | {resetType} == "monthly" | ✓※ |  | 1 ~ 31 | 리셋하는 날짜<br>미션 그룹이 리셋되는 월의 날짜입니다. 지정한 값이 해당 월의 일수를 초과하는 경우, 그 달의 마지막 날로 처리됩니다. resetType이 "monthly"인 경우에만 사용됩니다.<br>※ resetType이(가) "monthly" 이면 필수 |
| resetDayOfWeek | 문자열 열거형<br>enum {<br>"sunday",<br>"monday",<br>"tuesday",<br>"wednesday",<br>"thursday",<br>"friday",<br>"saturday"<br>}<br> | {resetType} == "weekly" | ✓※ |  |  | 리셋하는 요일<br>미션 그룹이 리셋되는 요일입니다. resetType이 "weekly"인 경우에만 사용됩니다.sunday: 일요일 / monday: 월요일 / tuesday: 화요일 / wednesday: 수요일 / thursday: 목요일 / friday: 금요일 / saturday: 토요일 / <br>※ resetType이(가) "weekly" 이면 필수 |
| resetHour | int | {resetType} in ["monthly", "weekly", "daily"] | ✓※ |  | 0 ~ 23 | 리셋 시각<br>미션 그룹이 리셋되는 시각(0~23)입니다. 매일, 매주, 매월 리셋 타입과 조합하여 사용됩니다.<br>※ resetType이(가) "monthly","weekly","daily"이면 필수 |
| completeNotificationNamespaceId | string |  |  |  |  ~ 1024자 | 미션 태스크를 달성했을 때의 푸시 통지<br>이 그룹 내의 미션 태스크가 달성되었을 때 푸시 통지를 전송하는 데 사용되는 GS2-Gateway의 네임스페이스 GRN입니다. 게임 클라이언트에 실시간으로 통지할 수 있습니다. |
| anchorTimestamp | long | {resetType} == "days" | ✓※ |  |  | 경과 일수를 계산하는 기준 일시<br>UNIX 시간(밀리초)<br>※ resetType이(가) "days" 이면 필수 |
| days | int | {resetType} == "days" | ✓※ |  | 1 ~ 2147483646 | 리셋하는 일수<br>기준 일시부터 카운트되는 리셋 간격 일수입니다. resetType이 "days"인 경우에만 사용됩니다.<br>※ resetType이(가) "days" 이면 필수 |

#### MissionTaskModel

미션 태스크 모델<br>

미션 태스크는 연결된 카운터의 값이 일정 수준을 초과하면 보상을 받을 수 있는 조건을 정의하는 엔티티입니다.

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| missionTaskId | string |  | ※ |  |  ~ 1024자 | 미션 태스크 GRN<br>※ 서버가 자동으로 설정 |
| name | string |  | ✓ |  |  ~ 128자 | 미션 태스크 모델 이름<br>미션 태스크 모델 고유의 이름. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| metadata | string |  |  |  |  ~ 1024자 | 메타데이터<br>메타데이터에는 임의의 값을 설정할 수 있습니다.<br>이 값들은 GS2의 동작에는 영향을 주지 않으므로, 게임 내에서 사용하는 정보를 저장하는 용도로 사용할 수 있습니다. |
| verifyCompleteType | 문자열 열거형<br>enum {<br>"counter",<br>"verifyActions"<br>}<br> |  |  | "counter" |  | 달성 조건 종류<br>미션 태스크의 달성 판정 방법을 지정합니다. "counter"는 관련된 카운터의 스코프 값이 목표 임곗값에 도달했는지 확인합니다. "verifyActions"는 검증 액션을 사용하여 달성 조건을 확인합니다.counter: 카운터 / verifyActions: 검증 액션 /  |
| targetCounter | [TargetCounterModel](#targetcountermodel) | {verifyCompleteType} == "counter" | ✓※ |  |  | 목표 카운터<br>미션 태스크의 달성 판정에 사용되는 카운터, 스코프, 목표값을 정의합니다. 카운터의 스코프 값이 지정된 목표값에 도달하거나 초과한 경우, 태스크가 달성된 것으로 간주됩니다.<br>※ verifyCompleteType이(가) "counter" 이면 필수 |
| verifyCompleteConsumeActions | [List&lt;VerifyAction&gt;](#verifyaction) | {verifyCompleteType} == "verifyActions" |  | [] | 0 ~ 10 items | 태스크 달성 판정에 사용하는 검증 액션<br>미션 태스크의 달성 판정에 사용되는 검증 액션의 목록입니다. 모든 검증 액션이 성공한 경우 태스크가 달성된 것으로 간주됩니다. verifyCompleteType이 "verifyActions"인 경우에만 사용됩니다.<br>※ verifyCompleteType이(가) "verifyActions" 이면 활성화 |
| completeAcquireActions | [List&lt;AcquireAction&gt;](#acquireaction) |  |  | [] | 0 ~ 100 items | 미션 달성 시 보상<br>플레이어가 미션 달성 보상을 받을 때 실행되는 입수 액션의 목록입니다. |
| challengePeriodEventId | string |  |  |  |  ~ 1024자 | 보상을 받을 수 있는 기간을 설정한 GS2-Schedule 이벤트 GRN<br>미션 태스크의 보상을 받을 수 있는 기간을 정의하는 GS2-Schedule 이벤트를 지정합니다. 설정하지 않은 경우, 달성 후 언제든지 보상을 받을 수 있습니다. |
| premiseMissionTaskName | string |  |  |  |  ~ 128자 | 이 태스크에 도전하기 위해 달성해 두어야 하는 태스크의 이름<br>이 태스크의 보상을 받기 전에 달성해 두어야 하는, 같은 그룹 내의 전제 미션 태스크를 지정합니다. 단계적인 미션 체인을 만드는 데 사용합니다. |

#### TargetCounterModel

목표 카운터<br>

미션의 달성 목표가 되는 카운터의 정보

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| counterName | string |  | ✓ |  |  ~ 128자 | 카운터 모델명<br>카운터 모델 고유의 이름입니다. 영숫자 및 -(하이픈) _(언더스코어) .(마침표)로 지정합니다. |
| scopeType | 문자열 열거형<br>enum {<br>"resetTiming",<br>"verifyAction"<br>}<br> |  |  | "resetTiming" |  | 스코프 종류<br>미션 달성 판정에 사용하는 카운터 스코프의 종류를 지정합니다. "resetTiming"은 특정 리셋 기간의 카운터 값을 평가하고, "verifyAction"은 이름이 지정된 조건의 값을 평가합니다.resetTiming: 리셋 타이밍 / verifyAction: 검증 액션 /  |
| resetType | 문자열 열거형<br>enum {<br>"notReset",<br>"daily",<br>"weekly",<br>"monthly",<br>"days"<br>}<br> | {scopeType} == "resetTiming" |  |  |  | 목표 리셋 타이밍<br>목표값과 비교할 카운터의 리셋 타이밍 스코프를 지정합니다. 예를 들어 "daily"를 선택하면 데일리 카운터 값을 확인합니다. 생략한 경우, 미션 그룹의 리셋 타이밍이 사용됩니다.notReset: 리셋 안 함 / daily: 매일 / weekly: 매주 / monthly: 매월 / days: 일정 일수마다 / <br>※ scopeType이(가) "resetTiming" 이면 활성화 |
| conditionName | string | {scopeType} == "verifyAction" | ✓※ |  |  ~ 128자 | 조건 이름<br>목표값과 비교할 검증 액션 조건 스코프의 이름입니다. 카운터 모델의 스코프에서 정의된 conditionName과 일치해야 합니다. scopeType이 "verifyAction"인 경우에만 사용됩니다.<br>※ scopeType이(가) "verifyAction" 이면 필수 |
| value | long |  | ✓ |  | 0 ~ 9223372036854775805 | 목표값<br>미션 태스크가 달성된 것으로 간주되기 위해, 카운터의 스코프 값이 도달하거나 초과해야 하는 임곗값입니다. |

#### AcquireAction

입수 액션

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 문자열 열거형<br>enum {<br>}<br> |  | ✓ |  |  | 입수 액션에서 실행할 액션의 종류 |
| request | string |  | ✓ |  |  ~ 524288자 | 액션 실행 시 사용되는 요청의 JSON 문자열 |

#### VerifyAction

검증 액션

|  | 타입 | 활성화 조건 | 필수 | 기본값 | 값 제한 | 설명 |
| --- | --- | --- | --- | --- | --- | --- |
| action | 문자열 열거형<br>enum {<br>}<br> |  | ✓ |  |  | 검증 액션에서 실행할 액션의 종류 |
| request | string |  | ✓ |  |  ~ 524288자 | 액션 실행 시 사용되는 요청의 JSON 문자열 |

---



