[API] 통신규약 종류에 대해 알아보자

🌐 웹 통신 프로토콜의 세계

Posted by lim.Chuck on April 17, 2025

[API]

  1. [API] REST API vs GraphQL 차이
  2. [API] 통신규약 종류에 대해 알아보자

🌐 웹 통신 프로토콜의 세계

📡 sever에서 사용되는 통신 규약들 알아보기

  1. ✨ WebSocket - 실시간 양방향 통신의 강자

    • 주요 용도: 실시간 양방향 통신이 필요한 서비스 (채팅, 게임, 실시간 협업 도구)
    • 특징: 연결 유지 후 양방향 실시간 데이터 교환

      💪 장점 🚫 단점
      실시간 양방향 통신 연결 유지 위한 서버 리소스 필요
      한번 연결 후 지속적 통신으로 오버헤드 감소 방화벽/프록시 이슈 발생 가능
      낮은 지연시간 구현 복잡도 상승
    • 플로우:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    클라이언트                                 서버
       |                                         |
       |-------- 핸드셰이크 요청(HTTP) --------->|
       |                                         |
       |<------- 핸드셰이크 응답(HTTP) ----------|
       |                                         |
       |========== WebSocket 연결 성립 ==========|
       |                                         |
       |----------- 메시지 전송 --------------->|
       |                                         |
       |<---------- 메시지 수신 ----------------|
       |                                         |
       |----------- 메시지 전송 --------------->|
       |                                         |
       |<---------- 메시지 수신 ----------------|
       |                   ...                   |
       |                                         |
       |------------ 연결 종료 ---------------->|
       |                                         |
    
  2. 🔄 HTTP API - 범용성과 단순함의 대명사

    • 주요 용도: 일반적인 클라이언트-서버 통신, RESTful 서비스
    • 특징: 요청-응답 모델, 상태 비저장(Stateless)

      💪 장점 🚫 단점
      구현 간단, 널리 사용됨 실시간 통신에 비효율적
      캐싱 가능 각 요청마다 TCP 연결 오버헤드
      확장성 좋음 헤더 크기로 데이터 효율성 감소
    • 플로우:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    클라이언트                                 서버
       |                                         |
       |------------- HTTP 요청 ---------------->|
       |           (GET/POST/PUT/DELETE)         |
       |                                         |
       |                                         |
       |<------------ HTTP 응답 -----------------|
       |         (상태 코드 + 데이터)            |
       |                                         |
       |------------- TCP 연결 종료 -------------|
       |                                         |
       |                                         |
       |------------- HTTP 요청 ---------------->|  (새로운 연결)
       |                                         |
       |<------------ HTTP 응답 -----------------|
       |                                         |
    
  3. ⚡ gRPC - 고성능 마이크로서비스 통신의 핵심

    • 주요 용도: 마이크로서비스 간 통신, 고성능 API
    • 특징: HTTP/2 기반, 프로토콜 버퍼 사용

      💪 장점 🚫 단점
      높은 성능과 낮은 지연시간 학습 곡선 높음
      강력한 타입 체킹 브라우저 직접 지원 제한적
      코드 생성 자동화 JSON 기반 시스템과 통합 복잡
      양방향 스트리밍 지원  
    • 플로우:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    클라이언트                                 서버
       |                                         |
       |--------- HTTP/2 연결 설정 ------------->|
       |                                         |
       |<-------- HTTP/2 연결 확인 --------------|
       |                                         |
       |=== 프로토콜 버퍼로 직렬화된 RPC 호출 ==>|
       |                                         |
       |                                         |
       |<== 프로토콜 버퍼로 직렬화된 RPC 응답 ===|
       |                                         |
       |                                         |
       |=== 단방향/양방향 스트리밍(선택적) =====>|
       |                                         |
       |                                         |
       |---------- 연결 종료 요청 -------------->|
       |                                         |
       |<--------- 연결 종료 확인 --------------|
       |                                         |
    
  4. 📢 SSE - 서버에서 클라이언트로의 단방향 이벤트 스트림

    • 주요 용도: 서버에서 클라이언트로의 단방향 실시간 알림
    • 특징: HTTP 연결 유지하며 서버가 이벤트 전송

      💪 장점 🚫 단점
      구현 간단 클라이언트→서버 통신 불가
      기존 HTTP 인프라와 호환 IE 지원 없음
      자동 재연결 기능 연결 수 제한
    • 플로우:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    클라이언트                                 서버
       |                                         |
       |-------- SSE 연결 요청(HTTP) ----------->|
       |       (Accept: text/event-stream)       |
       |                                         |
       |<--------- 스트림 응답 시작 -------------|
       |      (Content-Type: text/event-stream)  |
       |                                         |
       |<---------- 이벤트 데이터 #1 ------------|
       |                                         |
       |<---------- 이벤트 데이터 #2 ------------|
       |                                         |
       |<---------- 이벤트 데이터 #3 ------------|
       |                    ...                  |
       |                                         |
       |----- 연결 종료(클라이언트 측에서) ----->|
       |                                         |
       |                                         |
       |----- 자동 재연결(네트워크 복구 시) ---->|
       |                                         |
    
  5. 🖥️ stdio - 프로세스 간 통신의 기본

    • 주요 용도: 프로세스 간 통신, CLI 애플리케이션
    • 특징: 표준 입출력 스트림(stdin, stdout, stderr)

      💪 장점 🚫 단점
      간단한 구현 네트워크 통신에 적합하지 않음
      모든 OS 지원 복잡한 데이터 구조 전송 어려움
      파이프라인 구성 용이 보안 메커니즘 부재
    • 플로우:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    부모 프로세스                           자식 프로세스
       |                                         |
       |---------- 프로세스 생성 -------------->|
       |                                         |
       |                                         |
       |------- stdin을 통한 데이터 전송 ------->|
       |                                         |
       |                                         |
       |<------ stdout을 통한 결과 수신 ---------|
       |                                         |
       |                                         |
       |<------ stderr를 통한 오류 수신 ---------|
       |                                         |
       |                                         |
       |--------- 프로세스 종료 신호 ----------->|
       |                                         |
       |<-------- 종료 상태 코드 반환 -----------|
       |                                         |