# 경로와 가짜 데이터 (/ko/docs/mocks/routes)

경로는 메서드와 경로 주소, 그리고 그곳에서 모의 서버가 응답하는 내용입니다. 아직 명세가 없을 때, 개발하거나 테스트할 엔드포인트가 몇 개
필요할 때, 명세와 다르게 응답하는 경로가 필요할 때 경로를 직접 만드세요. 본문은 전송되는 그대로 JSON, XML, 텍스트로 작성하며, 요청마다
새로 만들어지는 가짜 데이터를 넣을 수 있습니다.

직접 만든 경로는 모의 서버의 [JavaScript 경로](/docs/mocks/scripted-routes) 다음, 그리고 명세를 제공하는 경우 명세의 작업 앞에서 응답합니다.
[요청에 대한 응답이 정해지는 방식](/docs/mocks#which-response-a-request-gets)을 참고하세요.

## 경로 만들기 [#making-a-route]

[모의 서버 페이지](/docs/mocks)에서 **새로운 모의 서버**로 모의 서버를 만들거나(가짜 사용자 다섯 명을 반환하는 `GET /users` 경로가 처음에
들어 있습니다) 기존 모의 서버를 엽니다. **경로** 카드에 경로가 나열됩니다.

- 체크 상자는 경로를 삭제하지 않고 끕니다. 꺼진 경로는 아무것도 응답하지 않습니다.
- 경로를 클릭하면 목록 아래에서 편집할 수 있습니다.
- **경로 추가**는 선택한 경로 다음에 새 경로를 추가합니다.
- 경로를 오른쪽 클릭하면 **복제**, **요청 생성**, **주소 복사**(모의 서버가 실행 중일 때), **위로 이동**, **아래로 이동**, **경로 삭제**가
  나타납니다.

모든 변경은 즉시 저장되고, 실행 중인 모의 서버도 즉시 새 내용으로 응답합니다. **편집 › 실행 취소**로 경로 삭제를 포함한 모든 변경을
되돌릴 수 있습니다. 켜져 있는 두 경로의 메서드와 경로가 같으면 카드가 경고합니다. 첫 번째 경로만 응답합니다.

<Shot id="mocks-route-editor" alt="GET /users/{id} 경로의 편집기: 메서드, 경로, 요약, 응답 200 OK(기본값)와 404 Not found, 그리고 OK 응답의 콘텐츠 타입, {{$randomUUID}} 값의 X-Request-Id 헤더, request.params.id와 가짜 값이 들어 있는 JSON 본문이 보입니다" />

### 메서드, 경로, 요약 [#method-path-and-summary]

- **경로**: 메서드(**GET**, **POST**, **PUT**, **PATCH**, **DELETE**, **HEAD**, **OPTIONS**, 모든 메서드를 뜻하는 **ANY**)와
  경로 주소. `HEAD` 요청은 본문 없이 **GET** 경로로 갑니다.
- **경로 매개변수**는 경로의 구간마다 하나씩 `{id}` 또는 `:id`로 씁니다. 예: `/users/{id}`, `/files/{name}.json`. `:id`는
  `{id}`로 저장됩니다. 고정 구간이 있는 경로는 매개변수가 있는 경로보다 우선하므로 `/users/me`가 `/users/{id}`보다 먼저 응답합니다.
- **요약**은 경로가 무엇을 위한 것인지 설명합니다. 경로에서 만든 요청은 이 요약을 이름으로 사용합니다.

## 응답 [#responses]

경로에는 응답이 하나 이상 있습니다. <strong>응답</strong> 아래의 칩으로 응답을 전환하고, <strong>+</strong>로 추가합니다. 각 응답에는 다음이 있습니다.

| 필드 | 설명 |
| --- | --- |
| **이름** | 요청과 규칙이 응답을 가리키는 이름. 예: `OK`, `Not found`. 이름은 경로 안에서 고유해야 합니다. |
| **상태** | 상태 코드(100~999). |
| **Content-Type** | 전송할 `Content-Type`. 예: `application/json`, `application/xml`. 옆의 메뉴에 자주 쓰는 타입이 있습니다. 비우면 보내지 않습니다. 본문의 값을 어떻게 이스케이프할지도 이 값으로 정해집니다. |
| **헤더** | 함께 보낼 헤더. 본문처럼 값에 가짜 데이터와 요청의 일부를 넣을 수 있습니다. |
| **규칙** | 기본 응답 대신 이 응답이 응답하는 조건. [응답 고르기](#choosing-a-response)를 참고하세요. |
| **본문** | 전송할 내용. JSON, XML, HTML에는 줄 번호와 색상이 표시됩니다. |

체크 표시가 있는 응답이 경로의 **기본값**이며, 다른 응답에서 **기본값으로 지정**을 누르면 바뀝니다. 휴지통 버튼은 응답을 삭제합니다.

### 응답 고르기 [#choosing-a-response]

경로로 온 요청은 다음 순서로 응답을 받습니다.

1. 요청이 지정한 응답: `Prefer: example=Not found` 또는 `Prefer: code=404` 헤더, 또는 Postman의 `x-mock-response-name`과
   `x-mock-response-code` 헤더.
2. 규칙이 모두 성립하는 첫 번째 응답.
3. 경로의 기본값: **기본값으로 지정**으로 기본값으로 만든 응답이며, 규칙과 관계없이 응답합니다. 기본값을 고르지 않은 경로에서는 규칙이
   성립하지 않은 첫 번째 응답이 규칙이 없는 첫 번째 응답에 자리를 내주므로, 맨 위에 둔 “발송된 주문에 대한 409”가 다른 모든 주문에
   응답하지는 않습니다.

**규칙**은 요청의 한 부분을 봅니다.

| 규칙 | 이름 | 예 |
| --- | --- | --- |
| **경로 매개변수** | 경로의 매개변수 | `id`가 `0` |
| **쿼리 매개변수** | 쿼리 매개변수 | `page`가 `*` |
| **헤더** | 대소문자와 관계없는 헤더 | `X-Role`이 `admin` |
| **본문 필드** | JSON 본문 안의 키 경로. 목록 항목은 숫자로 쓰고, 본문 전체는 비워 둡니다 | `user.plan`이 `pro`, `items.0.sku`가 `TNT-MH-2P` |

값은 그 부분이 가져야 하는 텍스트입니다. `*`는 값이 있기만 하면 어떤 값이든 된다는 뜻이고, 빈 값은 그 부분이 없어야 한다는 뜻입니다. 규칙이
여러 개인 응답은 모두 성립할 때만 응답합니다. 이름이 없는 규칙은 이름을 입력할 때까지 건너뜁니다.

예를 들어 `GET /users/{id}` 경로는 기본으로 사용자와 함께 `200`을 응답하고, **경로 매개변수** `id`가 `0`이라는 규칙을 가진 `404`
응답을 둘 수 있습니다.

```sh
curl -i http://127.0.0.1:4010/users/42    # 200, the user
curl -i http://127.0.0.1:4010/users/0     # 404
```

<Shot id="mocks-route-rule" alt="GET /users/{id}의 404 Not found 응답과 기본값으로 지정 버튼, 그리고 경로 매개변수 id가 0이라는 규칙" />

## 가짜 데이터가 있는 본문 [#bodies-with-fake-data]

본문이나 헤더 값에서 `{{ }}` 안에 있는 것은 요청이 올 때 채워지므로, 요청마다 새 데이터를 받을 수 있습니다. 본문의 나머지는 작성한 그대로
전송됩니다.

```json
{
  "id": "{{request.params.id}}",
  "name": "{{$randomFullName}}",
  "email": "{{$randomEmail}}",
  "company": "{{$randomCompanyName}}",
  "joined": "{{$randomDatePast}}"
}
```

### 가짜 값 [#fake-values]

`{{$randomFirstName}}`, `{{$randomEmail}}`, `{{$randomCity}}`, `{{$randomPrice}}`, `{{$randomUUID}}`와 그 밖의 약 120개: 이름과
직업, 인터넷, 주소, 전화번호, 회사, 금융, 제품, 날짜, 단어, lorem ipsum, 파일, 이미지, 데이터베이스. 이름은 Postman의 동적 변수와 같으므로
Postman용으로 작성한 템플릿이 여기서도 동작합니다. 인수를 받는 것도 있습니다. `{{$randomInt(1, 100)}}`, `{{$randomPrice(5, 50)}}`,
`{{$randomLoremWords(5)}}`, `{{$randomElement(active, paused, closed)}}`. 모든 값은 [동적 값](/docs/reference/dynamic-values#fake-data)에
나와 있습니다.

본문 위의 **값 삽입**은 커서 위치에 가짜 값을 넣습니다. **가짜 데이터**에 그룹별로 있습니다.

같은 값을 요청에서도 사용할 수 있으며, 요청에서는 보낼 때마다 새로 만들어집니다. [동적 값](/docs/requests/dynamic-values)을
참고하세요.

### 요청의 일부 [#parts-of-the-request]

| 토큰 | 설명 |
| --- | --- |
| `{{request.params.id}}` | 경로 매개변수. |
| `{{request.query.page}}` | 쿼리 매개변수. 없으면 빈 값. |
| `{{request.headers.X-Trace}}` | 대소문자와 관계없는 헤더. |
| `{{request.body.user.name}}` | JSON 본문의 필드를 키 경로로 지정(목록 항목은 `items.0.sku`). 텍스트는 그대로, 숫자, `true`, `false`, 객체, 목록은 JSON으로. |
| `{{request.body}}` | 텍스트로서의 본문 전체. |
| `{{request.method}}` | `POST` 같은 메서드. |
| `{{request.path}}` | `/users/42` 같은 경로. |

**값 삽입 › 요청**에 경로 자신의 경로 매개변수와 함께 나와 있습니다.

### 목록 [#lists]

`{{#repeat 10}}` … `{{/repeat}}`는 그 사이의 내용을 그 횟수만큼 씁니다. `{{#repeat 2 8}}`은 두 수 사이의 횟수만큼 쓰며, 요청마다 새로
정해집니다. JSON 본문에서는 항목 사이에 쉼표가 자동으로 들어갑니다. 안쪽에서 `{{@number}}`는 1부터 시작하는 항목 번호, `{{@index}}`는
0부터 시작하는 번호입니다. 반복 안에 반복을 넣을 수 있습니다.

```json
[
  {{#repeat 5}}
  {
    "id": {{@number}},
    "name": "{{$randomProductName}}",
    "price": {{$randomPrice}}
  }
  {{/repeat}}
]
```

한 줄에 `{{#repeat}}` 또는 `{{/repeat}}`만 있으면 빈 줄이 남지 않습니다.

### 이스케이프 [#escaping]

값은 들어가는 위치에 맞게 이스케이프되므로, 따옴표가 들어 있는 이름이 JSON을 깨뜨리지 않습니다.

- JSON 본문(`json`이 들어 있는 `Content-Type`)에서는 문자열 안의 값이 JSON으로 이스케이프됩니다. `{{$randomInt}}`나 `{{@number}}`처럼
  따옴표 밖에 있는 값은 그대로 들어갑니다.
- XML과 HTML(`xml` 또는 `html`이 들어 있는 `Content-Type`)에서는 `&`, `<`, `>`, 따옴표가 어디서든 이스케이프됩니다.
- 중괄호 세 개는 이스케이프하지 않습니다. `{{{request.body}}}`는 요청의 JSON 본문을 JSON으로 그대로 넣습니다.

```json
{ "received": {{{request.body}}}, "at": "{{$isoTimestamp}}" }
```

Echolot이 모르는 토큰은 작성한 그대로 남습니다. `{{$randomInt(9, 1)}}`처럼 만들 수 없는 값도 작성한 그대로 남으며, [로그](/docs/mocks#the-log)가
이유를 알려 줍니다. 본문은 16 MB, 반복은 10,000개 항목에서 멈춥니다.

본문은 그 외에는 아무것도 읽지 않습니다. 작업 공간의 변수, 환경, 비밀 값, 파일을 읽지 않으므로, 네트워크에서 응답하는 모의 서버가 이들을
노출할 수 없습니다.

### 고정 데이터: 생성 [#fixed-data-generate]

`{{ }}` 안의 값은 요청마다 새 데이터를 줍니다. 매번 같은 데이터로 응답하려면 본문 위의 <strong>생성…</strong>을 클릭하세요.

- **목록 만들기: 본문은 항목 하나**를 켜면 본문이 그 **항목 수**만큼의 JSON 목록이 되고, 각 항목은 본문으로 만들어집니다.
- 끄면 본문의 값이 한 번 채워집니다.

**생성**은 본문을 결과로 바꿉니다. **편집 › 실행 취소**로 템플릿을 되돌릴 수 있습니다. 터미널에서는
[`echolot fake`](/docs/cli/fake)가 같은 일을 합니다.

## 경로에서 요청 만들기 [#requests-from-routes]

**경로** 카드의 **요청 생성**은 모의 서버의 이름으로 된 폴더를 만들고, 켜져 있는 모든 경로에 대한 요청을 넣습니다. 경로의 컨텍스트
메뉴에서 **요청 생성**을 선택하면 그 경로의 요청 하나를 만듭니다. Echolot이 첫 번째 요청을 엽니다.

- 폴더에는 모의 서버의 주소로 설정된 변수 `baseUrl`이 있고, 모든 URL은 이 변수로 시작합니다. 예: `{{baseUrl}}/users/{{id}}`. 나중에
  `baseUrl`을 실제 API로 바꾸면 같은 요청이 그쪽으로 갑니다.
- 경로 매개변수는 요청 변수가 되며, 기본 응답의 경로 규칙이 값을 지정하지 않으면 `1`입니다.
- 요청의 이름은 경로의 요약입니다.
- 경로의 요청 본문이 함께 들어갑니다.

### 경로의 요청 본문 [#the-request-body-of-a-route]

경로 맨 아래의 **요청 본문**에는 경로에서 만든 요청에 사용할 본문과 **Content-Type**이 들어 있습니다. 예를 들어 `POST /users`가 받는
JSON입니다. 모의 서버가 응답하는 내용은 바꾸지 않으며, 본문 필드에 대한 규칙은 요청이 실제로 보내는 내용을 읽습니다.

## 에이전트와 함께 [#with-agents]

**모의 서버** 도구 모음이 켜져 있으면 에이전트와 [어시스턴트](/docs/ai/assistant)도 경로를 만들 수 있습니다. 필요한 것을 요청하세요.

- “주문 목록, 조회, 생성 경로가 있는 모의 서버를 가짜 데이터로 만들고 시작해 줘.”
- “id가 0이면 `GET /users/{id}`가 404를 반환하게 해 줘.”
- “모의 서버의 경로에 대한 요청을 만들어 줘.”

에이전트는 `create_mock`(이름과 경로를 지정하며 명세는 필요 없음), `save_mock_route`, `delete_mock_route`, `generate_fake_data`,
`list_fake_values`, `create_requests_from_mock`을 사용합니다. `save_mock_route`는 [기록](/docs/workspaces/history)의 응답을 경로로
바꿀 수도 있으며, 복사되는 내용은 에이전트가 읽는 다른 모든 것과 같이 가려집니다. 에이전트가 경로를 삭제할 때는 먼저 확인을 요청합니다.
[에이전트](/docs/ai/agents)를 참고하세요.

## 작업 공간에서 [#in-the-workspace]

경로는 모의 서버의 파일 `mocks/<name>.toml`에 `[[routes]]`와 그 `[[routes.responses]]`로 저장됩니다. diff에서 읽기 쉽고 Git으로
공유됩니다. [작업 공간 파일](/docs/reference/workspace-files#mocks)을 참고하세요.
