본문 바로가기

더 나은 엔지니어가 되기 위해/라이브러리 리뷰

간단한 gRPC 파이썬 앱 만들고, Kreya로 테스트 해보기

gRPC나 Kreya나 각각의 공홈에 매우 잘 설명되어 있지만... 본인의 까먹 방지용으로 남겨둔다...

gRPC 사용하는 서버 작성하기

gRPC 라이브러리 설치

다음처럼 grpcio 를 설치해준다.

$ poetry add "grpcio"

Grpc 관련 유틸리티 도구를 제공하는 grpcio-tools 도 설치한다. 개발하는 과정에서만 사용하기 때문에 개발 라이브러리로 설치한다

$ poetry add "grpcio-tools" -D

참고로 여기서 사용한 파이썬 버전 및 라이브러리 버전은 다음과 같다.

$ python -V                                                                           
Python 3.9.7

$ pip list | grep grpcio                 
grpcio       1.42.0
grpcio-tools 1.42.0

Proto 작성

이제 다음처럼 프로젝트 내에 protos 폴더를 만들어 helloworld.proto 에 프로토 파일을 작성한다.

// protos/helloworld.proto

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

파이썬 파일 생성

이제 터미널에서 protos/ 경로로 들어간 뒤 다음 명령어로 프로토 파일을 파이썬으로 빌드한다.

$ cd protos
$ python -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. helloworld.proto

실행이 완료되면 다음처럼 helloworld_pb2.pyhelloworld_pb2_grpc.py 가 생겨있다.

$ tree .
.
├── helloworld.proto
├── helloworld_pb2.py
└── helloworld_pb2_grpc.py

이 때 helloworld_pb2_grpc.py 를 열어 import 구문을 다음처럼 프로제트 루트 기준 경로로 수정해주자. (이걸 안해주면 import 에러가 난다.)

# helloworld_pb2_grpc.py

# as-is
import helloworld_pb2 as helloworld__pb2

# to-be
from protos import helloworld_pb2 as helloworld__pb2
.proto -> .py 생성 시, 생성되는 python 파일의 import 문의 상대 경로로 작성되는게 여전히 바뀌지 않았다고 한다... 관련 이슈는 여기

구체 Servicer 클래스 작성

helloworld_pb2_grpc.py 내에 있는 GreeterServicer 는 아직 구현된 상태가 아니고, .proto 파일 내 service 의 시그니처만 작성되있다. GreeterServicer 를 구체적으로 구현하는 것은 개발자의 몫이다.

다음처럼 api.py 를 만들어 이 클래스를 상속받아 구현하자.

# api.py

from protos import helloworld_pb2_grpc, helloworld_pb2


class GreeterServicer(helloworld_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        print("GreeterServicer.Sayhello() was called !")
        return helloworld_pb2.HelloReply(
            message=f"hello {request.name}"
        )

gRPC 서버 코드 작성

이제 서버를 기동하는 코드를 작성해보자. main.py 를 만들어 다음처럼 gRPC 서버 코드를 작성한다.

# main.py

from concurrent import futures

import grpc

from api import GreeterServicer
from protos import helloworld_pb2_grpc


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(servicer=GreeterServicer(), server=server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()


if __name__ == "__main__":
    serve()

전체 프로젝트 구조

프로젝트 구조와 구성은 다음과 같다.

$ tree .
.
├── api.py
├── main.py
├── poetry.lock
├── protos
│   ├── helloworld.proto
│   ├── helloworld_pb2.py
│   └── helloworld_pb2_grpc.py
└── pyproject.toml

서버 실행

다음처럼 main.py 를 실행한다

$ python main.py

Kreya로 gRPC 통신 테스트해보기

Kreya는 gRPC GUI 클라이언트다. REST 통신에는 Postman이 있듯이.. 뭐 그런 역할 하는 애라고 보면 된다.

Kreya 공식 홈페이지

공홈 https://kreya.app/ 에서 다운받을 수 있다.

Project 세팅하기

Kreya를 실행하면 처음에 다음과 같은 화면이 등장한다.

Create project 버튼을 누르고, 다음처럼 프로젝트를 저장할 정보를 작성하자.

다 작성했으면 Create 버튼을 누른다. 그러면 이제 다음과 같은 화면이 등장한다.

우리는 .proto 파일을 직접 입력할거다. 첫번째 라디오 버튼을 클릭한 뒤 Proto files 에 다음처럼 프로젝트의 protos 경로를 주자.

Save 하고 나면 다음처럼 gRPC 서비스와 메시지가 왼쪽 탭에 등장한다.

엔드포인트 설정하기

Greeter 디렉토리를 클릭하면 위와 같이 Directory settings 화면이 등장하는데, 여기서 다음처럼 Endpoint 를 현재 떠있는 gRPC 서버로 작성해주자.

Server certifiacate validationDisabled 로 설정한다.

메시지 보내기

이제 마지막이다. 왼쪽의 SayHello 를 누른 뒤, 적당히 메시지 값을 채워주고 위쪽의 Send 버튼을 누른다. 그럼 다음처럼 결과가 잘 나오는 것을 볼 수 있다.

참고

'더 나은 엔지니어가 되기 위해 > 라이브러리 리뷰' 카테고리의 다른 글

Commitizen으로 커밋, 버전 관리하기  (6) 2021.05.22
Feast - Quick Review  (0) 2021.05.15
Prefect - Quick Review  (3) 2021.05.09
MLflow - MLflow Projects  (2) 2021.05.08
MLflow - Models  (0) 2021.05.08