본문 바로가기
Project

[gRPC] gRPC 이해 및 ASP.NET Core gRPC 예제 연습

by TYB 2025. 12. 15.
반응형

개념

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>

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

한 솔루션 안에 프로젝트 2개 배치

 

 

 

 

이렇게만 하면 클라이언트 측에서 통신에 성공하거나 접속했을 때 서버측에서 알 수가 없음.

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개의 콘솔 창이 나옴.

좌측 콘솔창이 서버측임. 통신 연결이 되면 로그를 남기게 해놓음. 우측 콘솔창이 클라이언트 측. 예시로 3가지 종류의 서버를 연결하도록 함.

 

다음 글은 Grpc.Core (C-core 기반) gRPC 연습 예정

반응형