카테고리 없음
💡 PyQt6 + FastAPI + MongoDB로 중복 실행 방지 프로그램 만들기
idea9329
2025. 6. 15. 18:49
반응형
✅ 개요
여러 개의 클라이언트 프로그램이 동시에 실행될 때, 기존에 실행된 인스턴스를 자동으로 종료시키는 기능은 시스템 보안이나 안정성을 위해 매우 중요합니다.
이번 글에서는 FastAPI와 MongoDB, PyQt6를 활용하여 중복 실행 시 기존 연결을 끊는 클라이언트-서버 구조를 만들어봅니다.
🧱 사용 기술
- FastAPI: 비동기 REST API 서버
- MongoDB: 연결 상태를 저장할 NoSQL 데이터베이스
- PyQt6: GUI 클라이언트 인터페이스
- UUID: 고유 토큰 발급
- QTimer: 주기적인 상태 점검
🧩 전체 구조 설명
1. FastAPI 서버
- /connect: 접속 요청 시 기존 세션 제거 후 새 토큰 저장
- /disconnect: 해당 클라이언트 토큰 제거
- /is_alive: 현재 토큰이 여전히 유효한지 확인
2. MongoDB
- 연결된 클라이언트 토큰을 저장
- 컬렉션: connections
- 필드: token, connected_at
3. PyQt6 클라이언트
- 실행 시 고유 토큰 생성 후 서버에 등록
- 다른 인스턴스 실행되면 본인은 3초마다 체크 → 자동 종료
⚙️ 동작 순서
- 클라이언트 실행 → UUID 발급 → FastAPI로 전송
- 서버는 기존 세션(기존 토큰)을 모두 삭제하고 새 토큰 저장
- 클라이언트는 3초마다 is_alive 요청
- 본인의 토큰이 삭제되었으면 자동으로 QMessageBox 경고 후 종료
🧪 코드 요약
FastAPI 예시 (server.py)
@app.post("/connect")
async def connect(token_data: TokenModel):
collection.delete_many({})
collection.insert_one({"token": token_data.token, "connected_at": datetime.utcnow()})
@app.post("/is_alive")
async def is_alive(token_data: TokenModel):
return {"alive": collection.find_one({"token": token_data.token}) is not None}
PyQt6 클라이언트 예시
def uP_CheckTokenAlive(self):
response = requests.post(.../is_alive...)
if not result.get("alive"):
QMessageBox.warning(self, "Disconnected", "다른 인스턴스가 실행되어 종료됩니다.")
self.uP_Disconnect()
🚀 실행 방법
# 가상환경 생성 및 진입
python -m venv venv
.\venv\Scripts\activate
# 패키지 설치
pip install fastapi uvicorn pymongo pyqt6 requests
# 서버 실행
python -m uvicorn server:app --reload
# 클라이언트 실행
python client_main.py
✅ 활용 예시
- 보안상 다중 로그인 방지
- 라이선스 정책 위반 방지
- 실시간 동시 접속 관리
🏁 마무리
이 시스템은 간단하지만 강력한 중복 실행 방지 구조를 제공합니다.
FastAPI로 API 서버를 빠르게 구성하고, MongoDB를 통해 상태를 관리하며, PyQt6로 GUI 인터페이스를 구성함으로써 모던하고 확장 가능한 구조를 구현할 수 있습니다.
반응형