카테고리 없음

💡 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초마다 체크 → 자동 종료

⚙️ 동작 순서

  1. 클라이언트 실행 → UUID 발급 → FastAPI로 전송
  2. 서버는 기존 세션(기존 토큰)을 모두 삭제하고 새 토큰 저장
  3. 클라이언트는 3초마다 is_alive 요청
  4. 본인의 토큰이 삭제되었으면 자동으로 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 인터페이스를 구성함으로써 모던하고 확장 가능한 구조를 구현할 수 있습니다.



반응형