# C++20 Sword Game Server Boost.Asio와 MySQL을 활용한 간단한 소켓 게임 서버 프로젝트입니다. ## 주요 기능 - C++20: jthread, stop_token, 코루틴(co_await) 사용 - 네트워크: Boost.Asio 기반 비동기 I/O 처리 - 데이터베이스: MySQL 연동을 통한 유저 데이터 영속성 관리 - 동기화: strand 및 비동기 락을 이용한 자원 보호 - 도커: Docker Compose를 이용한 서버 및 DB 환경 자동 구성 ## 사전 요구 사항 - g++ 14 or higher (C++20 support) - CMake 3.20+ - Boost 1.83+ - OpenSSL - MySQL/MariaDB Client ## 실행 방법 ### Docker 사용 데이터베이스와 서버를 한 번에 실행합니다. ```bash docker compose up -d ``` ### 로컬 빌드 ```bash # 빌드 환경 설정 ./setup.sh # 컴파일 cmake --build build # 서버 실행 ./build/Server ``` ## 아키텍처 구성 - NetworkService: io_context 관리 - Session: 개별 클라이언트 비동기 수신/송신 처리 - PacketHandler: 패킷 ID별 로직 디스패칭 - SessionManager: 글로벌 세션 관리 및 브로드캐스팅 - DatabaseManager: 비동기 데이터베이스 작업 및 락 제어 - Packet: Protobuf 기반 직렬화 프로토콜 (proto/Protocol.proto) ```mermaid flowchart TD Client("Python GUI Client") <-->|"Protobuf (Packet)"| NetworkService subgraph Server ["C++20 Sword Game Server"] NetworkService["NetworkService(io_context)"] SessionManager["SessionManager(글로벌 세션 관리 및 브로드캐스팅)"] Session["Session(개별 클라이언트 비동기 송수신)"] PacketHandler["PacketHandler(패킷 ID별 로직 디스패칭)"] DatabaseManager["DatabaseManager(비동기 DB 작업 및 락 제어)"] NetworkService -->|"Connection Accept"| Session SessionManager -.->|"Manage & Broadcast"| Session Session <-->|"Dispatch / Response"| PacketHandler PacketHandler <-->|"Request DB Operation"| DatabaseManager PacketHandler -->|"Broadcast Request"| SessionManager end DatabaseManager <-->|"SQL / 비동기 통신"| MySQL[(MySQL DB)] ``` ## Python GUI 클라이언트 [README.md](https://git.bumpsoo.dev/bumpsoo/sword_game/src/branch/main/client/README.md) ## TODO: 개선 사항 - DB Connection Pool 도입 - 기능은 구현 완료, DB 커넥션 늘려서 테스트 필요 (headless client?) - 검색 조회 기능 추가 (Mysql Full Text Search) - big endian 강제되게 수정