-
[Python Backend] Rest(HTTP)와 gRPC의 개념WEB 2025. 5. 25. 09:04728x90
[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가 뭔 차인데?
- gRPC는 HTTP2를 사용한다. (REST는 HTTP1.1)
- gRPC는 protocol buffer data format을 사용한다. REST는 주로 JSON을 사용한다.
- gRPC를 활용하면 server-side streaming, client-side streaming, bidirectional-streaming과 같은 HTTP/2가 가진 feature를 활용할 수 있다.
- 내부적으로는 Netty(소켓통신)을 사용하고 있다.
- 이미 배포한 서비스를 중단할 필요 없이 데이터 구조를 바꿀 수 있다.
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 구조
- 응답도 요청과 마찬가지로 세 부분으로 구성됨
- Status Line
- Headers
- 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 동작 방식
- .proto 파일 정의
- 메시지 구조와 서비스 인터페이스를 정의함
- 예:
-
proto복사편집service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) }
- 코드 생성
- gRPC 컴파일러(protoc)를 사용해 클라이언트와 서버용 코드를 생성함
- 서버 구현
- 정의한 서비스 메서드를 실제 서버 코드에서 구현함
- 클라이언트 호출
- 클라이언트는 로컬 메서드를 호출하듯 원격 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'WEB' 카테고리의 다른 글
[Python Backend] FastAPI를 이해하기 위한 비동기 처리 개념 정리 (0) 2025.05.25 [Python Backend] RestAPI 기반의 Flask vs FastAPI (feat. gRPC) (0) 2025.05.25 서버와 클라이언트 기본 구조 (0) 2021.09.03 Web에서의 페이지 전환 방법 2가지 (0) 2021.09.03 Jinja2 기본 문법 (0) 2021.09.03