gRPC와 Protobuf 기초
.proto 파일에 서비스 계약을 정의하고 Grpc.Tools로 C# 코드를 생성하며 gRPC 전송을 이해합니다.
gRPC와 Protobuf 기초은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
gRPC란 무엇입니까
gRPC는 구글이 개발한 고성능의 언어 독립적인 RPC 프레임워크입니다. 전송에 HTTP/2를 사용하고 직렬화 형식으로 프로토콜 버퍼를 사용하므로 HTTP/1.1을 통한 JSON보다 훨씬 빠르고 용량이 작습니다.
프로토콜 버퍼: IDL
.proto 파일에 서비스 계약을 정의합니다. 프로토콜 버퍼 IDL(인터페이스 정의 언어)은 강력한 형식 지정과 언어 중립성을 지원하므로, 같은 파일에서 C#, Go, Python 등의 클라이언트 및 서버 코드를 생성할 수 있습니다.
// greet.proto
syntax = "proto3";
option csharp_namespace = "GrpcService";
package greet;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}.NET에서 gRPC 서버 설정하기
dotnet new grpc로 gRPC 프로젝트를 만듭니다. 프로젝트에 .proto 파일을 추가하면 Grpc.Tools가 빌드 시 C# 클래스를 자동으로 생성합니다.
// .csproj snippet
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
// Program.cs
builder.Services.AddGrpc();
var app = builder.Build();
app.MapGrpcService<GreeterService>();
app.Run();gRPC 서비스 구현하기
생성된 기본 클래스에서 상속하고 RPC 메서드를 재정의합니다. 프레임워크가 직렬화, HTTP/2 프레이밍 및 라우팅을 자동으로 처리합니다.
using Grpc.Core;
using GrpcService;
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger) => _logger = logger;
public override Task<HelloReply> SayHello(
HelloRequest request,
ServerCallContext context)
{
_logger.LogInformation("Saying hello to {Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = $"Hello, {request.Name}!"
});
}
}gRPC 클라이언트 만들기
프로토콜 버퍼 컴파일러는 강력한 형식의 클라이언트 클래스도 생성합니다. GrpcChannel을 사용하여 연결하고 로컬 메서드를 호출하듯 서비스를 호출합니다.
// Client project: add Grpc.Net.Client package
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
new HelloRequest { Name = "Alice" });
Console.WriteLine(reply.Message); // Hello, Alice!프로토콜 버퍼 형식과 필드 번호
프로토콜 버퍼 메시지의 각 필드에는 고유한 필드 번호(1–536870911)가 있습니다. 필드 번호는 바이너리 형식으로 인코딩되므로, 배포한 후에는 이전 버전과의 호환성이 깨지지 않도록 절대 변경하지 마십시오.
message Product {
int32 id = 1;
string name = 2;
double price = 3;
int32 stock = 4;
bool is_active = 5;
repeated string tags = 6; // array
}
// Supported scalar types:
// int32, int64, uint32, uint64, float, double
// bool, string, bytes, enum열거형과 중첩 메시지
프로토콜 버퍼는 열거형과 중첩 메시지 형식을 지원합니다. 이를 사용하여 서비스 계약에서 복잡한 도메인 객체를 모델링할 수 있습니다.
enum OrderStatus {
ORDER_STATUS_UNSPECIFIED = 0;
ORDER_STATUS_PENDING = 1;
ORDER_STATUS_SHIPPED = 2;
ORDER_STATUS_CANCELLED = 3;
}
message Order {
int32 id = 1;
OrderStatus status = 2;
repeated OrderLine lines = 3;
}
message OrderLine {
int32 product_id = 1;
int32 quantity = 2;
double price = 3;
}HTTP/2와 gRPC 전송
gRPC는 다중화를 지원하는 HTTP/2를 사용합니다. 하나의 TCP 연결에서 여러 RPC 호출을 동시에 처리하므로 HTTP/1.1에 비해 지연 시간과 연결 오버헤드를 줄일 수 있습니다.
// gRPC requires HTTP/2
// For local dev with HTTP (not HTTPS), enable HTTP/2 cleartext:
builder.WebHost.ConfigureKestrel(opt =>
opt.ListenLocalhost(5000, o => o.Protocols = HttpProtocols.Http2));
// Client for cleartext (dev only)
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
using var channel = GrpcChannel.ForAddress("http://localhost:5000");StatusCode를 사용한 오류 처리
gRPC는 HTTP와 다른 자체 상태 코드를 사용합니다. Status와 함께 RpcException을 발생시켜 형식이 지정된 오류 응답을 클라이언트에 보냅니다.
public override Task<ProductReply> GetProduct(
ProductRequest request,
ServerCallContext context)
{
var product = _repo.FindById(request.Id);
if (product is null)
throw new RpcException(
new Status(StatusCode.NotFound, $"Product {request.Id} not found"));
return Task.FromResult(MapToReply(product));
}개발을 위한 gRPC 리플렉션
gRPC 리플렉션을 활성화하면 grpcurl 및 Postman과 같은 도구가 .proto 파일에 직접 액세스하지 않고도 서비스를 검색할 수 있습니다.
// dotnet add package Grpc.AspNetCore.Server.Reflection
builder.Services.AddGrpcReflection();
if (app.Environment.IsDevelopment())
app.MapGrpcReflectionService();
// Now use grpcurl:
// grpcurl -plaintext localhost:5000 list
// grpcurl -plaintext localhost:5000 greet.Greeter/SayHello실전: 마이크로서비스 제품 조회
주문 서비스가 내부적으로 사용하는 gRPC 엔드포인트를 제공하는 제품 서비스로, 서비스 간 통신의 전형적인 패턴입니다.
// product.proto
service ProductService {
rpc GetProduct (GetProductRequest) returns (ProductResponse);
rpc ListProducts (ListProductsRequest) returns (ListProductsResponse);
}
// Order service calls it:
public class OrderService
{
private readonly ProductService.ProductServiceClient _products;
public OrderService(ProductService.ProductServiceClient p) => _products = p;
public async Task<Order> PlaceOrderAsync(int productId, int qty)
{
var product = await _products.GetProductAsync(
new GetProductRequest { Id = productId });
return new Order { ProductName = product.Name, Quantity = qty };
}
}확인 문제
배포한 후 기존 프로토콜 버퍼 필드 번호를 절대 변경하면 안 되는 이유는 무엇입니까?
복습: gRPC 및 프로토콜 버퍼 기본 사항
핵심 요점:
- gRPC는 빠르고 강력한 형식의 서비스 간 통신을 위해 HTTP/2와 프로토콜 버퍼를 사용합니다
.proto파일에 서비스 계약을 정의하고 빌드 시 코드를 생성합니다- 필드 번호는 와이어 인코딩에 사용되므로 절대 변경하거나 재사용하지 않습니다
- 생성된 기본 클래스에서 상속하고 RPC 메서드를 재정의합니다
- 형식이 지정된 오류 응답에는 RpcException과 StatusCode를 사용합니다
- 개발 환경에서 도구를 지원할 수 있도록 gRPC 리플렉션을 활성화합니다
자주 묻는 질문
“gRPC와 Protobuf 기초” 강의는 무료인가요?
네 — “gRPC와 Protobuf 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“gRPC와 Protobuf 기초”에서 뭘 배우나요?
.proto 파일에 서비스 계약을 정의하고 Grpc.Tools로 C# 코드를 생성하며 gRPC 전송을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“gRPC와 Protobuf 기초” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- gRPC와 Protobuf 기초
- 단항 및 서버 스트리밍 RPC
- 클라이언트와 양방향 스트리밍
- 기한, 취소와 인터셉터