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>();
콘솔 클라이언트 작성
- 새 .NET 6 콘솔 프로젝트 생성
- NuGet 패키지 설치
dotnet add package Grpc.Net.Client dotnet add package Google.Protobuf dotnet add package Grpc.Tools - 서버의
greet.proto를 클라이언트 프로젝트에 링크<ItemGroup> <Protobuf Include="..\Server\Protos\greet.proto" GrpcServices="Client" Link="Protos\greet.proto" /> </ItemGroup> - 호출 코드
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 스키마를 임포트해 요청·응답을 즉시 확인할 수 있다.