gRPC는 모든 환경에서 실행할 수 있도록 Google이 만든 최신 오픈소스 RPC 프레임워크이다. 대부분 언어와 플랫폼을 지원한다. 무엇보다 경량이며 Protobuf binary serialization 통해 네트워크 사용량을 감소하도록 한다. WCF(XML WebServices), WebAPI를 사용해 본 개발자라면 더 쉽게 접근할 수 있다. 기본적으로 gRPC는 구조화된 데이터를 직렬화하기 위해 Protocol Buffers를 사용한다. 확장자가 ‘.proto’인 일반텍스트 파일에 name-value 행태의 논리적 레코드를 작성한다.
사용법은 Intro to gRPC in C# - How To Get Started 동영상 강좌를 보거나 Microsoft의 gRPC 소개 문서를 참고한다. 이번 글에서는 사용법보다는 리눅스 서버와 윈도우 클라이언트로 개발할 때 SSL/TLS 이슈를 정리하였다. 기본 예제가 ‘https’로 대부분 되어있는데 ‘http’로 서버를 설정하고 콘솔 클라이언트에서 데이트를 호출하였다. 아래 소스는 Visual Studio 2019, .NET Core 3.0 - gRPC 프로젝트에서 기본 생성한 예제를 그대로 사용하였다.
Microsoft의 .NET Core 팀은 인기 있는 라이브러리인 Json.NET(Newtonsoft)을 제거하고 새로운 Json 라이브러리인 System.Text.Json(네임스페이스)을 추가하였다. 아래는 이를 활용한 간단한 기본 예제이다.
// 기본 사용법
class Student{}
JsonSerializer.Serialize(Student.GetList(), options);
JsonSerializer.Deserialize<List<Student>>(jsonString, options);
아래는 콘솔 모드에서 작성한 전체 소스이다.
WPF-MVVM 방식에 있어서 ICommand는 필수요소인 데 일반적으로 xaml의 Element(Button, TextBox 등)와 연결된 명령 동작의 이벤트를 처리한다. 우선 ICommand를 상속받은 RelayCommand 클래스를 만들고 ViewModel에서 이를 활용한다. 아래의 소스는 RelayCommand 클래스와 이를 활용한 이벤트 처리 예제이다.
<!-- <Fluent:Button Header="프로그램 종료" Command="{Binding TestCommand}" CommandParameter="{Binding ElementName=TestButton, Path=Header}" x:Name="TestButton"/> -->
<Fluent:Button Header="프로그램 종료" Command="{Binding TestCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" x:Name="TestButton"/>
// ViewModel: Binding Path에 따라 object -> string
public ICommand TestCommand => new RelayCommand<object>(TestRun, TestCheck);
private void TestRun(object x)
{
MessageBox.Show((x as Button).Name);
}
private bool TestCheck(object x)
{
return x is Button;
}