ASP.NET Core 기반 gRPC 서버-클라이언트 구축 실습

gRPC란?

Google이 공개한 고성능·범용 RPC 프레임워크로, HTTP/2를 전송 계층으로 사용하고 Protocol Buffers(이하 Protobuf)로 데이터를 직렬화한다. 언어·플랫폼을 넘나드는 통신을 단순화해 마이크로서비스, 실시간 스트리밍, 멀티플랫폼 API 등에 널리 쓰인다.

성능·적합성 요약

  • 적합 : 낮은 지연·높은 처리량이 필요한 마이크로서비스, 다언어 혼합 환경, 양방향 스트리밍, 대역폭 제약 환경
  • 부적합 : 브라우저 직접 호출(일부 브라우저만 gRPC-Web 지원), 브로드캐스트·IPC 대체 수단

ASP.NET Core gRPC 서버 만들기

1. 프로젝트 생성

Visual Studio 2022(또는 dotnet CLI)에서 "gRPC 서비스" 템플릿 선택 후 .NET 6 이상으로 생성한다.

2. 핵심 파일 살펴보기

// greet.proto
syntax = "proto3";

option csharp_namespace = "Demo.Grpc";

package greet;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
  • Protos\greet.proto : Protobuf IDL. 빌드 시 Greeter.GreeterBase 추상 클래스가 obj\Debug\net6.0\ 아래 자동 생성된다.
  • GreeterService.cs : 실제 구현체
    public sealed class GreeterService : Greeter.GreeterBase
    {
        public override Task<HelloReply> SayHello(
            HelloRequest request, ServerCallContext ctx)
        {
            return Task.FromResult(new HelloReply
            {
                Message = $"안녕하세요, {request.Name}!"
            });
        }
    }
    
  • Program.cs : Kestrel이 HTTP/2만 듣도록 설정, gRPC 서비스를 엔드포인트 라우팅에 추가
    builder.WebHost.ConfigureKestrel(o => o.ConfigureEndpointDefaults(lo => lo.Protocols = HttpProtocols.Http2));
    builder.Services.AddGrpc();
    app.MapGrpcService<GreeterService>();
    

콘솔 클라이언트 작성

  1. 새 .NET 6 콘솔 프로젝트 생성
  2. NuGet 패키지 설치
    dotnet add package Grpc.Net.Client
    dotnet add package Google.Protobuf
    dotnet add package Grpc.Tools
    
  3. 서버의 greet.proto를 클라이언트 프로젝트에 링크
    <ItemGroup>
      <Protobuf Include="..\Server\Protos\greet.proto" GrpcServices="Client" Link="Protos\greet.proto" />
    </ItemGroup>
    
  4. 호출 코드
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(new HelloRequest { Name = "gRPC" });
    Console.WriteLine(reply.Message);
    

동시 실행 설정

솔루션 속성 → "다중 시작 프로젝트" → Server, Client 모두 시작으로 지정하면 디버깅 시 한 번에 띄울 수 있다.

공통 Protobuf 관리

각 프로젝트마다 .proto 복사를 피하려면 솔루션 루트에 SharedProtos 폴더를 만들고 와일드카드를 사용한다.

<ItemGroup>
  <Protobuf Include="..\SharedProtos\*.proto"
            GrpcServices="Server"  Link="Protos\%(Filename)%(Extension)" />
</ItemGroup>

클라이언트는 GrpcServices="Client"로 동일하게 지정하면 유지보수 포인트가 하나로 줄어든다.

테스트·도구

Postman 9+ 및 Swagger(OpenAPI 3.1 변환기)에서 gRPC 스키마를 임포트해 요청·응답을 즉시 확인할 수 있다.

태그: gRPC ASP.NET Core Protocol Buffers HTTP/2 microservices

9월 5일 12:16에 게시됨