최근 서비스 개발에서는 실시간성과 확장성이 핵심 키워드로 떠오르고 있다.
과거에는 대부분의 통신이 REST API 기반의 요청–응답 구조로 이루어졌지만,
이제는 대용량 이벤트 처리나 실시간 데이터 스트리밍이 필수적인 시대가 되었다.
이런 흐름 속에서 자연스럽게 등장한 기술이 바로 gRPC와 스트림 기반 통신(WebFlux, WebSocket 등)이다.
아직 실무에서 직접 적용해본 경험은 없지만, 학습과 개인 프로젝트를 통해
이 기술들이 어떤 상황에서 유용하고, 기존 REST 구조와 어떻게 다른지 깊이 있게 이해해보았다.
gRPC는 Google에서 개발한 고성능 RPC(Remote Procedure Call) 프레임워크다.
HTTP/2 기반으로 동작하며, 데이터 직렬화에는 Protocol Buffers (protobuf)를 사용한다.
즉, JSON보다 빠르고 네트워크 대역폭을 효율적으로 활용하며,
서버–클라이언트 간 통신을 타입 안정성 있게 보장한다.
// example.proto
syntax = "proto3";
service OrderService {
rpc GetOrder (OrderRequest) returns (OrderResponse);
}
message OrderRequest {
string order_id = 1;
}
message OrderResponse {
string order_id = 1;
string status = 2;
}
| 항목 | REST | gRPC |
|---|---|---|
| 전송 프로토콜 | HTTP/1.1 | HTTP/2 |
| 데이터 포맷 | JSON | Protocol Buffers |
| 성능 | 텍스트 기반 (느림) | 바이너리 기반 (빠름) |
| 스트리밍 | 단방향 | 양방향 스트리밍 지원 |
| 주요 사용처 | 외부 API | 내부 마이크로서비스 통신 |
gRPC는 양방향 스트리밍을 지원한다는 점에서 REST와 확실히 다르다.
예를 들어, 클라이언트가 실시간 요청을 보내면 서버가 스트림 형태로 응답을 지속적으로 보낼 수 있다.
기존의 Spring MVC는 요청마다 스레드를 점유하는 블로킹(Blocking) 구조다.
대규모 트래픽 환경에서는 이 구조가 심각한 비효율을 초래한다.
이를 해결하기 위해 등장한 것이 Spring WebFlux다.
WebFlux는 Reactor 기반의 논블로킹 프레임워크로,
데이터를 Mono(단일 값)와 Flux(다중 값) 형태로 처리한다.
@GetMapping("/orders")
fun getOrders(): Flux<Order> {
return orderService.getAllOrders()
.flatMap { Mono.just(it).delayElement(Duration.ofMillis(100)) }
.onErrorResume { Mono.empty() }
}
장점
flatMap, onErrorResume 등)WebSocket은 클라이언트와 서버 간 지속 연결(Persistent Connection)을 유지한다.
이 덕분에 채팅, 알림, 대시보드 갱신 등 실시간 반응형 애플리케이션을 구현할 수 있다.
동작 예시:
const socket = new WebSocket("wss://example.com/notify");
socket.onmessage = (event) => {
console.log("📩 New Message:", event.data);
};
socket.send("ping");
특징
| 구분 | gRPC | WebFlux | WebSocket |
|---|---|---|---|
| 주요 특징 | 고성능 RPC | 논블로킹 스트림 처리 | 지속적 양방향 통신 |
| 전송 방식 | HTTP/2 | HTTP/1.1 / 2 | TCP 기반 |
| 적합한 환경 | 내부 마이크로서비스 간 통신 | 외부 API 연동, Reactive 시스템 | 실시간 알림, 대시보드 |
| 데이터 형식 | Protobuf | JSON | Text/Binary |
결국 기술 선택의 핵심은 요구되는 통신 패턴에 따라 다르다.
아직 실무에 직접 적용해본 적은 없지만,
gRPC와 WebFlux, WebSocket을 학습하며 느낀 점은 분명하다.
“통신은 단순히 데이터를 주고받는 것이 아니라,
데이터의 흐름을 설계하는 행위다.”
REST API는 여전히 단순하고 강력하지만,
실시간성과 확장성이 중요해진 시대에는
Reactive Stream 기반의 통신이 점점 더 필수가 되어가고 있다.
앞으로 실제 프로젝트에서 이 기술들을
적절히 조합해보는 것이 개인적인 목표다.
gRPC, WebFlux, WebSocket은 단순한 새로운 기술이 아니라
“데이터 흐름을 효율적으로 제어하기 위한 철학의 전환”이다.
서비스 간 경계를 허물고, 실시간으로 반응하는 시스템을 만들기 위해
이런 기술들을 이해하고 준비하는 것은 앞으로의 개발자에게 필수적인 역량이 될 것이다.
📚 참고 자료