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

`echolot grpc`는 gRPC 서비스를 설명하고 메서드를 호출하며, 메시지는 JSON으로 씁니다. 서비스는 서버의 리플렉션이나 `.proto` 파일에서
알아냅니다. 앱에서의 같은 기능은 [gRPC 요청](/docs/requests/grpc)을 참조하십시오.

| 하위 명령 | 동작 |
| --- | --- |
| `echolot grpc describe` | 서버나 `.proto` 파일의 서비스와 메서드를 각 메서드의 필드와 함께 나열합니다. |
| `echolot grpc call` | 메서드를 호출하고 응답을 JSON으로 출력합니다. |

예제는 Alpenglow 작업 공간의 `specs/inventory.proto`인 Alpenglow 재고 서비스를 사용합니다. 이 서비스는 Mac의 `localhost:50051`에서
실행되며, 데모 API는 gRPC를 제공할 수 없습니다.

## echolot grpc describe [#echolot-grpc-describe]

```sh
echolot grpc describe [<url>] [--proto <file>] [--header <header> ...] [--insecure] [--timeout <seconds>] [--json]
```

```sh
echolot grpc describe --proto Alpenglow.echolot/specs/inventory.proto
```

```text
Alpenglow.echolot/specs/inventory.proto: 1 service
alpenglow.inventory.v1.Inventory
  ListWarehouses (unary): alpenglow.inventory.v1.ListWarehousesRequest → alpenglow.inventory.v1.ListWarehousesResponse
  WatchStock (server streaming): alpenglow.inventory.v1.WatchStockRequest → alpenglow.inventory.v1.StockLevel
    skus: repeated string
  Reserve (unary): alpenglow.inventory.v1.ReserveRequest → alpenglow.inventory.v1.Reservation
    sku: string
    quantity: int32
    orderId: string
```

서버를 지정하면(`echolot grpc describe http://localhost:50051`) 서버의 리플렉션 서비스에 묻습니다. 각 메서드에는 단항(unary),
서버 스트리밍, 클라이언트 스트리밍, 양방향 중 무엇인지, 요청과 응답 타입, 요청의 필드가 표시됩니다.

| 옵션 | 의미 |
| --- | --- |
| `<url>` | 서버, `http://host:port` 또는 `https://host:port`. `--proto`가 있으면 필요하지 않습니다. |
| `--proto <file>` | 서비스를 설명하는 `.proto` 파일. import하는 파일은 그 옆에 있어야 합니다. 없으면 서버의 리플렉션에 묻습니다. |
| `-H`, `--header <header>` | `'Name: value'` 형식의 메타데이터. 반복할 수 있습니다. |
| `-k`, `--insecure` | TLS 인증서 검증을 건너뜁니다. |
| `--timeout <seconds>` | 호출 전체를 기다리는 시간(초). 기본값은 30입니다. |
| `--json` | 설명을 JSON으로 출력합니다. |

## echolot grpc call [#echolot-grpc-call]

```sh
echolot grpc call <url> <method> [--data <json>] [--deadline <ms>] [--compress <algorithm>] [--proto <file>] [--header <header> ...] [--insecure] [--timeout <seconds>]
```

`<method>`는 `package.Service/Method`입니다. 메시지는 JSON이며 기본값은 `{}`이고, `-d -`는 표준 입력에서 읽습니다.
클라이언트 스트리밍 메서드에는 배열을 지정하며, 각 요소가 메시지 하나입니다. 응답은 표준 출력에 JSON으로 출력됩니다.

```sh
echolot grpc call http://localhost:50051 alpenglow.inventory.v1.Inventory/Reserve \
  -d '{"sku": "TNT-MH-2P", "quantity": 1, "orderId": "ord_7Hk2Lw"}' \
  --proto Alpenglow.echolot/specs/inventory.proto
```

상태, 받은 메시지 수, 소요 시간은 표준 오류로 나갑니다. `OK`가 아닌 상태는 1로 종료합니다.

| 옵션 | 의미 |
| --- | --- |
| `-d`, `--data <json>` | JSON 메시지. `-`는 표준 입력에서 읽습니다. 기본값은 `{}`입니다. |
| `--deadline <ms>` | `grpc-timeout`으로 보내는 데드라인(밀리초). |
| `--compress <algorithm>` | 보내는 메시지를 압축합니다: `gzip` 또는 `deflate`. 압축된 응답은 어느 쪽이든 읽습니다. |
| `--proto <file>` | 서비스를 설명하는 `.proto` 파일. import하는 파일은 그 옆에 있어야 합니다. 없으면 서버의 리플렉션에 묻습니다. |
| `-H`, `--header <header>` | `'Name: value'` 형식의 메타데이터. 반복할 수 있습니다. |
| `-k`, `--insecure` | TLS 인증서 검증을 건너뜁니다. |
| `--timeout <seconds>` | 호출 전체를 기다리는 시간(초). 기본값은 30입니다. |

`http://`는 TLS 없이 HTTP/2를 사용하고, `https://`는 TLS를 사용합니다. 잘 알려진 타입(`google.protobuf.Timestamp` 등)은 내장되어 있으므로
이를 import하는 `.proto` 파일에는 다른 파일이 필요하지 않습니다.

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

| 코드 | 조건 |
| --- | --- |
| `0` | `describe`가 서비스를 찾았습니다. `call`이 `OK` 상태로 끝났습니다. |
| `1` | 서버에 연결하거나 설명을 얻을 수 없었거나, 호출의 상태가 `OK`가 아니었습니다. |
| `64` | 잘못된 옵션. |
