0Pricing
C# Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. gRPC와 Protobuf 기초
  2. 단항 및 서버 스트리밍 RPC
  3. 클라이언트와 양방향 스트리밍
  4. 기한, 취소와 인터셉터
← C# Academy(으)로 돌아가기