gRPC 튜토리얼

Yunes·2022년 6월 13일
1

gRPC

목록 보기
1/2
post-thumbnail

HTTP 프로토콜보다 속도가 빠른 gRPC를 시작하게 되면서 항상 느꼈던 것이지만 주로 RESTful API 를 사용하는 사람들이 많아 gRPC 에 대한 자료는 영어로 된 것이 대부분이었다. 그래서 gRPC를 활용하여 마이크로 서비스를 작업하고 있으나 이에 대해 한번 정리해보고 싶던 차에 이렇게 정리하게 되었다.

필자는 Golang 을 사용하고 있기에 Go 기준으로 gRPC 를 어떻게 사용하는지 정리해보겠다.

사실 Golang 도 하나도 몰랐고 gRPC가 무엇인지도 모르던 차에 사수분이 정말 친절하게 알려주시기도 했고 현업에서 사용되는 코드들을 계속 살피다가 gRPC를 사용하는데 조금씩 익숙해져가고 있기도 한데 문제는 이 코드들이 처음에 어떻게 시작되었는지를 모르는 부분이 마음에 걸렸었다. 그래서 gRPC.io 사이트를 통해 처음에 protobuf 파일을 어떻게 연습할 수 있을지 찾아보고 정리하게 되었다.

gRPC 튜토리얼(1) - route_guide.proto 컴파일

Go 에서 기본 튜토리얼을 클릭하면 예제코드를 가져올 수 있다.

(우선 이 글은 gRPC 가 무엇인지, protobuf 가 무엇인지 등에 대해서 기본적으로 어느정도 알고 있다는 전제하에 글이 작성되었음을 참고했으면 좋겠다.)

gRPC.io 공식 사이트 Go 튜토리얼

필자는 Intellij, Goland 를 사용하고 있는데 우선 Goland 기준으로 포스트를 작성하겠다.

새 프로젝트를 열고 터미널에 위의 <git clone -b v1.46.0 --depth 1 https://github.com/grpc/grpc-go> 을 실행한다.

그럼 예제 코드를 가져올 수 있고 현 위치를 예제 디렉토리로 이동한다. (튜토리얼 그대로 따라가는 중이다.)

그러면 이처럼 디렉토리에 grpc-go가 생기게 되는데 grpc-go/examples/route_guide/routeguide에 들어가 보면 route_guide.proto 파일을 볼 수 있다.

이 route_guide.proto 파일은 examples/route_guide 디렉터리에서 다음 명령을 실행하여 컴파일 할 수 있고

protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
routeguide/route_guide.proto

컴파일하게 되면 routeguide 디렉토리에 route_guide.proto 파일 외에 route_guide.pb.go 파일과 route_guide_grpc.pb.go 파일이 생성된다.

gRPC 튜토리얼(2) - protobuf 파일 활용

이제 .proto 파일을 얻었고, 이를 어떻게 컴파일하는지 알아보았다.

그럼 어떻게 사용하는가?

서비스 및 클라이언트 생성

.proto 파일은 1. service, 2. rpc, 3. message 로 구성된다.

서비스를 정의하려면 위 그림과 같이 route_guide.proto 파일에 이름을 지정한다.

그런뒤, rpc 에 함수명, request, response를 지정한다.

(gRPC 에서 client - server 간 통신엔 4가지 방식이 있으나 그중 Unary 방식에 대해서 서술하고 있다.)

여기서 request 와 respones 로 사용한 GetInfoRequest 와 GetInfoResponse 는 message 로 어떤 내용인지 표현한다.

정말 대략적으로 표시한 것이긴 한데 message 는 rpc 에서 request 와 response 에 어떤 정보들이 담길 것이니즐 표현한다고 보면 된다.

예를들어 JWT 토큰에 user_id 를 담는다고 해보자. 그럼 프론트엔드에선 토큰을 통해 어느 유저에 대한 정보를 백엔드에 요청한다. 프론트엔드가 유저에 대해 많은 정보를 모른다고 해도 rpc 를 통해 해당 함수를 원격으로 호출하면 request 에 user_id 가 담겨 있으니 이를 바탕으로 데이터베이스를 조회해서 GetInfoResponse 에 해당 유저의 정보를 찾고, 그 유저의 나이, 관심사 등에 대해 response 를 던지게 된다.

그럼 컴파일을 해보자.

protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
routeguide/route_guide.proto

컴파일이 제대로 되었다면 route_guide_grpc.pb.go, route_guide.pb.go 파일에 방금 추가한 rpc, message 가 반영된 것을 볼 수 있을 것이다. (이 ~grpc.pb.go, ~pb.go 파일은 protobuf 파일을 컴파일하면 자동으로 업데이트되는 파일들이니 수정할 필요 없다.)

서버 생성

동일 디렉터리 grpc-go/examples/route_guide/server/server.go 파일을 보자.

해당 디렉토리에서 코드를 쭉 살펴봐도 아까 추가한 rpc 가 보이지 않고 기본적으로 제공된 GetFeature, ListFeature, RecordRoute, RouteChat 만 보인다.

사실 당연한 것이다.

gRPC 는 스텁을 통해 파라미터를 마샬링, 언마샬링하여 binary 형태로 전환된 message 들을 통해 데이터를 주고받을 수 있는데 아까 .proto 파일에서는 어떤 정보들을 보낼 것인지 메서드명과 request, return 타입과 종류들을 정의한 것이라 새로 추가해줘야 한다.

따라서 위의 rpc 들을 따라 하단에 해당 메서드를 이렇게 추가할 수 있다.


이렇게 request, response 파라미터에 아까 message 에 추가한 GetInfoRequest, GetInfoResponse 를 쳐보면 컴파일이 제대로 반영되어 있음을 알 수 있다.

정리

백엔드단에선 프론트엔드단과 소통할때 어느 정보를 받아서 데이터베이스어떤 정보를 조회하여 어떤 정보를 넘겨줘야할지 파악하고 protobuf 파일을 설계한뒤, 해당 메서드를 서버에서 어떻게 구현할지 코딩을 하게된다. 이 protobuf를 통해 백엔드에서 Golang 을 사용해도 다른 백엔드와 연결할때 그쪽이 typescript 를 쓰든, python 을 쓰든 상관없이 데이터를 주고받을 수 있게 된다.

최대한 처음 gRPC 를 사용한다면 어떻게 해야 연습할 수 있을지에 대해 중점적으로 생각하며 포스팅을 작성하였는데 좀 두서없이 정리한 것 같은 느낌도 든다. 필자가 처음 gRPC 를 사용하며 대체 어떻게 실행해야 하나 막막했던 부분이 있어서 되도록 사진을 많이 첨부하려 했는데 차차 포스팅도 자연스레 쓸 수 있을것 같다.

gRPC의 개념에 대해선 추후 따로 포스팅을 새로 올릴 예정이다.

profile
미래의 나를 만들어나가는 한 개발자의 블로그입니다.

0개의 댓글