TIL_20250424_gRPC, GraphQL

Kim jisu·2025년 4월 24일

TIL

목록 보기
36/43

gRPC와 GraphQL의 개념·아키텍처·주요 특징을 살펴보고, 두 기술의 차이점 및 적합한 사용 시나리오를 정리.


1. gRPC

1.1 정의 및 개념

  • gRPC는 Google이 공개한 오픈소스 RPC(Remote Procedure Call) 프레임워크
  • 서비스 간 호출을 메소드 호출처럼 구현할 수 있도록 추상화
  • 기본 전송 계층으로 HTTP/2, 직렬화 포맷으로 Protocol Buffers(proto) 사용

1.2 아키텍처 및 동작 원리

  1. IDL(Interface Definition Language)

    syntax = "proto3";
    
    service UserService {
      rpc GetUser (GetUserRequest) returns (User);
      rpc ListUsers (ListUsersRequest) returns (stream User);
    }
    
    message GetUserRequest { int32 id = 1; }
    message ListUsersRequest { }
    message User { int32 id = 1; string name = 2; }
  2. 코드 생성

    • protoc 컴파일러로 서버·클라이언트 스텁(stub) 코드 생성(Java/Kotlin, Go, Python 등)
  3. 통신

    • HTTP/2 커넥션 위에서 멀티플렉싱
    • 요청·응답을 모두 바이너리 프레임으로 교환
    • 4가지 호출 패턴 지원
      1. Unary RPC (단발 요청→응답)
      2. Server streaming RPC (단발 요청→스트림 응답)
      3. Client streaming RPC (스트림 요청→단일 응답)
      4. Bidirectional streaming RPC (양방향 스트림)

1.3 주요 특징

  • 고성능·저지연
    • HTTP/2 멀티플렉싱으로 커넥션 수 줄이고, 바이너리 포맷(proto)으로 직렬화 비용 최소화
  • 엄격한 타입 안정성
    • 컴파일 타임에 IDL 검증
  • 양방향 스트리밍
    • 실시간 데이터 흐름 처리에 유리 (예: IoT, 채팅, 실시간 로그)
  • 다양한 언어 지원
    • 공식 지원 언어 외에도 커뮤니티 드라이버 풍부

1.4 사용 사례

  • 마이크로서비스 내부 통신
  • 실시간 데이터 피드 (예: 센서, 로그)
  • 언어 간 서비스 연동가 잦은 분산 시스템

2. GraphQL

2.1 정의 및 개념

  • Facebook이 개발한 API 쿼리 언어 및 런타임
  • 클라이언트가 필요한 데이터 구조를 명시적 쿼리로 요청하고, 서버는 해당 구조대로 응답
  • REST의 과·과소 요청 문제(over-/under-fetching) 해소

2.2 아키텍처 및 동작 원리

  1. 스키마 정의

    type Query {
      user(id: ID!): User
      users(limit: Int): [User!]!
    }
    
    type User {
      id: ID!
      name: String!
      posts: [Post!]!
    }
  2. 리졸버(Resolver)

    • 각 필드마다 함수를 매핑하여 실제 데이터를 조회
  3. 단일 엔드포인트

    • 모든 요청은 /graphql 하나의 HTTP 엔드포인트로
    • 요청 본문에 쿼리 문장과 변수를 JSON 형태로 전달
  4. 인증·권한·복잡도 제어

    • 쿼리 복잡도(cost), 깊이(depth) 제한 가능
    • 스키마에 직접 @auth 디렉티브 적용 등

2.3 주요 특징

  • 클라이언트 주도형 데이터 페칭
    • 필요한 필드만 가져와 네트워크 오버헤드 절감
  • 자동 문서화·타입 인트로스펙션
    • GraphiQL, Playground 같은 툴로 런타임에 스키마 탐색 가능
  • 프론트엔드 혁신 가속
    • 모바일·웹 클라이언트가 빠르게 변화하는 화면 요구사항에 대응
  • 캐싱·배칭
    • DataLoader 같은 라이브러리로 N+1 문제 해결 가능

2.4 사용 사례

  • 복잡한 UI 데이터 조회 (대시보드, SPA)
  • 모바일 앱 네트워크 최적화
  • 다양한 클라이언트(웹/모바일/IoT) 지원

3. gRPC vs GraphQL 비교

구분gRPCGraphQL
전송 프로토콜HTTP/2 바이너리HTTP/1.1 또는 HTTP/2, JSON
데이터 직렬화Protocol BuffersJSON
엔드포인트 구조서비스·메소드별 엔드포인트단일 /graphql 엔드포인트
타입 안정성컴파일 타임 IDL 검증런타임 스키마 검증
스트리밍 지원양방향 스트리밍 기본 지원표준은 스트리밍 미지원 (구현별로 WebSocket 등 확장)
도구 생태계protoc, gRPC interceptor, 다양한 언어 SDKGraphiQL, Apollo, Relay, 서버 프레임워크 연동
장점고성능·낮은 레이턴시, 언어간 호환성, 스트리밍유연한 쿼리, 과·과소 요청 해소, 자동 문서화
단점러닝커브, HTTP/2·proto 환경 구성 복잡쿼리 복잡도 관리 필요, 캐싱 제어 추가 작업 필요

4. 언제 무엇을 선택할까?

  • gRPC

    • 서비스 간 호출이 빈번하고, 저지연·고성능이 중요하다면
    • 스트리밍(실시간 메시징, 로그) 기능이 필요할 때
    • 마이크로서비스 내부에서 언어 간 인터페이스를 통일할 때
  • GraphQL

    • 클라이언트 주도로 자주 변경되는 UI 데이터 요구사항이 많을 때
    • 단일 엔드포인트로 다양한 화면의 데이터를 한 번에 조회해야 할 때
    • REST의 과·과소 요청 문제를 해결하고, 자동 문서화가 필요할 때

결론

  • gRPC와 GraphQL은 서로 목적이 겹치지 않고, 상호 보완적인 기술입니다.
  • 내부 서비스 간 통신에는 gRPC, 클라이언트와의 API 통신에는 GraphQL을 도입하는 하이브리드 아키텍처도 고려해 보세요.
  • 프로젝트 요구사항(성능, 확장성, 개발 생산성, 클라이언트 다양성 등)에 따라 적절한 기술을 선택·조합하는 것이 관건입니다.
profile
Dreamer

0개의 댓글