
REST API와 WebSocket API가 무엇인가요? |
1. REST API와 WebSocket API의 기본 개념
(1) REST API란?
- REST (Representational State Transfer) 방식으로 동작하는 API입니다.
- HTTP 프로토콜을 사용하여 클라이언트와 서버가 데이터를 주고받습니다.
- 요청을 보낼 때마다 새로운 연결(요청-응답)을 맺고 응답을 받은 후에는 연결을 종료합니다.
- 보통 JSON, XML 등의 형식으로 데이터를 주고받습니다.
쉽게 말하면?
REST API는 "필요할 때만 요청하는 방식"입니다.
예를 들어, 웹사이트에서 "새로고침"을 하면 최신 데이터를 받아오는 것과 비슷합니다.
(2) WebSocket API란?
- REST API와 달리 연결을 유지하면서 실시간으로 데이터를 주고받는 API입니다.
- 한 번 연결을 맺으면, 클라이언트와 서버가 계속 데이터를 주고받을 수 있습니다.
- 보통 JSON, 이진 데이터(Binary) 등의 형식으로 데이터를 주고받습니다.
쉽게 말하면?
WebSocket API는 "계속 대화하는 방식"입니다.
예를 들어, 카카오톡이나 메신저처럼 실시간으로 메시지를 주고받을 때 사용됩니다.
2. REST API와 WebSocket API의 동작 방식
(1) REST API 동작 방식
- 클라이언트(예: 웹 브라우저, 모바일 앱)가 서버에 요청(Request)을 보냄.
- 서버는 요청을 받고 데이터를 처리한 후 응답(Response)을 반환.
- 응답을 받은 후 연결이 종료됨.
예제:
- 클라이언트가 /user/1을 요청하면, 서버는 ID가 1인 사용자의 정보를 보내줌.
- 이때, 사용자가 다시 요청해야만 새로운 데이터를 받을 수 있음.
(2) WebSocket API 동작 방식
- 클라이언트가 서버에 WebSocket 연결을 요청함.
- 서버가 연결을 승인하면, 두 장치 간에 연결이 유지됨.
- 이후, 서버와 클라이언트는 필요할 때마다 데이터를 주고받을 수 있음.
예제:
- 사용자가 채팅방에 들어가면 WebSocket 연결이 생성됨.
- 상대방이 메시지를 보내면 즉시 화면에 표시됨 (별도의 요청 필요 없음).
3. REST API와 WebSocket API의 사용 환경
구분 | REST API | WebSocket API |
데이터 전송 방식 | 요청이 있을 때마다 응답 | 실시간으로 데이터 송수신 |
연결 방식 | 요청-응답 후 연결 종료 | 한 번 연결 후 유지 |
사용 예제 | 웹사이트의 로그인, 게시판, 상품 조회 등 | 채팅, 주식 데이터, 온라인 게임 등의 프로그램 |
장점 | 단순하고 안정적, 구현이 쉬움 | 실시간 데이터 전송이 가능 |
단점 | 실시간 데이터 전송 어려움 | 구현이 다소 복잡 |
4. REST API와 WebSocket API를 혼용할 수 있을까?
네, REST API와 WebSocket API를 함께 사용할 수 있습니다!
혼용하는 예제
- 로그인 및 초기 데이터 로딩: REST API 사용
- 사용자가 로그인하면 REST API로 사용자 정보를 가져옴.
- 실시간 채팅: WebSocket API 사용
- 로그인 후 WebSocket 연결을 생성하고, 실시간으로 메시지를 주고받음.
실제 예시:
카카오톡 같은 앱을 생각해보면,
- 친구 목록 가져오기 → REST API
- 채팅 메시지 주고받기 → WebSocket API
5. REST API와 WebSocket API는 웹에서만 사용할까?
(1) 웹에서 사용 가능
- REST API: 웹 브라우저, 모바일 앱, 데스크톱 앱 등 어디서든 사용 가능.
- WebSocket API: 웹사이트(JavaScript), 모바일 앱, 게임 프로그램 등에서 사용 가능.
(2) 일반 프로그램에서도 사용 가능
- 파이썬으로 REST API 또는 WebSocket API 서버를 만들면 일반 프로그램에서도 활용할 수 있음.
- 예를 들어, 주식 거래 프로그램에서 REST API로 가격을 조회하고, WebSocket API로 실시간 가격 변동을 감지하는 방식.
6. 결론
- REST API는 요청이 있을 때만 데이터를 가져오는 방식 (게시판, 로그인 등).
- WebSocket API는 실시간으로 데이터를 주고받는 방식 (채팅, 게임, 실시간 주식 등).
- 두 개를 함께 사용할 수도 있음 (예: 로그인은 REST, 채팅은 WebSocket).
- 웹뿐만 아니라 일반 프로그램에서도 사용 가능.
쉽게 정리하면:
- REST API = "필요할 때만 물어보는 방식" (게시판, 로그인 등)
- WebSocket API = "계속 대화하는 방식" (채팅, 실시간 주식 데이터 등)
- 둘 다 함께 사용 가능

장고(Django) 기반의 웹사이트에서 REST API 서버와 WebSocket API 서버 만들기 |
1. Django에서 REST API와 WebSocket API를 함께 사용할 수 있을까?
✅ 가능합니다!
Django는 기본적으로 REST API를 지원하는 프레임워크는 아니지만,
📌 Django REST framework(DRF)를 사용하면 REST API를 쉽게 구현할 수 있습니다.
📌 Django Channels를 사용하면 WebSocket API도 구현할 수 있습니다.
즉, Django로 REST API와 WebSocket API를 동시에 운영하는 서비스 개발이 가능합니다.
예를 들어, 게시판은 REST API로 구현하고, 채팅 기능은 WebSocket API로 구현하는 식으로 사용할 수 있습니다.
2. Django에서 REST API 서버 개발하기
Django에서 REST API 서버를 만들려면 Django REST framework(DRF)를 사용합니다.
(1) Django REST framework 설치
터미널에서 다음 명령어를 실행합니다.
pip install djangorestframework
(2) Django 설정 파일 수정 (settings.py)
INSTALLED_APPS = [
'rest_framework', # DRF 추가
]
(3) 간단한 REST API 예제 (게시판)
# views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
@api_view(['GET'])
def hello_api(request):
return Response({"message": "Hello, REST API!"})
(4) URL 설정 (urls.py)
from django.urls import path
from .views import hello_api
urlpatterns = [
path('api/hello/', hello_api), # REST API 엔드포인트
]
✅ 이제 http://127.0.0.1:8000/api/hello/ 에 접속하면 JSON 응답을 받을 수 있습니다.
3. Django에서 WebSocket API 개발하기
Django는 기본적으로 WebSocket을 지원하지 않지만, Django Channels 라이브러리를 사용하면 WebSocket API를 쉽게 만들 수 있습니다.
(1) Django Channels 설치
pip install channels
(2) Django 설정 파일 수정 (settings.py)
INSTALLED_APPS = [
'channels', # Django Channels 추가
]
ASGI_APPLICATION = "myproject.asgi.application" # ASGI 설정 추가
(3) WebSocket 소비자(Consumer) 생성 (consumers.py)
# consumers.py
import json
from channels.generic.websocket import WebsocketConsumer
class ChatConsumer(WebsocketConsumer):
def connect(self):
self.accept() # 클라이언트 연결 허용
def disconnect(self, close_code):
pass # 연결 종료 시 동작
def receive(self, text_data):
data = json.loads(text_data)
self.send(text_data=json.dumps({
'message': data['message']
}))
(4) WebSocket URL 설정 (routing.py)
from django.urls import re_path
from .consumers import ChatConsumer
websocket_urlpatterns = [
re_path(r'ws/chat/$', ChatConsumer.as_asgi()),
]
(5) WebSocket을 지원하는 ASGI 설정 (asgi.py)
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from myapp.routing import websocket_urlpatterns
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(websocket_urlpatterns),
})
✅ 이제 ws://127.0.0.1:8000/ws/chat/ 에 WebSocket 연결을 할 수 있습니다.
✅ WebSocket 연결 후 메시지를 보내면, 서버가 메시지를 받아 그대로 반환합니다.
4. Django 웹사이트에서 REST API와 WebSocket API를 함께 사용할 수 있을까?
✅ 네! 가능합니다.
📌 Django는 기본적으로 HTML 기반의 웹사이트를 제공합니다.
📌 여기에 REST API(DRF)를 추가하면 모바일 앱, 프론트엔드(Vue.js, React 등)에서도 API를 활용할 수 있습니다.
📌 WebSocket API(Django Channels)를 추가하면 실시간 기능(채팅, 실시간 알림, 주식 가격 변화 등)을 추가할 수 있습니다.
5. Django에서 REST API + WebSocket API를 함께 사용하는 예제
예제: Django 기반의 게시판 + 실시간 댓글 시스템
✅ REST API로 게시판 CRUD 구현
✅ WebSocket API로 실시간 댓글 업데이트 구현
1. 게시판 목록 조회 (REST API)
- URL: GET /api/posts/
- 응답(JSON):
[
{"id": 1, "title": "첫 번째 글"},
{"id": 2, "title": "두 번째 글"}
]
2. 게시판 상세 조회 (REST API)
- URL: GET /api/posts/1/
- 응답(JSON):
{
"id": 1,
"title": "첫 번째 글",
"content": "이것은 REST API로 조회한 게시글입니다."
}
3. 실시간 댓글 시스템 (WebSocket API)
- 사용자가 ws://127.0.0.1:8000/ws/comments/에 연결하면,
- 누군가 댓글을 남기면 실시간으로 데이터를 전달받음.
- 다른 사용자들에게도 즉시 전달됨.
- 예제 메시지:
{
"post_id": 1,
"username": "홍길동",
"comment": "좋은 글이네요!"
}
6. 결론
- ✅ Django는 REST API와 WebSocket API를 동시에 사용할 수 있음.
- ✅ Django REST framework(DRF) → REST API 개발 가능.
- ✅ Django Channels → WebSocket API 개발 가능.
- ✅ 함께 사용하면 일반적인 게시판(REST) + 실시간 댓글(WebSocket) 같은 서비스 개발 가능!
- ✅ 웹사이트뿐만 아니라 모바일 앱, 게임 서버에서도 사용 가능!

REST API 또는 WebSocket API를 제공하는 서버에 접속하여 데이터를 가져오기 |
1. REST API를 이용해서 서버에서 데이터 가져오기
REST API는 HTTP 요청을 보내고 응답을 받는 방식입니다.
주로 requests 라이브러리를 사용합니다.
📌 (1) REST API 요청 방법
import requests
# API 엔드포인트 (예제: 사용자 정보 가져오기)
url = "https://example.com/api/user/1"
# GET 요청 보내기
response = requests.get(url)
# 응답 데이터 출력
if response.status_code == 200: # HTTP 200이면 성공
data = response.json() # JSON 형식의 데이터를 가져옴
print("사용자 정보:", data)
else:
print("오류 발생:", response.status_code)
✅ 설명:
- requests.get(url): 해당 API 서버에 요청을 보냅니다.
- response.json(): 서버에서 반환한 데이터를 JSON 형식으로 변환합니다.
- status_code를 확인하여 요청이 성공했는지 판단합니다.
📌 (2) POST 요청으로 데이터 보내기
import requests
# API 엔드포인트
url = "https://example.com/api/user/"
# 보낼 데이터 (JSON 형식)
data = {
"name": "홍길동",
"email": "hong@example.com"
}
# POST 요청 보내기
response = requests.post(url, json=data)
# 응답 출력
print("응답 데이터:", response.json())
✅ 설명:
- requests.post(url, json=data): 데이터를 JSON 형식으로 API 서버에 보냅니다.
- 로그인, 회원가입, 글쓰기 등의 기능에서 POST 요청을 자주 사용합니다.
📌 (3) REST API의 한계
- 요청할 때마다 새로운 연결을 생성하기 때문에 실시간 데이터 전송이 어렵습니다.
- 실시간 기능이 필요한 경우 WebSocket을 사용해야 합니다.
2. WebSocket API를 이용해서 서버에서 데이터 가져오기
WebSocket API는 서버와 실시간으로 데이터를 주고받는 방식입니다.
파이썬에서는 websockets 라이브러리를 사용합니다.
📌 (1) WebSocket 서버에 연결하여 메시지 보내기
import asyncio
import websockets
async def connect_websocket():
uri = "wss://example.com/ws/chat/" # WebSocket 서버 주소
async with websockets.connect(uri) as websocket:
# 서버에 메시지 보내기
await websocket.send("안녕하세요, 서버!")
# 서버로부터 응답 받기
response = await websocket.recv()
print("서버 응답:", response)
# WebSocket 실행
asyncio.run(connect_websocket())
✅ 설명:
- websockets.connect(uri): WebSocket 서버에 연결합니다.
- websocket.send("안녕하세요, 서버!"): 서버로 메시지를 보냅니다.
- response = await websocket.recv(): 서버로부터 메시지를 받습니다.
- asyncio.run(connect_websocket()): 비동기적으로 WebSocket을 실행합니다.
📌 (2) WebSocket 서버에서 실시간 데이터 받아오기 (예: 실시간 채팅)
import asyncio
import websockets
async def receive_messages():
uri = "wss://example.com/ws/chat/"
async with websockets.connect(uri) as websocket:
while True:
message = await websocket.recv() # 서버에서 메시지 받기
print("받은 메시지:", message)
# 실행
asyncio.run(receive_messages())
✅ 설명:
- while True: 계속 서버로부터 메시지를 받는 무한 루프
- 실시간으로 데이터를 받아야 할 때 (예: 채팅, 주식 가격 업데이트) 사용
3. REST API vs WebSocket API 비교
구분 | REST API | WebSocket API |
연결 방식 | 요청-응답 후 연결 종료 | 연결 유지 (실시간 통신) |
사용 예제 | 로그인, 회원가입, 데이터 조회 | 채팅, 주식 데이터, 알림 시스템 |
데이터 전송 방식 | HTTP 요청 후 응답 받음 | 실시간으로 양방향 데이터 전송 가능 |
파이썬 사용 라이브러리 | requests | websockets |
4. REST API와 WebSocket API를 함께 사용하는 예제
✅ 예제: 로그인(REST API) + 실시간 메시지 수신(WebSocket API)
import requests
import asyncio
import websockets
# 1️⃣ REST API로 로그인 요청
login_url = "https://example.com/api/login/"
login_data = {"username": "user1", "password": "pass123"}
response = requests.post(login_url, json=login_data)
if response.status_code == 200:
print("로그인 성공!", response.json())
# 2️⃣ 로그인 성공 후 WebSocket 연결하여 실시간 메시지 받기
async def receive_messages():
uri = "wss://example.com/ws/messages/"
async with websockets.connect(uri) as websocket:
while True:
message = await websocket.recv()
print("실시간 메시지:", message)
asyncio.run(receive_messages())
else:
print("로그인 실패:", response.status_code)
✅ 설명:
- REST API(requests.post)를 사용해 로그인 요청
- 로그인 성공 시 WebSocket API(websockets.connect)로 실시간 메시지 수신
5. 결론
- REST API로 데이터를 요청하고 WebSocket API로 실시간 데이터를 받을 수 있습니다.
- 파이썬에서는 requests(REST)와 websockets(WebSocket)를 사용하여 데이터를 가져올 수 있습니다.
- REST API는 요청할 때만 데이터를 가져오지만, WebSocket API는 서버와 실시간으로 데이터를 주고받을 수 있습니다.
- 둘을 함께 사용하면 로그인, 게시판, 실시간 채팅 등 다양한 기능을 만들 수 있습니다.

A 회사에서 제공해주는 파이썬 웹소켓 api를 이용해서 A 회사에 접속해서 데이터를 주고 받기 위해서는 장고의 views.py에서 그 api를 이용해서 프로그램을 작성해서 가져오는 것이 아니고, 운영체제(윈도우 또는 리눅스 등) 위에서 돌아가는 파이썬으로 작성된 일반 응용 프로그램을 개발해서 그 프로그램을 이용해서 데이터를 주고 받아야 하는 것이군요. |
네, 맞습니다! 😊
A 회사에서 제공하는 WebSocket API를 이용해서 데이터를 주고받으려면, Django의 views.py가 아니라, 일반 파이썬 응용 프로그램을 만들어야 합니다.
✅ Django views.py에서는 WebSocket API를 직접 사용할 수 없는 이유
- Django의 views.py는 HTTP 요청을 처리하는 곳입니다.
- 하지만 WebSocket은 HTTP가 아니라 실시간 통신 방식이므로 views.py에서 직접 사용할 수 없습니다.
- WebSocket을 사용하려면 운영체제에서 실행되는 별도의 파이썬 프로그램이 필요합니다.
✅ 운영체제에서 실행되는 WebSocket 클라이언트 프로그램 만들기
A 회사가 제공하는 WebSocket API에 접속하여 데이터를 주고받는 일반 파이썬 프로그램을 만들면 됩니다.
예를 들어, A 회사에서 WebSocket API 주소가
📌 wss://api.companyA.com/data
라고 하면, 아래와 같은 파이썬 프로그램을 작성해야 합니다.
📌 (1) WebSocket 클라이언트 예제 (Python)
import asyncio
import websockets
async def connect_to_companyA():
uri = "wss://api.companyA.com/data" # A 회사 WebSocket API 주소
async with websockets.connect(uri) as websocket:
# 서버에 메시지 보내기
await websocket.send('{"request": "get_data"}')
# 서버에서 응답 받기
response = await websocket.recv()
print("A 회사로부터 받은 데이터:", response)
# 프로그램 실행
asyncio.run(connect_to_companyA())
✅ 이제 이 프로그램을 실행하면
- A 회사의 WebSocket 서버(wss://api.companyA.com/data)에 연결합니다.
- {"request": "get_data"} 메시지를 보내 데이터를 요청합니다.
- A 회사에서 데이터를 보내주면 이를 출력합니다.
이 프로그램은 Django와 상관없이 독립적으로 실행되는 파이썬 프로그램입니다.
즉, 운영체제에서 실행되는 일반 프로그램입니다. 💡
✅ Django 프로젝트와 WebSocket 클라이언트 프로그램을 함께 사용할 수도 있음
- WebSocket API를 이용하는 일반 파이썬 프로그램을 만든다.
- 그 데이터를 Django의 views.py에서 사용할 수 있도록 데이터베이스에 저장한다.
- Django 웹사이트에서 데이터를 조회해서 표시한다.
이렇게 하면 Django 웹사이트에서도 WebSocket 데이터를 활용할 수 있습니다! 🚀

그럼 그냥 socket 클라이언트 프로그램인데, 왜 websocket이라고 이름을 붙였을까요? |
좋은 질문입니다! 😊
사실 WebSocket은 "Socket"의 한 종류입니다.
그럼에도 불구하고 특별히 "WebSocket"이라는 이름이 붙은 이유는 웹 환경에서 동작하는 특수한 소켓 프로토콜이기 때문입니다.
✅ 1. 일반 소켓 (TCP Socket) vs. 웹소켓 (WebSocket)
일반 소켓 (TCP/UDP Socket) | 웹소켓 (WebSocket) | |
프로토콜 | TCP 또는 UDP | WebSocket 프로토콜 (WS/WSS) |
연결 방식 | 클라이언트와 서버가 직접 연결 | HTTP를 통해 연결을 시작한 후 WebSocket으로 업그레이드 |
사용 환경 | 네트워크 프로그램, 게임 서버, 채팅 | 웹 브라우저, 웹 서비스 (실시간 데이터) |
데이터 형식 | 바이너리(주로) 또는 텍스트 | JSON, 텍스트, 바이너리 지원 |
연결 과정 | 바로 TCP/UDP 연결 | 먼저 HTTP로 연결 후 "WebSocket 프로토콜"로 변경 |
✅ 2. 왜 "WebSocket"이라는 이름이 붙었을까?
- 웹 환경에서 사용하기 위해 만들어진 소켓이기 때문입니다.
- 기존 TCP 소켓을 웹 브라우저에서 직접 사용하려면 보안 문제(방화벽 차단 등)가 많았습니다.
- 이를 해결하기 위해 HTTP를 이용해서 안전하게 연결한 후 WebSocket으로 전환하는 방식이 나왔습니다.
- 즉, "웹(Web)"에서 사용할 수 있도록 최적화된 소켓이므로 WebSocket이라는 이름이 붙었습니다.
- 기본적으로 HTTP와 함께 동작합니다.
- WebSocket은 처음에 HTTP 요청을 보내고, 서버가 "WebSocket 업그레이드(Upgrade)"를 허용하면 WebSocket 연결이 맺어집니다.
- 따라서 웹 브라우저에서도 쉽게 사용할 수 있습니다.
- 방화벽과 프록시 문제를 해결하기 위해 설계되었습니다.
- 일반 TCP 소켓은 방화벽이나 네트워크 정책에 따라 차단될 수 있습니다.
- WebSocket은 기본적으로 HTTP 80번 포트(WS) 또는 HTTPS 443번 포트(WSS)를 사용하기 때문에 방화벽에 쉽게 차단되지 않습니다.
✅ 3. WebSocket 연결 과정
일반 TCP 소켓은 바로 연결을 맺지만, WebSocket은 HTTP를 통해 연결을 시작한 후 WebSocket으로 전환(Upgrade) 합니다.
📌 WebSocket 연결 과정
1️⃣ 클라이언트가 HTTP 요청을 보냄
GET /ws/chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9YZrd4w==
Sec-WebSocket-Version: 13
2️⃣ 서버가 WebSocket 업그레이드를 허용
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
3️⃣ 이제부터 WebSocket 연결이 유지되며 양방향 통신 가능! 🚀
✅ 4. WebSocket이 필요한 이유
기존에는 HTTP Polling, Long Polling, Server-Sent Events(SSE) 같은 방식으로 실시간 데이터를 주고받았지만, 이 방식들은 다음과 같은 단점이 있었습니다.
🔴 HTTP Polling → 서버에 반복적으로 요청을 보내기 때문에 성능 비효율적
🔴 Long Polling → 클라이언트가 응답을 받을 때까지 대기하므로 지연 발생
🔴 SSE (Server-Sent Events) → 서버에서만 데이터를 보낼 수 있고 클라이언트는 보낼 수 없음
✅ WebSocket을 사용하면?
- 서버와 클라이언트가 지속적으로 연결된 상태에서 실시간 데이터 전송 가능
- 불필요한 요청/응답 과정이 없고 성능이 뛰어남
✅ 5. 결론
🔹 WebSocket은 기존의 TCP 소켓과는 다르게 웹 환경에서도 쉽게 사용할 수 있도록 설계된 소켓 기술입니다.
🔹 처음에는 HTTP로 연결한 뒤, Upgrade: websocket을 통해 WebSocket 프로토콜로 변경되기 때문에 웹과 연동이 쉬움.
🔹 따라서, 이름이 "WebSocket"인 이유는 웹에서 쉽게 사용할 수 있도록 만든 특수한 소켓이기 때문! 😊
※ 주의사항 : 일부 내용은 ChatGPT와 나눈 대화를 정리한 것이므로 이 점을 고려해서 읽으시기를 권장합니다.
Welcome to Python.org
The official home of the Python Programming Language
www.python.org
'컴퓨터에서는' 카테고리의 다른 글
[ Rust ] 초급 문법 : 4. 조건문 (if, else, else if) – 조건에 따라 코드 실행 (2) | 2025.03.16 |
---|---|
인공지능을 활용해서 무료 챗봇을 만들 수 있는 방법이 있나요? (2) | 2025.03.14 |
[ Rust ] 초급 문법 : 3. 함수 (fn) – 함수 선언 및 매개변수, 반환값 사용법 (0) | 2025.03.11 |
[ Rust ] 초급 문법 : 2. 데이터 타입 – 정수, 부동소수점, 불리언, 문자, 튜플, 배열 등 기본 타입 (0) | 2025.03.07 |
[ Rust ] 초급 문법 : 1. 변수와 상수 (let, const) – 변수와 상수를 선언하는 방법 (2) | 2025.03.06 |
댓글