Swift

gRPC Swift 2

GREEN.1229 2025. 5. 10. 08:11

안녕하세요. 그린입니다 🍏

이번 포스팅에서는 gRPC Swift 2에 대해 정리해보겠습니다 🙋🏻


gRPC Swift 2

생소하다고 느껴지고 대체 무엇인지 감이 안올 수 있는데, swift 공식 블로그에 나온 내용을 토대로 이해하기 쉽게 정리해봅니다.

 


gRPC?

gRPC는 Google이 개발한 오픈소스 원격 프로시저 호출(Remote Procedure Call) 프레임워크로, Protocol Buffers를 통해 빠르고 효율적인 API 통신을 지원합니다. 

 

클라이언트가 마치 로컬 메서드를 호출하듯 서버의 메서드를 실행할 수 있게 해주기 때문에, 마이크로서비스 아키텍처와 모바일 클라이언트 개발에서 자주 사용됩니다.

Swift에서도 이를 활용하기 위해 지난 몇 년간 gRPC Swift가 개발되어 왔고, 이번 2.0 릴리스를 통해 더 견고하고 Swift다운 인터페이스로 개선되었습니다.

 

그럼 왜 gRPC Swift 2가 중요한걸까요?

 


Importance of gRPC Swift 2

기존의 gRPC Swift는 gRPC의 C++ 구현체인 gRPC Core에 의존하고 있었기 때문에, Swift 프로젝트 내에서 설정이 복잡하거나 Swift 언어 특성을 잘 살리지 못하는 문제가 있었습니다. 

 

이러한 구조는 다음과 같은 단점을 안고 있었습니다 🥲

 

1️⃣ 복잡한 종속성 - 기반의 라이브러리를 빌드하고 관리하는 것이 까다로움

2️⃣ Swift API와의 괴리 - Swift다운 네이티브 API가 부족함

3️⃣ 테스트 및 유지보수 어려움 - C++ 코드와의 연동으로 디버깅이 어려움

 

이에 Swift.org는 SwiftNIO 기반으로 완전한 Swift 네이티브 gRPC 클라이언트/서버 구현체를 새로 개발하게 되었습니다.

 

그래서 gRPC Swift 2의 목표는 이러했습니다.

 

1️⃣ Swift에서 gRPC를 더 쉽고 자연스럽게 만들자

2️⃣ Swift Concurrency에 친화적인 구조로 만들자

3️⃣ 테스트와 유지보수를 쉽게 하자

 

이를 위해 SwiftNIO 기반으로 완전히 새롭게 작성되었고, 복잡한 설정 없이 바로 사용할 수 있도록 개선되었습니다.

 

그럼 어떻게 개선되었는지 이제 항목별로 살펴볼까요?

 


Redesign API

가장 큰 변화는 API 설계입니다. 

gRPC Swift 2는 이전 버전과 완전히 다른 새로운 API 집합을 제공합니다. 

protoc-gen-grpc-swift 플러그인을 통해 생성되는 코드도 새롭게 정비되어 Client와 Server에서 모두 명확한 사용 방식을 제공합니다.

 

let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let channel = ClientConnection
  .insecure(group: group)
  .connect(host: "localhost", port: 1234)

let client = Echo_EchoAsyncClient(channel: channel)

 

Echo_EchoAsyncClientProtocol Buffers 정의에서 자동 생성된 gRPC 클라이언트입니다.

 


Support Swift Concurrency

기존 gRPC Swift는 SwiftNIO 기반 Future 스타일을 사용했기 때문에 Swift의 async/await와는 별도의 러닝 커브가 있었습니다. 

하지만 gRPC Swift 2에서는 async/await을 기본 동작 방식으로 채택했습니다.

 

let request = Echo_EchoRequest.with {
  $0.text = "Hello"
}

let response = try await client.echo(request)
print("response: \(response)")

 

단일 요청/응답(unary)의 경우 단 한 줄로 깔끔하게 처리됩니다 😃

 


Call Server Streaming

이전에는 스트리밍 처리를 위해 여러 단계를 거쳐야 했지만, 이제는 Swift의 AsyncSequence를 그대로 활용할 수 있어 매우 자연스럽습니다.

 

let request = Echo_EchoRequest.with {
  $0.text = "Hello"
}

for try await response in client.serverStreaming(request) {
  print("response: \(response)")
}

 

for try await 문법을 그대로 사용할 수 있으므로, Swift 개발자에게 익숙한 문법으로 gRPC 스트리밍을 다룰 수 있습니다.

 


Without dependency

이전 버전은 gRPC C Core라는 복잡한 C/C++ 기반 라이브러리를 내부에 포함하고 있었습니다. 

이로 인해 종속성 관리와 빌드 구성이 번거로웠습니다.

 

gRPC Swift 2는 전적으로 Swift로 구현된 클라이언트/서버 스택을 제공합니다. 

SPM을 통해 간편하게 의존성 설정이 가능하며, 별도 바이너리 설치 없이도 macOS, Linux 등에서 바로 동작합니다.

 


Testing

새 API는 구조화되어 있기 때문에 Client와 Server 각각을 테스트 용도로 대체(mocking)하기 쉬워졌습니다.

예를 들어, 테스트 대상의 클라이언트를 직접 구현하거나, 서버에 대한 응답을 가짜로 만들 수도 있습니다.

 

class FakeEchoClient: Echo_EchoAsyncClientProtocol {
  func echo(_: Echo_EchoRequest, callOptions _: CallOptions?) async throws -> Echo_EchoResponse {
    var response = Echo_EchoResponse()
    response.text = "Mock!"
    return response
  }
}

 

AsyncClientProtocol을 채택하면 실제 서버 없이도 테스트 가능한 클라이언트를 만들 수 있습니다.

 

이렇게 변화한 gRPC Swift 2는 어떻게 설치해서 사용할 수 있을까요?

 


Install gRPC Swift 2

gRPC Swift 2는 Swift Package Manager를 통해 설치할 수 있습니다. 

Swift 5.9 이상에서 사용을 권장하며, 다음처럼 의존성을 설정하면 됩니다.

 

.package(url: "https://github.com/grpc/grpc-swift.git", from: "2.0.0")

 

또한 protoc-gen-grpc-swift는 CLI 도구로 설치해서 사용할 수 있습니다. 

Homebrew를 사용하는 경우 아래와 같이 명령어를 작동시킵니다.

 

brew install grpc-swift

 


Conclusion

이번 gRPC Swift 2 릴리스를 통해 Swift에서의 gRPC 사용성이 크게 개선되었습니다. 

SwiftNIO 기반의 네이티브 구현, Swift Concurrency 지원, 간결한 API 구조까지—모든 면에서 실무에서 바로 사용할 수 있을 만큼 개선되었어요.

gRPC를 도입하고자 했지만 기반 종속성과 설정 난이도에 고민하셨던 분들이라면, 이제는 걱정 없이 시작하셔도 좋을거라 생각됩니다!

 

만약 마이크로서비스와 통신 혹은 빠른 네트워크 RPC 호출이 필요한 앱을 개발하고 있고 고려한다면 gRPC Swift 2를 이참에 고려해보는것은 어떨까요?

 


References

 

Introducing gRPC Swift 2

Say hello to gRPC Swift 2: a major update that brings first-class concurrency support and more expressive APIs for a seamless developer experience.

www.swift.org