최근 몇 년간 웹 애플리케이션 개발에서 실시간 통신의 필요성이 증가하면서 WebSocket을 통한 실시간 애플리케이션의 개발이 주목받고 있습니다. FastAPI는 Python으로 만들어진 현대적인 웹 프레임워크로, 고성능 비동기 프로그래밍을 지원하여 실시간 채팅 애플리케이션 개발에 적합합니다. 본 글에서는 FastAPI를 활용하여 실시간 채팅 애플리케이션을 만드는 방법을 단계별로 설명하겠습니다.
1. FastAPI란?
FastAPI는 Python 3.6 이상에서 사용할 수 있는 웹 프레임워크로, RESTful API를 신속하게 구축할 수 있도록 도와줍니다. FastAPI는 다음과 같은 주요 특징이 있습니다:
- 고속성: Starlette를 기반으로 하고 있어 비동기 프로그래밍이 가능합니다.
- 자동화된 API 문서화: OpenAPI 스펙을 기반으로 자동화된 Swagger UI와 ReDoc 문서가 생성됩니다.
- 타입 힌트 지원: Python의 타입 힌트를 활용하여 오류를 사전에 방지하고, 가독성을 높입니다.
2. 개발 환경 설정
실시간 채팅 애플리케이션을 개발하기 위해서 먼저 개발 환경을 설정합니다. Python 3.x가 설치되어 있다고 가정하고, 필요한 패키지를 설치합니다.
pip install fastapi uvicorn websockets
3. FastAPI 애플리케이션 구조
프로젝트 디렉토리를 생성하고 기본 구조를 설정합니다.
mkdir fastapi_chat
cd fastapi_chat
touch main.py
main.py 파일 작성
이제 main.py
파일에 FastAPI 애플리케이션과 WebSocket 핸들러를 작성하겠습니다.
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
app = FastAPI()
# HTML 페이지를 반환하는 API
@app.get("/")
async def get():
return HTMLResponse(content="""
Chat Application
Chat Application
""")
# WebSocket 핸들러
connections = []
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
connections.append(websocket)
try:
while True:
data = await websocket.receive_text()
# 연결된 모든 클라이언트에게 메시지를 broadcast
for connection in connections:
await connection.send_text(data)
except WebSocketDisconnect:
connections.remove(websocket)
4. 코드 설명
위 코드는 FastAPI를 사용하여 기본적인 웹소켓 서버와 HTML 클라이언트를 구현한 것입니다. 간단히 설명해보겠습니다:
- FastAPI 인스턴스: 애플리케이션 객체를 생성합니다.
- HTML 반환:
get
함수는 클라이언트에게 HTML 페이지를 반환합니다. - WebSocket 핸들러:
/ws
엔드포인트는 클라이언트와의 실시간 연결을 관리합니다. - 메시지 브로드캐스트: 클라이언트가 서버에 메시지를 보낼 때, 연결된 모든 클라이언트에게 메시지를 전송합니다.
5. 애플리케이션 실행
애플리케이션을 실행하기 위해 터미널에서 다음 명령어를 입력합니다.
uvicorn main:app --reload
이제 브라우저에서 http://localhost:8000
에 접속하면 채팅 애플리케이션이 열립니다. 여러 개의 브라우저 탭을 열고 메시지를 보내보세요. 모든 탭에서 메시지가 실시간으로 표시되는 것을 확인할 수 있습니다.
6. 추가 기능 구현
기본적인 채팅 기능 외에도 여러 가지 기능을 추가할 수 있습니다. 예를 들어 사용자 이름, 메시지 이력 저장, 그리고 사용자별로 메시지 필터링 등을 구현할 수 있습니다.
6.1 사용자 이름 기능 추가
사용자가 채팅에 참여할 때 사용자 이름을 입력하게 할 수 있습니다. HTML 코드에 사용자 이름 입력란을 추가하고, 메시지를 전송할 때 이 사용자 이름을 포함시켜 보겠습니다.
HTMLResponse(content="""
Chat Application
Chat Application
""")
6.2 메시지 이력 저장
서버에서 전송된 메시지를 저장하여 사용자가 페이지를 새로고침 해도 이전 메시지를 볼 수 있도록 만들 수 있습니다. 이를 위해 메모리 내 저장소를 사용할 수 있는데, 더 나아가 데이터베이스 연결도 고려할 수 있습니다. 간단하게 메시지 리스트를 추가하고, 클라이언트가 연결할 때 이 메시지를 전송하는 방법을 구현해 보겠습니다.
messages = []
async def broadcast_message(message: str):
messages.append(message)
for connection in connections:
await connection.send_text(message)
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
connections.append(websocket)
try:
# 기존 메시지를 클라이언트에 전송
for message in messages:
await websocket.send_text(message)
while True:
data = await websocket.receive_text()
await broadcast_message(data)
except WebSocketDisconnect:
connections.remove(websocket)
7. 마무리
이번 글에서는 FastAPI를 사용하여 실시간 채팅 애플리케이션을 개발하는 방법에 대해 알아보았습니다. FastAPI의 비동기 기능을 활용하여 고성능의 실시간 웹 소켓 서버를 구축하고 클라이언트와의 안정적인 연결을 유지하는 법을 배웠습니다.
FastAPI는 강력하면서도 간단한 API 개발 도구로, 다양한 기능들을 확장하여 더욱 복잡한 애플리케이션을 구축할 수 있습니다. 추가적으로 데이터베이스와의 연결, 사용자 인증 및 인가, 그리고 서드파티 API와의 통합 등을 통해 발전시키기 바랍니다.
FastAPI를 통해 여러분의 아이디어를 실현해보세요! 학습과 경험을 통해 더욱 많은 애플리케이션을 개발할 수 있을 것입니다.
감사합니다.