# context

시나리오 엔진은 시나리오를 구성하는 태스크를 순차적으로 실행하게 되는데, 각 태스크가 자신의 구현에 집중할 수 있도록 컨텍스트를 통해서 여러가지 기능과 데이타를 태스크에 제공하게 된다.

## 기능

- logger
  - 태스크 수행 중에 로그를 남겨야 할 필요가 있을 때, 컨텍스트로 제공된 logger를 사용할 수 있다.

```
  logger.info('...')
  logger.warn('...')
  logger.error('...')
```

- publish
  - 태스크 수행 중에 데이타를 브로드캐스트할 경우에 사용할 수 있다.

```
  publish('tag', data)
```

- load
  - 태스크 수행 중에 다른 시나리오를 실행할 경우에 사용한다.
  - 이 때 새로 만들어지는 시나리오 인스턴스를 서브시나리오라고 한다.
  - 서브시나리오는 동기 개념으로 실행되어야 한다. 즉, load에 의해 시작된 시나리오 인스턴스가 완료될 때까지 기다린다.

```
load(instanceName, scenarioConfig, context)
```

- client
  - 서버에 내장된 GraphQL API를 호출할 때 사용한다.
  - client는 현재 시나리오가 실행되는 프로세스의 API를 호출할 수 있도록 바인드된 graphql client 객체이다.

```
client.query(...)
client.mutate(...)
```

- closures
  - 태스크는 보통 실행 시작 시점에 필요한 리소스를 할당하고, 종료하기 전에 리소스를 해제하도록 권장된다.
  - 하지만, 어떤 경우에는 태스크는 효율을 위해서 최초 시작 시점에 필요한 리소스를 할당하고, 시나리오 인스턴스가 종료되는 시점에 리소스를 해제하고자 할 수 있다.
  - 이 때에 closuers 에 리소스 해제를 위한 함수를 등록해 놓으면, 시나리오 인스턴스가 종료되는 시점에 자동으로 호출되어 리소스 해제의 기회를 얻을 수 있다.
- checkState
  - 현재 시나리오의 상태가 어떤 상태인지를 확인하는 함수이다.

```
if(checkState(ScenarioInstanceStatus.STARTED)) {
  ...
}
```

## 데이타

- domain
  - 시나리오의 도메인 정보
  - 도메인은 시나리오가 정의 및 실행되는 경계가 된다.
- variables
  - 시나리오가 시작될 때, 넘겨진 입력변수 오브젝트
  - 시나리오를 실행하는 여러가지 방법에는 일반적으로 입력변수를 제공하는 기능이 제공된다.
- data
  - 시나리오가 진행되면서 수행된 각 스텝의 반환값을 유지하는 오브젝트이다.
  - 각 스텝의 이름을 Key로 하며, 그 결과 값을 Value로 유지하는 오브젝트이다.
  - 서브시나리오 스텝의 결과 값은 해당 서브시나리오의 스텝의 반환값을 모두 포함한다.
  - 주의. 시나리오에서 하나의 스텝이 여러번 실행되는 경우 마지막 결과값만 유지한다.
- state
  - 현재 시나리오의 상태값을 유지한다.
  - 시나리오의 상태 정의는 다음과 같다.

```
enum ScenarioInstanceStatus {
  READY,
  STARTED,
  STOPPED,
  HALTED,
  UNLOADED
}
```

- root
  - 시나리오는 스텝으로 다른 시나리오를 가질 수 있으며, 이 경우 스텝으로 정의된 시나리오를 서브시나리오라고 한다.
  - root 는 최상위 부모 시나리오를 가리킨다.
