API 통신과 소켓 통신
2025. 5. 18. 22:19ㆍ연구하기, 지식
개요
- 예쁘게 AI 파이프라인을 만들어도 서비스를 위해서는 데이터 통신이 필수이다. 내가 실무에서 주로 사용하는 데이터 통신은 API 통신과 소켓 통신이다. 인터페이스 정의서를 바탕으로 클라이언트를 구축하거나 때때로 서버를 구축하기도 한다. 항상 언제 API를 쓰고 소켓을 써야할지 직감적인 것은 있었지만 정확한 차이점은 모른다. 나름 혼자 스터디 해보고 정리 해보겠다.
API 통신
- 정의 : 클라이언트가 서버에 요청(Request)를 보내, 서버가 응답(Response)을 반환 하는 요청 - 응답 기반 통신 방식. => 단방향 요청 - 응답 방식.
- 프로토콜 : HTTP / HTTPS
- 주 사용 : 로그인, 회원가입, DB 조회, 서버 상태 확인 등
- HTTP 기반 REST API : HTTP 프로토콜을 사용해 REST 원칙에 따라 서버와 클라이언트가 데이터를 주고 받는 방식.
소켓 통신
- 정의 : 네트워크 상의 두 노드가 연결된 채로 양방향 통신을 할 수 있는 방식.
- 프로토콜 : TCP / UDP
- 주 사용 : 채팅, 실시간 알림, 센서 데이터 주기 전송, 온라인 게임, 스트리밍.
장단점 비교
항목 | API 통신 | 소켓 통신 |
실시간성 | 낮음 (요청 - 응답 기반) | 높음 (지속 연결 유지) |
연결 유지 | 요청 시에만 연결 | 지속 연결 유지 |
구현 난이도 | 비교적 간단 | 상대적 복잡 |
효율 | 헤더 포함(오버헤드 있음) | 빠르고 효율적(특히 TCP) |
확장성 | 높음 | 낮음(연결 유지 비용) |
보안 | HTTP 기반으로 보안 표준 잘 갖춤 | 보안 설정 필요 |
용도 | 요청형 서비스(로그인, CRUD 등) | 실시간 데이터(채팅, 주식 등) |
포맷 | 주로 json | 다양 |
* 오버헤드 : 통신에서 실제 데이터(payload) 외에 따라오는 추가 정보들.
// 오버헤드 정보
POST /user HTTP/1.1
Host: example.com
Authorization: Bearer abc123
Content-Type: application/json
Content-Length: 44
// 실제로 서버가 처리해야할 json 데이터
{"username": "meerkat", "email": "meerkat@example.com"}
=> API는 오버헤드로 인해 낭비가 생길 수도 있지만 TCP 소켓은 한번 연결되면 순수 데이터만 주고 받을 수 있음.
구축 난이도(파이썬에서)
- API 통신 : Flask 패키지를 사용하면 상대적으로 쉽게 구현 가능.(High-level)
- 소켓 통신 : 직접 포트를 열고 데이터 포맷, 주고 받을 데이터 사이즈, 인증, 메시지 구분, 연결 관리 등 개발자가 직접 정의 필요.(Low-level)
* 특히 필자는 데이터 타입에서 많이 애를 먹었다. 서버의 status 값을 받아오지 못했고 이유는 당연히 String 타입이라고 생각했던 status 값이 bytes 타입으로 넘어왔다....(아찔했다.)
* 또한, 오디오를 실시간으로 주고 받을 때 샘플레이트를 확실히 정의해야 하며 그에 따른 패킷 사이즈도 중요하다.
간단한 코드 예제
- API 통신
# 서버 (Flask)
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/hello')
def hello():
return jsonify(message="Hello from API!")
if __name__ == '__main__':
app.run(port=5000)
# 클라이언트 (requests)
import requests
response = requests.get('http://localhost:5000/hello')
print(response.json())
- 소켓 통신
# 서버
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 12345))
server.listen()
conn, addr = server.accept()
data = conn.recv(1024).decode()
print("Received:", data)
conn.send("Hello from socket server!".encode())
conn.close()
# 클라이언트
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 12345))
client.send("Hi Server!".encode())
response = client.recv(1024).decode()
print("Received:", response)
client.close()
+ HTTP 메소드 별 차이
메소드 | 의미 | 특징 | 사용 예 | 예시 |
GET | 리소스 조회 | 읽기 전용 | 사용자 정보 가져오기 | GET /products?category=shoes&page=2 |
POST | 리소스 생성 | 서버 상태 변경(쓰기) | 새로운 사용자 등록 | POST /users { "name": "Meerkat", "email": "mk@example.com" } |
PUT | 전체 리소스 수정 | 대상 전체를 덮어씀 | 사용자 정보 전체 수정 | PUT /users/1 { "name": "Meerkat", "email": "mk@example.com" } |
PATCH | 리소스 일부 수정 | 부분만 수정 | 사용자 이름만 변경 | PATCH /users/1 { "email": "new@example.com" } |
DELETE | 리소스 삭제 | 서버에서 해당 리소스 제거 | 사용자 삭제 | DELETE /users/1 |
OPTIONS | 지원되는 메서드 조회 | 주로 CORS 사전 요청에서 사용 | 클라이언트가 요청 가능 메소드 확인 | OPTIONS /users → Allow: GET, POST, OPTIONS |
HEAD | 응답 헤더만 조회(데이터 없음) | 본문 없이 상태 확인 | 서버 상태 확인 | HEAD /health |
728x90
'연구하기, 지식' 카테고리의 다른 글
NeMo Speaker Recognition(SR) 성능 올리기 (6) | 2025.05.25 |
---|---|
파이썬에서 오디오 파일 다루기(pydub, soundfile) (0) | 2025.05.25 |
쿨백-라이블러 발산(Kullback–Leibler divergence, KLD) (1) | 2025.05.06 |
Stable Diffusion Basemodel 로컬에서 사용하기 (0) | 2025.05.06 |
Whisper vs Faster-Whisper : 성능 비교 (0) | 2025.02.03 |