ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python Backend] Rest(HTTP)와 gRPC의 개념
    WEB 2025. 5. 25. 09:04
    728x90
    [Python Backend] Rest(HTTP)와 gRPC의 개념 

     

    AI 시스템이 아무래도 FastAPI, Flask와 같은 Backend 프레임워크들과의 조합이 필요하다보니 필연적으로 공부할 수 밖에 없어짐

    그래서 먼저 Http와 gRPC의 개념을 먼저 살펴보도록 하겠다. 

    이후론 이 개념을 바탕으로 python backend framework인 Flask과 FastAPI를 공부할 것임. (https://asidefine.tistory.com/330)

     

     

    * 이후 포스트에서 이어집니다 (https://asidefine.tistory.com/330)

     

    그래서 RestAPI와 RPC가 뭔 차인데? 

     

    1. gRPC는 HTTP2를 사용한다. (REST는 HTTP1.1)
    2. gRPC는 protocol buffer data format을 사용한다. REST는 주로 JSON을 사용한다.
    3. gRPC를 활용하면 server-side streaming, client-side streaming, bidirectional-streaming과 같은 HTTP/2가 가진 feature를 활용할 수 있다.
    4. 내부적으로는 Netty(소켓통신)을 사용하고 있다.
    5. 이미 배포한 서비스를 중단할 필요 없이 데이터 구조를 바꿀 수 있다.



     

    HTTP

    0. Protocol

    • 네트워크 객체들 간의 규격과 통신 순서를 정의한 통신 규약임
    • 쉽게 말하면 네트워크 상의 컴퓨터들끼리 대화하는 방법을 정해놓은 것임

    1. HyperText Transfer Protocol (HTTP)

    • 웹의 시작은 HTTP와 HTML이 있었음
    • HTTP는 서버 간 통신을 어떤 형식으로 할지 정한 약속임
    • 프론트엔드-클라이언트, 프론트엔드-백엔드 간 통신에도 사용됨
    • 하이퍼텍스트(HTML) 문서를 주고받기 위해 만들어진 규약임

    2. HTTP 핵심 요소

    2-1. HTTP 통신 방식

    • 클라이언트가 HTTP 요청(request)을 보내고 서버가 응답(response)을 돌려주는 구조임
    • HTTP는 stateless임
      • 이전 요청과 현재 요청 사이의 상태를 저장하지 않음
      • 각각의 요청은 독립적임
      • 여러 요청 간 정보를 유지하려면 쿠키나 세션을 사용함

    2-2. HTTP Request 구조

    2-2-1. Start Line

    • HTTP 요청의 첫 줄로, 세 부분으로 구성됨

    예시: GET /search HTTP/1.1

    구성설명
    HTTP Method 요청의 의도를 나타냄 (GET, POST 등)
    Request Target 요청 대상 리소스의 URI (예: /login)
    HTTP Version 사용하는 HTTP 버전 (예: 1.1)
     

    2-2-2. Headers

    • 요청에 대한 부가 정보를 담고 있는 부분임
    • Key:Value 형식으로 구성됨
    Header설명
    Host 요청 대상의 도메인명
    User-Agent 클라이언트 정보 (브라우저 등)
    Accept 클라이언트가 수용 가능한 응답 형식
    Connection 통신 후 연결 유지 여부 설정
    Content-Type 요청 body의 데이터 형식 (예: application/json)
    Content-Length 요청 body의 길이
     

    2-2-3. Body

    • 요청의 실제 데이터를 담는 부분임
    • GET 요청은 보통 body를 포함하지 않음
    • POST 요청은 body에 데이터를 담아 서버에 전송함

    2-3. HTTP Response 구조

    • 응답도 요청과 마찬가지로 세 부분으로 구성됨
      1. Status Line
      2. Headers
      3. Body

    2-3-1. Status Line

    • 응답 상태를 요약한 첫 줄임
    구성설명
    HTTP Version 응답에 사용된 HTTP 버전
    Status Code 응답 상태를 나타내는 숫자 (예: 200)
    Status Text 상태 코드의 간단한 설명 (예: OK)
     

    2-3-2. Headers

    • 응답 관련 부가 정보를 포함함
    • 요청과 구조는 비슷하나, Server 등의 응답 전용 헤더가 포함될 수 있음

    2-3-3. Body

    • 응답 내용이 담긴 실제 데이터임
    • 모든 응답에 body가 있는 것은 아님
    • 예: 리디렉션이나 오류 메시지만 주는 경우 body가 비어 있음

    3. 자주 쓰이는 HTTP Methods

    Method설명
    GET 데이터를 받아올 때 사용함, body는 없음
    POST 데이터를 생성 또는 수정할 때 사용함, body 포함
    OPTIONS 특정 URI에서 허용되는 메서드를 확인할 때 사용함
    PUT 자원을 새로 생성하거나 전체를 대체할 때 사용함
    DELETE 자원을 삭제할 때 사용함
     

    4. 자주 쓰이는 HTTP Status Code

    코드의미설명
    200 OK 성공 요청이 정상적으로 처리되었을 때
    301 Moved Permanently 영구 이동 URI가 다른 주소로 바뀌었을 때
    400 Bad Request 잘못된 요청 요청 형식이나 입력값이 잘못되었을 때
    401 Unauthorized 인증 필요 로그인 또는 인증이 필요한 경우
    403 Forbidden 접근 금지 접근 권한이 없을 때
    404 Not Found 리소스 없음 요청한 URI가 존재하지 않을 때
    500 Internal Server Error 서버 오류 서버 내부에서 에러가 발생했을 때

     

    2. gRPC
    • gRPC는 구글이 만든 고성능, 범용 오픈소스 RPC(Remote Procedure Call) 프레임워크임
      • HTTP 대신 바이너리 통신으로 고속 처리하는 RPC(원격 프로시저 호출)
    • 서로 다른 시스템에서 마치 함수를 호출하듯 다른 서버의 메서드를 실행할 수 있게 도와줌
    • HTTP/2 기반으로 작동하며, 기본적으로 Protocol Buffers를 메시지 직렬화 포맷으로 사용함
      • protobuff로 바이너리 형태의 값을 전달하여 속도가 매우 빠르다.

    gRPC 주요 특징

    특징설명
    HTTP/2 기반 멀티플렉싱, 스트리밍, 헤더 압축 등의 기능 지원
    Protobuf 사용 JSON보다 작고 빠른 이진 데이터 포맷 사용
    자동 코드 생성 .proto 파일 기반으로 다양한 언어용 클라이언트/서버 코드 자동 생성
    양방향 스트리밍 지원 클라이언트와 서버 간 실시간 스트리밍 통신 가능
    다양한 언어 지원 C++, Java, Python, Go, Node.js 등 다수 지원함
     

    gRPC 동작 방식

    1. .proto 파일 정의
      • 메시지 구조와 서비스 인터페이스를 정의함
      • 예:
      • proto
        복사편집
        service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) }
    2. 코드 생성
      • gRPC 컴파일러(protoc)를 사용해 클라이언트와 서버용 코드를 생성함
    3. 서버 구현
      • 정의한 서비스 메서드를 실제 서버 코드에서 구현함
    4. 클라이언트 호출
      • 클라이언트는 로컬 메서드를 호출하듯 원격 RPC를 호출함

    gRPC 메시지 포맷: Protocol Buffers

    • .proto 파일에서 메시지 형식을 정의함
    • 예:
    • proto
      복사편집
      message HelloRequest { string name = 1 } message HelloReply { string message = 1 }
    • 필드에 숫자를 지정하는 이유는 직렬화 시 크기를 줄이고 파싱 속도를 빠르게 하기 위함

    gRPC 통신 유형

    유형설명
    Unary RPC 클라이언트가 요청 1번 보내고, 서버가 응답 1번 돌려주는 기본형
    Server Streaming 클라이언트가 요청 1번 보내고, 서버가 여러 번 응답 보냄
    Client Streaming 클라이언트가 여러 요청을 보내고, 서버가 응답 1번 돌려줌
    Bidirectional Streaming 양쪽이 자유롭게 요청/응답을 주고받는 형태
     

    gRPC vs REST (HTTP)

    항목gRPCREST (HTTP)
    전송 프로토콜 HTTP/2 HTTP/1.1 또는 HTTP/2
    데이터 포맷 Protocol Buffers JSON
    성능 빠름 (바이너리, 압축) 느림 (텍스트 기반)
    스트리밍 완전 지원 (양방향) 제한적
    브라우저 호환성 제한적 (gRPC-Web 필요) 좋음
    개발 생산성 높은 편 (자동 코드 생성) 중간

     

    gRPC 사용 예시

    • 마이크로서비스 간 내부 통신
    • 모바일-서버 간 통신
    • IoT/Edge 기기 통신
    • 실시간 양방향 데이터 처리 (예: 채팅, 영상 스트리밍 등)

     

     

     

     

    728x90
Designed by Tistory.