WEB

[Python Backend] Rest(HTTP)와 gRPC의 개념

땽뚕 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