# echolot mock (/ko/docs/cli/mock)

`echolot mock`은 모의 서버를 제공합니다. 작업 공간에 저장된 모의 서버(직접 [만든 경로](/docs/mocks/routes)와, 있으면 그 명세 포함) 또는
OpenAPI 문서가 대상이며, OpenAPI 문서의 작업은 문서화된 예시나 스키마로 만든 본문으로 응답합니다. API가 생기기 전에 클라이언트를
만들거나, CI 작업에 원하는 방식으로 응답하는 서버를 제공할 때 사용합니다. [모의 서버 페이지](/docs/mocks)와 같은 모의 서버를
제공합니다.

```sh
echolot mock <source> [--workspace <workspace>] [--port <port>] [--share] [--delay <ms>] [--failure-rate <percent>] [--no-validate] [--routes <file>]
```

`<source>`는 명세 파일(YAML 또는 JSON)이거나, `--workspace`가 있으면 그 작업 공간에 저장된 모의 서버의 이름입니다.

## 명세의 모의 서버 [#mock-a-spec]

```sh
echolot mock Alpenglow.echolot/specs/alpenglow.yaml --port 4010
```

```text
Mock of Alpenglow demo shop: 9 operations at http://127.0.0.1:4010/v1 (Ctrl-C stops it)
```

모의 서버는 명세의 첫 번째 서버의 경로(여기서는 `/v1`)에서 응답합니다. 응답한 각 요청은 표준 출력의 한 줄이며, 상태, 메서드와 경로,
일치한 작업, 응답의 출처, 소요 시간이 표시됩니다. 요청의 문제는 그 아래에 나열됩니다.

```text
200 GET /v1/products/TNT-MH-2P  → GET /products/{sku} (generated)  0 ms
400 POST /v1/orders  → POST /orders  0 ms
    body $.lines: expected array, got string
```

**요청은 명세와 대조해 검사합니다.** 매개변수나 본문이 명세에 맞지 않는 요청은 무엇이 잘못되었는지 알려 주는 `400`을 받습니다.

```json
{
  "error" : "The request does not match the spec (POST /orders).",
  "problems" : [
    "body $.lines: expected array, got string"
  ]
}
```

`--no-validate`를 쓰면 이런 요청에도 응답합니다.

**응답 선택.** 기본적으로 작업은 첫 번째 성공 응답과 첫 번째 예시로 응답합니다. 요청이 `Prefer: code=404, example=empty`나 Postman의
`x-mock-response-code`, `x-mock-response-name` 헤더로 다른 응답을 요청할 수 있습니다.

## 작업 공간의 모의 서버 [#mock-a-workspaces-mock]

`--workspace`를 쓰면 `<source>`는 모의 서버 페이지에 저장된 모의 서버를 가리킵니다(`mocks/`에 있는, `.toml`을 뺀 파일 이름 또는
이름). 그 포트, 지연, 실패율, 요청 검사, 선택된 응답, 경로가 적용되며 지정한 옵션이 이를 덮어씁니다. JavaScript 경로(`mocks/<name>.js`)가
먼저 응답하고, 그다음 직접 만든 경로, 그다음 명세 순서입니다. [스크립트 경로](/docs/mocks/scripted-routes)와
[경로와 가짜 데이터](/docs/mocks/routes)를 참조하십시오.

```sh
echolot mock shop -w Alpenglow.echolot --delay 300
```

경로로 이루어진 모의 서버에는 명세가 필요하지 않습니다.

```sh
echolot mock storefront -w Shop.echolot
```

```text
Mock of Storefront: 3 routes at http://127.0.0.1:4321 (Ctrl-C stops it)
200 GET /users/42  → GET /users/{id} (OK)  1 ms
404 GET /users/0  → GET /users/{id} (Not found)  0 ms
```

각 줄에는 응답한 경로와, 괄호 안에 그 경로가 준 응답이 표시됩니다. 본문의 가짜 값은 요청마다 새로 만들어집니다. 서버 없이 가짜 데이터를
만들려면 [echolot fake](/docs/cli/fake)를 참조하십시오.

## 옵션 [#options]

| 옵션 | 의미 |
| --- | --- |
| `-w`, `--workspace <folder>` | 모의 서버가 있는 작업 공간 폴더. |
| `--port <port>` | 포트. 기본값은 모의 서버 자체의 포트, 없으면 4010입니다. |
| `--share` | 이 Mac만이 아니라 모든 네트워크 인터페이스에서 응답합니다. 컨테이너와 휴대폰용입니다. |
| `--delay <ms>` | 각 응답 전에 기다릴 시간(밀리초). |
| `--failure-rate <percent>` | 요청 중 주입된 `500`으로 응답할 비율(퍼센트). |
| `--no-validate` | 명세에 맞지 않는 요청을 `400`으로 거부하는 대신 응답합니다. |
| `--routes <file>` | 명세보다 먼저 응답하는 JavaScript 경로. 기본값은 작업 공간 모의 서버의 `mocks/<name>.js`입니다. |

`--share`가 없으면 모의 서버는 127.0.0.1에서만 수신하므로 네트워크의 다른 어떤 것도 접근할 수 없습니다. `--share`를 쓰면 사용자의
Mac에 접근할 수 있는 누구나 접근할 수 있습니다.

모의 서버의 한도를 넘는 요청 본문은 `413`을 받으며 경로에 도달하지 않습니다.

## CI에서 [#in-ci]

모의 서버를 백그라운드에서 시작하고 그것을 대상으로 실행합니다. Alpenglow의 **Local** 환경은 `{{baseURL}}`을
`http://localhost:8787/v1`로 지정하므로, 포트 8787의 모의 서버가 그 요청에 응답합니다.

```sh
echolot mock Alpenglow.echolot/specs/alpenglow.yaml --port 8787 &
echolot run Alpenglow.echolot --env local --folder catalog
kill %1
```

## 종료 코드 [#exit-codes]

모의 서버는 사용자가 중지할 때까지 실행됩니다. 잘못된 옵션이나 작업 공간에 없는 모의 서버 이름이면 `64`로, 명세를 읽을 수 없거나
포트가 이미 사용 중이면 `1`로 종료합니다.
