안드로이드/서버 gRPC 예제 따라하기(주의할 점)

안녕하세요. gRPC에 대해 공부하면서 배운점을 간단히 정리하고자 합니다.

 

gRPC에서 RPC는 Remote Procedure Call의 약자로서 말 그대로.. 멀리 떨어진 함수?를 부르는 것을 의미합니다. RPC는 아주 다양한 분야에서 사용되는 용어입니다. 서로 다른 프로세스의 함수를 부를 때도 RPC라고 하는데 gRPC는 웹 개념에 적용되는 것 같습니다. 즉 서버와 클라이언트가 있고 서로 통신을 할 때 쓰이는 것 같아요. 앞에 g가 붙은 이유는 초기에 구글에 의해 개발되서 그런 것 같습니다.

 

저는 Go 언어를 한 번 배워보고 싶어 아래의 공식 홈페이지에서 Go 언어로 된 가이드를 봤습니다.

 

grpc.io/docs/languages/go/quickstart/

 

Quick start

This guide gets you started with gRPC in Go with a simple working example.

grpc.io

저는 실제 서버에서 테스트를 해보고 싶었습니다. 그래서 cafe24에서.. 가장 싼 요금으로 서버를 만들었습니다. 그런데 생각해보니 cafe24는 제약사항이 많아서.. root 권한도 획득이 불가능합니다. ㅜㅜ..

정신을 가다듬고 aws lightsail 가장 싼 서버 인스턴스를 생성했습니다.

 

putty로 서버에 접속해 Go, Protocol buffer, Go plugins를 설치해야 합니다.

그런데 Protocol buffer를 설치하고 버전을 확인해보니 2.x버전이 나오는 경우가 있더라구요. 아마 LAMP 서버의 버전에 영향을 받는 것 같습니다. 저는 LAMP 7.4.7 버전에서 테스트 하니 Protocol buffer가 잘 설치됐습니다.

 

그리고 서버에서

git clone https://github.com/grpc/grpc-go

명령어를 이용해 grpc 예제 코드를 다운 받습니다.

 

가이드대로 서버쪽 helloword를 실행 합니다. 그러면 서버는 서비스를 실행을 위해 계속 대기 중인 상태가 됩니다.

putty를 하나 더 열어서 같은 서버에 접속한 후 client쪽 helloword를 실행합니다. 그러면 서로 통신이 잘 되는 것을 쉽게 확인할 수 있습니다.

 

이제 다음으로 해볼 것은 안드로이드 어플을 클라이언트로 사용하는 것입니다.

 

github.com/grpc/grpc-java/tree/master/examples/android/helloworld

 

grpc/grpc-java

The Java gRPC implementation. HTTP/2 based RPC. Contribute to grpc/grpc-java development by creating an account on GitHub.

github.com

 

위의 github에 관련 코드가 있습니다.

여기 코드를 참고하고.. gradle쪽은 적당히 수정한 것 같습니다.

 

여차여차해서 앱 구동에 성공했는데 잘 동작을 안했습니다.

서버쪽 코드를 좀 보니 port가 50051로 되어있더라구요. 그래서 포트도 제대로 넣고.. 서버 주소도 제대로 넣어봤습니다.

그래도 에러가 발생했습니다.

 

좀 생각을 해보니 서버에 50051 포트가 열려있나? 생각이 들었습니다. putty에서 같은 서버에서 통신을 할 때는 포트 제약이 없는 것 같은데 외부 서버와 통신을 할 때는 방화벽에 의해 특정 포트만 열려있는 것 같습니다.

실제로 aws lightsail 콘솔에 로그인해서 확인해보니 22, 80, 443 포트만 열려있더라구요. 규칙 추가 버튼을 눌러서 50051 포트도 열어줬습니다.

 

이렇게 하니 잘 되네요 ㅎㅎ

클라이언트 화면
서버쪽 화면

 

문제 해결

1. 안드로이드 앱에서 에러를 확인할 때 grpc FRAME_SIZE_ERROR 4740180 관련 에러가 보인다면 접속하려는 주소/포트를 잘 입력했는지 확인해보시길 바랍니다.

 

2. UNIMPLEMENTED: unknown service ****.Greeter가 뜬다면 서버쪽 helloworld.proto와 클라이언트 쪽의 helloworld.proto동일한지 확인해보시길 바랍니다.

 

proto파일의 pakcage와 service 이름이 합쳐져서 서비스를 구분하는 고유한 id가 되는 것 같습니다.

작성자

Posted by 드리머즈

관련 글

댓글 영역