쿡앱스 기술지원팀에서 클라이언트 개발을 하고 있는 김태환입니다. 공통모듈 개발, 기술 R&D 및 프로파일링 등 클라이언트 Unity 개발을 지원하는 업무를 하고 있습니다. 최근 쿡앱스에서는 REST API 대신 gRPC를 점차 도입하고 있습니다. 이러한 배경을 공유하고 쿡앱스에서는 gRPC를 어떻게 사용하는지 설명하고자 합니다.
왜 gRPC를 사용했나요?
gRPC는 구글에서 개발한 Remote Procedure Call 시스템입니다. 앞 글자 g는 구글을 뜻하죠. 이 gRPC를 채택한 이유는 크게 4가지입니다.
작은 사이즈: gRPC는 Protocol Buffer를 사용하여 데이터를 바이너리 형식으로 직렬화하기 때문에 JSON보다 데이터 크기가 작습니다.
빠른 속도: HTTP/2 프로토콜을 이용하므로, 성능이 개선되고 네트워크 지연 시간이 줄어듭니다.
자동 코드 생성: .proto 파일을 기반으로 클라이언트와 서버 코드를 자동 생성하여 휴먼 에러를 방지할 수 있습니다.
보안: 바이너리 형식이기 때문에 사람에게 직접적으로 읽힐 수 없고, proto 파일이 없다면 해석이 불가능합니다.
저희는 gRPC를 채택하면서 workflow 표준화를 시도했습니다. 왜냐하면 기존 쿡앱스에서는 각 스튜디오, 프로젝트별로 REST API를 사용하는 방식이 달랐고, 서버 언어도 통일되지 않았습니다. 그래서 데이터를 관리하는 방법을 매번 고민해야 했습니다.
gRPC를 통한 workflow 표준화 과정
REST API로 작업했을 때, 일반적인 workflow는 기획 회의 및 스펙 구성부터 서버와 테스트 완료까지 이어지는 6단계로 구성됩니다. 이 workflow는 더 자동화된 방법으로 널리 사용되고 있지만, 저희만의 방식으로 보다 효율적인 방법으로 개선할 수 있다고 판단했습니다. 먼저 저희의 최초 gRPC workflow를 소개하겠습니다.
REST API의 workflow
초기 gRPC의 workflow
REST API의 일반적인 workflow와 비교했을 때 바뀐 gRPC의 workflow에서는 3가지 특징이 있습니다.
1. 서버 프로그래머가 명세 내용을 구글시트 등에 작성하지 않고, proto 파일에 작성하고 주석을 잘 달아둡니다.
2. 약속된 API로 수동 코딩하지 않고 protoc 컴파일러로 코드를 자동 생성합니다.
3. gRPC가 인터셉터를 효과적으로 사용하는 방법을 제공합니다. 이 인터셉터를 통해 서버의 역할을 하기도 하고, 서버패킷을 조작하기도 합니다.
다만, 초기 gRPC의 workflow에서는 버전관리 및 자동화가 미흡했습니다. 다음 질문들에 대한 고민이 결여됐기 때문입니다. 먼저 ‘proto파일의 버전 관리 및 파일공유는 어떻게 할 것인지?’, ‘protoc는 CLI를 통해 컴파일하는데, 클라이언트/서버가 각각 CLI로 코드 생성해서 사용할 것인지?’, ‘인터셉터의 사용방법을 표준화할 수 없는지?’에 대해 답할 수 있어야 했습니다. 이 고민들을 바탕으로 최적화된 workflow를 고안했습니다.
최적화된 gRPC의 workflow
최적화된 gRPC의 workflow에서는 3가지 지점이 더욱 고도화됐습니다.
1. git submodule로 proto 파일을 관리합니다. 클라이언트와 서버는 submodule로 각자의 프로젝트에 proto 파일을 추가합니다.
2. git push가 되면 github action이 protoc를 자동으로 실행하여 코드를 생성합니다. 이를 통해 클라이언트와 서버는 git pull로 코드를 받아서 사용합니다.
3. LocalServer라는 이름으로 구성하여 인터셉터를 표준화하여 사용합니다.
최적화된 workflow를 기반으로 쿡앱스에서는 gRPC로 작업 시 여러 업무를 표준화할 수 있었습니다. 예를 들어 모든 프로젝트에서 클라이언트와 서버 간 업무를 진행할 때, 통일된 workflow를 확보할 수 있었습니다. 물론 위 3가지 지점에 대해서는 큰 줄기만 설명했습니다. 현재의 쿡앱스 gRPC workflow는 보다 고도화된 모습입니다. 자세한 방식은 업무 환경마다 차이가 있기 때문에 생략하겠습니다.
기술지원팀이 제공하는 gRPC패키지
쿡앱스에서는 gRPC workflow의 고도화를 이뤄냈을 뿐만 아니라, Unity gRPC패키지를 제작해Unity Package Manager로 배포하고 있습니다. 이 덕분에 인증, 보안, 로그, 데이터 관리 등 수많은 작업들을 간소화할 수 있었습니다.
Unity Package Manager로 제공하는 CookApps gRPC패키지
마치며
지금도 저희는 gRPC를 어떻게 더 고도화할 수 있을지 꾸준히 고민하고 있습니다. 위 사례 외에도, ‘gRPC를 여러 모듈에서 사용하기 위한 확장성은 어떻게 고려할지’, ‘submodule과 repository는 어떻게 구성할지’, ‘프로토타입 단계와 런칭 단계에서 proto 파일을 어떻게 사용 및 관리할지’ 등 다양한 고민들을 거쳤습니다. 덕분에 지금의 gRPC는 더 개선됐습니다.
gRPC에 대한 표준화를 위한 고민은 필수입니다. 이제 쿡앱스의 네트워크 표준으로 자리 잡았지만, gRPC를 활용하기 위한 방법과 표준화가 자리 잡지 않는다면 작업 간에 큰 어려움을 겪었을 것입니다. 쿡앱스 기술 지원팀에서는 이런 고민을 함께할 분들을 기다리고 있습니다. 개발 과정을 표준화하거나 일원화된 개발 프레임 워크를 제공하는데 관심이 있는 분이라면, 언제든 환영입니다!