gRPC를 사용하여 클라이언트-서버 애플리케이션 빌드

gRPC는 어떤 환경에서도 실행할 수 있는 최신 오픈소스의 고성능 RPC 프레임워크입니다. 부하 분산, 추적, 상태 확인 및 인증을 위한 플러그형 지원을 통해 데이터 센터 내부 및 데이터 센터 간에 서비스를 효율적으로 연결할 수 있습니다. 또한 라스트 마일(Last Mile)의 분산 컴퓨팅에서 기기, 모바일 애플리케이션 및 브라우저를 백엔드 서비스에 연결하는 데도 적용할 수 있습니다. 개발자는 gRPC 공식 웹사이트에서 문서를 찾고 오픈소스 커뮤니티의 지원을 받을 수 있습니다. 이 가이드에서는 gRPC를 사용하여 Android 앱을 빌드하는 솔루션을 소개합니다.

grpc.io는 gRPC 프로젝트의 공식 웹사이트입니다. gRPC의 작동 방식에 관한 자세한 내용은 gRPC란 무엇인가요?gRPC 개념을 참조하세요. Android 앱에서 gRPC를 사용하는 방법은 gRPC Android 자바 빠른 시작의 Hello World 예를 참조하세요. 또한 GitHub에서 몇 가지 다른 gRPC Android 예도 찾아볼 수 있습니다.

기능

프로시저 호출로 간편성 제고
gRPC는 RPC이기 때문에 프로그래밍 모델은 프로시저 호출입니다. 기술의 네트워킹 측면은 애플리케이션 코드에서 추상화되어 거의 일반적인 프로세스 내 함수 호출처럼 보입니다. 클라이언트-서버 상호작용은 HTTP 리소스 메서드(예: GET, PUT, POST, DELETE)의 의미 체계에 의해 제약을 받지 않습니다. REST API와 비교했을 때 HTTP 프로토콜 메타데이터를 처리할 필요가 없으므로 구현이 더 자연스러워 보입니다.
HTTP/2를 통한 효율적인 네트워크 전송
휴대기기에서 백엔드 서버로 데이터를 전송하는 작업은 리소스를 매우 많이 사용하는 프로세스일 수 있습니다. 표준 HTTP/1.1 프로토콜을 사용하면 휴대기기에서 클라우드 서비스로 자주 연결되므로 배터리가 소모되고 지연 시간이 증가하며 다른 앱의 연결이 차단될 수 있습니다. 기본적으로 gRPC는 HTTP/2를 기반으로 실행되며 양방향 스트리밍, 흐름 제어, 헤더 압축 및 단일 TCP/IP 연결을 통한 요청 멀티플렉싱 기능을 제공합니다. 결과적으로 gRPC는 리소스 사용량을 줄여서 클라우드에서 실행되는 앱과 서비스 간의 응답 시간을 단축하고 네트워크 사용량을 줄이며 휴대기기에서 실행되는 클라이언트의 배터리 수명을 늘릴 수 있습니다.
내장 스트리밍 데이터 교환 지원
gRPC는 처음부터 HTTP/2의 전이중 양방향 스트리밍 지원을 염두에 두고 설계되었습니다. 스트리밍을 통해 요청 및 응답이 대량의 정보를 업로드하거나 다운로드해야 하는 작업과 같이 임의의 대규모 작업으로 실행될 수 있습니다. 스트리밍을 통해 클라이언트 및 서버는 메시지를 동시에 읽고 쓸 수 있으며 리소스 ID를 추적하지 않고도 서로 구독할 수 있습니다. 이렇게 하면 앱을 더욱 유연하게 구현할 수 있습니다.
프로토콜 버퍼와의 원활한 통합
gRPC는 Android용으로 최적화된 codegen 플러그인(Protobuf Java Lite)과 함께 프로토콜 버퍼(Protobuf)를 직렬화/역직렬화 방법으로 사용합니다. 텍스트 기반 형식(예: JSON)과 비교했을 때 Protobuf는 마샬링 속도 및 코드 크기 측면에서 더 효율적인 데이터 교환을 제공하므로 모바일 환경에서 사용하기에 더 적합합니다. 또한 Protobuf의 간결한 메시지/서비스 정의 구문을 사용하면 앱의 데이터 모델 및 애플리케이션 프로토콜을 훨씬 더 쉽게 정의할 수 있습니다.

사용 개요

gRPC 기초 - Android 자바 가이드에 따라 Android 앱에 gRPC를 사용하려면 다음 네 단계가 필요합니다.

  • 프로토콜 버퍼로 RPC 서비스를 정의하고 gRPC 클라이언트 인터페이스를 생성합니다.
  • 클라이언트와 서버 간 RPC 호출을 위한 매체 역할을 하는 채널을 빌드합니다.
  • 클라이언트 측에서 RPC 호출을 시작하기 위한 진입점으로 클라이언트 스터브를 만듭니다.
  • 로컬 프로시저 호출을 실행할 때와 같이 원격 서버를 RPC 호출합니다.

시연을 위해 제공된 예에서 바이트는 일반 텍스트로 전송됩니다. 그러나 앱은 프로덕션 환경에서 항상 네트워크 데이터를 암호화해야 합니다. gRPC는 SSL/TLS 암호화 지원은 물론 인증을 위한 OAuth 토큰(Google 서비스의 OAuth2) 교환을 제공합니다. 자세한 내용은 Android의 TLSOAuth2 사용을 참조하세요.

전송

gRPC는 Android 클라이언트를 위한 두 가지 전송 구현 옵션인 OkHttp 및 Cronet을 제공합니다.

전송 선택(고급)

  • OkHttp
    OkHttp는 모바일에서 사용하도록 설계된 경량 네트워킹 스택입니다. Android 환경에서 실행하기 위한 gRPC의 기본 전송입니다. OkHttp를 앱의 gRPC 전송으로 사용하려면 AndroidChannelBuilder로 채널을 구성하세요. 이 빌더는 OkHttpChannelBuilder를 래핑하고 Android OS에 네트워크 모니터를 등록하여 네트워크 변경에 신속하게 대응합니다. 사용 예는 gRPC-Java AndroidChannelBuilder에서 찾아볼 수 있습니다.
  • Cronet(실험용)
    Cronet은 모바일용 라이브러리로 패키징된 Chromium의 네트워킹 스택입니다. 최신 QUIC 프로토콜로 강력한 네트워킹 지원을 제공하므로 신뢰할 수 없는 네트워크 환경에서 특히 효과적입니다. Cronet에 관한 자세한 내용은 Cronet을 사용하여 네트워크 작업 실행을 참조하세요. Cronet을 앱의 gRPC 전송으로 사용하려면 CronetChannelBuilder로 채널을 구성하세요. 사용 예는 gRPC-자바 Cronet 전송에 나와 있습니다.

일반적으로 말하면 최신 SDK 버전을 타겟팅하는 앱은 Cronet을 사용하는 것이 좋습니다. Cronet은 더 강력한 네트워크 스택을 제공하기 때문입니다. Cronet 사용의 단점은 APK 크기가 증가한다는 점입니다. 바이너리 Cronet 종속성을 추가하면 OkHttp의 ~100KB와 대비해서 >1MB의 앱 크기가 증가되기 때문입니다. GMSCore v.10부터 Google Play 서비스에서 최신 버전의 Cronet을 로드할 수 있습니다. 최신 GMSCore가 설치되지 않은 기기는 여전히 OkHttp 사용을 선호할 수 있지만 APK 크기는 더 이상 문제가 되지 않을 수 있습니다.