지난 포스트에서는 FFI (Foreign Function Interface)를 활용해서 Rust와 Flutter를 연동했었는데요. 이번에는 HTTP 2.0 기반의 protocol인 gRPC를 활용해서 연동하는 방법에 대해서 알아보고자 합니다.
예제코드를 먼저 보고자 하시는 분들은 다음 포스트로 바로 다음 포스트로 넘어가서 확인하시기 바랍니다.
들어가기 전에 Rust와 Flutter를 연동하는 데 있어서 FFI와 gRPC가 어떤 차이가 있는지 차이점을 아래와 같이 표로 정리해봤습니다.
측면 | gRPC | FFI (Foreign Function Interface) |
통합 복잡성 | gRPC는 서비스 간 통신을 위한 프로토콜 중심 접근 방식을 제공하여 통합을 단순화할 수 있습니다. | FFI는 낮은 수준의 바인딩과 수동 메모리 관리를 필요로 하므로 통합이 더 복잡하고 오류 발생 가능성이 있습니다. |
언어 지원 | gRPC는 Rust를 포함한 여러 프로그래밍 언어에 대한 공식 지원을 제공합니다. | FFI는 C 및 C++로 작성된 라이브러리와 인터페이스할 수 있으므로 FFI 바인딩이 있는 기존 라이브러리와 작업할 수 있습니다. |
성능 | gRPC는 효율적인 이진 프로토콜과 스트리밍과 같은 기능을 지원하여 성능이 우수한 선택지입니다. | FFI는 최적화된 C/C++ 라이브러리와 상호 작용할 때 좋은 성능을 낼 수 있지만 데이터의 직렬화 및 역직렬화로 인한 오버헤드가 발생할 수 있습니다. |
타입 안정성 | gRPC는 Protocol Buffers를 통해 강력한 타입 안정성을 강제하여 서비스 간 데이터 일관성을 보장합니다. | FFI는 타입 안정성이 없으며 타입 불일치가 런타임 오류와 충돌을 유발할 수 있습니다. |
플랫폼 독립성 | gRPC는 플랫폼에 독립적이며 서로 다른 플랫폼과 언어 간의 통신을 지원합니다. | FFI는 일반적으로 특정 플랫폼에 종속되며 플랫폼별 바인딩이 필요합니다. |
생태계 및 도구 | gRPC는 다양한 언어에 대한 코드 생성을 포함한 다양한 도구와 라이브러리를 제공합니다. | FFI는 수동 코드 생성이 필요할 수 있으며 gRPC만큼의 도구 지원 수준이 없습니다. |
상호 운용성 | gRPC는 표준화된 프로토콜과 라이브러리를 통해 다른 언어와 플랫폼 간의 상호 운용성을 지원합니다. | FFI는 복잡한 데이터 구조와 메모리 관리와 관련된 경우에 상호 운용성이 떨어질 수 있습니다. |
안전성 | gRPC는 직렬화/역직렬화 및 연결 관리를 처리하여 메모리 관련 버그의 위험을 줄이므로 안전성을 높입니다. | FFI는 메모리 관리와 관련된 잠재적인 버그를 도입하며 메모리 할당 및 해제를 주의 깊게 처리해야 합니다. |
커뮤니티 및 문서 | gRPC는 크고 활성화된 커뮤니티를 가지고 있으며 방대한 문서 및 리소스가 제공됩니다. | FFI는 구체적인 라이브러리에 따라 커뮤니티 지원과 문서가 제한적일 수 있습니다. |
요약하면 gRPC는 Rust와 Flutter 간 통신에 있어서 더 현대적이고 개발자 친화적인 선택지로, 타입 안정성, 성능 및 플랫폼 독립성 면에서 우수하며, FFI는 C/C++ 라이브러리와 작업할 때 유용할 수 있지만 메모리 관리 및 타입 안정성과 관련된 복잡성과 잠재적인 문제를 도입할 수 있습니다. 선택은 프로젝트의 특정 요구 사항과 제약 사항에 따라 달라져야 합니다.