개념
gRPC는 구글에서 만든 고성능 원격 함수 호출(RPC) 프레임워크임.
RPC(Remote Procedure Call)는 다른 프로세스 / 다른 서버에 있는 함수를 내 코드에서 함수 호출하듯 부르는 기술
통신의 흐름은 아래와 같음
Client.SayHello(request)
↓
네트워크 (HTTP/2 + Protobuf)
↓
Server.SayHello(request)
↓
응답 반환
gRPC의 구성 요소
1. Proto
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
- 서버/클라이언트 공통 계약
- 언어 독립
- 컴파일 시 코드 자동 생성
2. Service (서버)
public override Task<HelloReply> SayHello(...)
- 실제 로직 구현
- 클라이언트 호출 시 자동 실행
3. Client Stub
var reply = await client.SayHelloAsync(request);
- 네트워크 코드 ❌
- 그냥 함수 호출처럼 보임
gRPC에서 사용되는 기술들
| HTTP/2 | 다중 스트림, 저지연 |
| Protobuf | 바이너리, 작고 빠름 |
| Code Gen | 반복 코드 제거 |
| Streaming | 실시간 통신 가능 |
종류
1. ASP.NET Core gRPC
- HTTP/2
- HTTPS 기본
- Kestrel 사용
- 최신 .NET 권장
- 클라우드/웹 친화적
2. Grpc.Core (C-core 기반) gRPC
- 순수 gRPC 서버
- IP:PORT 직접 바인딩
- HTTPS ❌
- 내부적으로 HTTP/2 + TCP
=> 게임 서버나 내부망 등의 보안이 필요없는 환경이나 C++/Unity /Unreal 언어와 연동 등에 활용됨.
이번에는 ASP.NET Core gRPC 예제 프로젝트 연습 진행하고 다음 글에서 Grpc.Core (C-core 기반) gRPC 진행
Visual Studio 2026에서 프로젝트 생성만 하면 서버는 자동으로 갖춰짐.


.Net 8 선택

이렇게 프로젝트를 생성하면 GrpcService1이라는 서버쪽 코드가 완성됨.
컴파일 해보면 콘솔이 나오면서 Server가 Listening 상태가 되면 정상.
되고 나면 정상적으로 연결되는지 체크해줘야 되니 GrpcClient라는 프로젝트 추가 생성
Protos 폴더 생성해서 안에 greet.proto라고 GrpcService1 프로젝트의 Proto 와 동일하게 만들어주고
Client 프로젝트에 아래 Nuget들 추가해줘야 함.
Grpc.Net.Client
Google.Protobuf
Grpc.Tools


Program.cs에는 하기처럼 작성
using Grpc.Net.Client;
using GrpcService1; // proto의 csharp_namespace
var channel = GrpcChannel.ForAddress("https://localhost:7018");
var client = new Greeter.GreeterClient(channel);
var tasks = new[]
{
client.SayHelloAsync(new HelloRequest { Name = "Client1" }).ResponseAsync,
client.SayHelloAsync(new HelloRequest { Name = "Client2" }).ResponseAsync,
client.SayHelloAsync(new HelloRequest { Name = "Client3" }).ResponseAsync
};
var replies = await Task.WhenAll(tasks);
foreach (var reply in replies)
{
Console.WriteLine(reply.Message);
}
Console.ReadLine();
// grpc 호출은 무조건 비동기 방식! 아래처럼 동기방식으로 호출하면 네트워크 호출이 끝나기 전에 반환되서 예외/완료 처리가 애매해짐
// 그래서 .Net gRPC에서는 비동기 호출을 권장
//var reply2 = client.SayHello(
// new HelloRequest { Name = "ConsoleClient2" });
//Console.WriteLine(reply2.Message);
//Console.ReadLine();
Proto는 Protos 폴더 아래에 기존 GrpcService1 프로젝트 내용과 동일하게 추가
프로젝트 파일 편집을 열어주고

아래 내용 추가
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>

전체 프로젝트 구성은 아래처럼


이렇게만 하면 클라이언트 측에서 통신에 성공하거나 접속했을 때 서버측에서 알 수가 없음.
GrpcService1 프로젝트의 GreeterService.cs 파일의 SayHello 함수 아래처럼 수정
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
_logger.LogInformation("SayHello called. Name={Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
저렇게 수정 후 다시 컴파일하면 아래처럼 2개의 콘솔 창이 나옴.

다음 글은 Grpc.Core (C-core 기반) gRPC 연습 예정
'Project' 카테고리의 다른 글
| [Project] STM32를 활용한 엘리베이터 만들기 (0) | 2024.02.07 |
|---|---|
| [Project] STM32를 활용한 세탁기 만들기 (0) | 2024.02.07 |
| [Project] 불완전하게 분리수거 된 재활용품에 대한 최종분류 시스템 (0) | 2024.02.07 |
| [Project] 영상처리 라이브러리를 활용한 프로그램 만들기 (0) | 2024.02.07 |
| [Project] 자동차 번호판 ROI 크롭 후 OCR로 텍스트 출력하기 (0) | 2024.01.30 |