gRPC 클라이언트에서 호출하기
서비스를 사용해 보세요.
gRPC 클라이언트에서 호출하기은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.
생성된 클라이언트
tonic은 각 서비스에 대해 클라이언트 구조체를 생성합니다. 예를 들어 greeter_client 모듈에 GreeterClient가 생성됩니다. 이 구조체는 각 rpc에 대응하는 비동기 메서드를 하나씩 제공합니다.
전송 채널에서 생성하거나 엔드포인트에 직접 연결하여 만들 수 있습니다.
use greeter::v1::greeter_client::GreeterClient;
use greeter::v1::HelloRequest;서버에 연결하기
가장 간단한 방법은 주소 문자열을 받아 연결된 클라이언트를 반환하는 GreeterClient::connect를 사용하는 것입니다.
비동기 문맥에서 실행되므로 #[tokio::main] 아래에서 .await와 함께 호출합니다.
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut client = GreeterClient::connect("http://[::1]:50051").await?;
Ok(())
}단일 요청 호출하기
메시지를 tonic::Request로 감싸거나 Request::new를 사용한 다음, 생성된 메서드를 호출합니다.
응답은 tonic::Response입니다. 메시지를 읽으려면 .into_inner()를 호출합니다.
let request = tonic::Request::new(HelloRequest { name: "Ada".into() });
let response = client.say_hello(request).await?;
println!("{}", response.into_inner().message);Status 오류 처리하기
서버가 오류를 반환하면 호출 결과는 Err(Status)가 됩니다. status.code()와 status.message()를 확인하여 대응합니다.
이는 서버 측과 동일한 방식입니다. NotFound나 Unauthenticated 같은 코드가 클라이언트로 전달됩니다.
match client.say_hello(req).await {
Ok(resp) => println!("{}", resp.into_inner().message),
Err(status) => eprintln!("{}: {}", status.code(), status.message()),
}채널 만들기
재사용과 구성을 위해 Endpoint를 사용하여 Channel을 명시적으로 만듭니다. 시간 제한, TCP 연결 유지, 연결 옵션을 설정할 수 있습니다.
그런 다음 GreeterClient::new(channel)로 클라이언트를 만듭니다.
use tonic::transport::{Channel, Endpoint};
let channel = Endpoint::from_static("http://[::1]:50051")
.timeout(std::time::Duration::from_secs(5))
.connect()
.await?;
let mut client = GreeterClient::new(channel);메타데이터 보내기
보내기 전에 요청 메타데이터에 삽입하여 인증 토큰과 같은 헤더를 추가합니다.
값에는 MetadataValue를 사용해야 하며, 유효한 ASCII 헤더 값이어야 합니다.
use tonic::metadata::MetadataValue;
let mut req = tonic::Request::new(HelloRequest { name: "Ada".into() });
let token: MetadataValue<_> = "Bearer abc123".parse()?;
req.metadata_mut().insert("authorization", token);호출별 기한
서버가 느리게 응답하더라도 클라이언트가 멈추지 않도록 기한을 설정합니다. 요청에 set_timeout을 설정하면 기한을 초과했을 때 DeadlineExceeded 상태로 호출이 중단됩니다.
기한은 서버에도 전달되므로 서버가 작업을 일찍 중단할 수 있습니다.
let mut req = tonic::Request::new(HelloRequest { name: "Ada".into() });
req.set_timeout(std::time::Duration::from_secs(2));
let resp = client.say_hello(req).await?;서버 스트림 소비하기
서버 스트리밍 호출은 스트림을 반환합니다. into_inner()로 스트림을 가져온 다음, None이 반환될 때까지 반복문에서 message().await로 메시지를 가져옵니다.
각 반복에서 디코딩된 응답 하나를 얻습니다.
let mut stream = client.server_stream(req).await?.into_inner();
while let Some(item) = stream.message().await? {
println!("{:?}", item);
}클라이언트 스트리밍
클라이언트 스트리밍 호출에는 비동기 요청 스트림을 전달합니다. 반복자나 채널을 tokio_stream으로 감싼 뒤 메서드에 전달합니다.
보내기를 모두 마치면 단일 응답이 도착합니다.
use tokio_stream::iter;
let outbound = iter(vec![msg1, msg2, msg3]);
let response = client.client_stream(Request::new(outbound)).await?;
println!("{:?}", response.into_inner());TLS 연결
암호화된 전송을 사용하려면 CA 인증서와 서버 도메인을 지정하여 ClientTlsConfig를 구성한 다음 https로 연결합니다.
이를 위해서는 tonic 의존성에서 tls 기능을 활성화해야 합니다.
use tonic::transport::{ClientTlsConfig, Endpoint};
let tls = ClientTlsConfig::new().domain_name("example.com");
let channel = Endpoint::from_static("https://example.com:50051")
.tls_config(tls)?
.connect()
.await?;클라이언트 재사용하기
기본 Channel은 복제 비용이 낮고 하나의 HTTP/2 연결에서 여러 요청을 다중화합니다. 다시 연결하는 대신 여러 작업에 클라이언트를 복제하여 사용합니다.
이렇게 하면 동시 실행 상황에서 연결 설정 비용을 낮게 유지할 수 있습니다.
let client = GreeterClient::new(channel);
let mut c1 = client.clone();
let mut c2 = client.clone();
// use c1 and c2 in separate tokio tasks빠른 확인
tonic에서 단일 요청 클라이언트 호출의 결과를 어떻게 읽나요?
복습
생성된 클라이언트를 연결하고, 단일 요청 호출을 수행하고, Status 오류를 처리하고, 구성된 채널을 만들고, 메타데이터를 보내고, 기한을 설정하고, 서버 및 클라이언트 스트림을 소비하고, TLS를 활성화하고, 복제 비용이 낮은 클라이언트를 재사용했습니다.
이제 tonic 기반 gRPC 서비스를 처음부터 끝까지 완성할 수 있습니다.
자주 묻는 질문
“gRPC 클라이언트에서 호출하기” 강의는 무료인가요?
네 — “gRPC 클라이언트에서 호출하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.
“gRPC 클라이언트에서 호출하기”에서 뭘 배우나요?
서비스를 사용해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“gRPC 클라이언트에서 호출하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Protobuf와 서비스 정의
- tonic-build로 코드 생성하기
- gRPC 서버 구현하기
- gRPC 클라이언트에서 호출하기