-
최초 작성: 2026-02-26
-
최종 업데이트: 2026-03-02
-
기준 리포지토리:
NetworkModuleTest -
분석 기준:
ServerEngine,TestServer,DBServer실제 구현 코드 -
목적: 네트워크 처리, 비동기 처리, DB 처리의 현재 구조와 데이터 흐름을 코드 기준으로 정리
| 항목 | 상태 |
|---|---|
| Windows 1000 클라이언트 RIO | PASS (Server WS 143.6 MB) |
| Linux Docker epoll | PASS (kernel 6.6.87.2-WSL2) |
| Linux Docker io_uring | PASS (kernel 6.6.87.2-WSL2) |
| 비동기 고도화 (A~E) | 완료 (KeyedDispatcher, TimerQueue, AsyncScope, 백프레셔, EventBus) |
| AsyncScope 풀 재사용 버그 | 수정 완료 (Reset() 추가) |
이 프로젝트는 INetworkEngine(상위 추상화)와 AsyncIOProvider(하위 플랫폼 백엔드)로 분리된 2계층 구조를 사용한다.
- 네트워크 처리: 플랫폼별 엔진(Windows/Linux/macOS)이 수락/완료 이벤트를 처리하고, 공통 로직은
BaseNetworkEngine이 담당 - 비동기 처리: I/O 워커 스레드 + 로직 스레드풀 + DB 전용 작업큐(
DBTaskQueue,OrderedTaskQueue)로 역할 분리 - DB 처리:
IDatabase추상화 위에SQLite/Mock/ODBC구현을 두고, TestServer는 비동기 큐 기반으로 DB 작업을 오프로딩
핵심 특징:
- Windows: RIO 우선, 실패 시 IOCP 폴백
- Linux: io_uring 우선, 실패 시 epoll 폴백
- macOS: kqueue
- TestServer의 접속/종료 DB 기록은 이벤트 핸들러 ->
DBTaskQueue경로로 비동기 처리 - 종료 시
DBTaskQueue드레인 -> DB 해제 -> 네트워크 종료 순서로 graceful shutdown 수행
- TestServer가
ConnectToDBServer()로 별도 소켓 연결(Windows) TimerQueue::ScheduleRepeat()가SendDBPing()을 주기 호출- TestDBServer가
ServerPongRes응답 - 주기적으로
PKT_DBSavePingTimeReq전송/응답 - 끊김 시
DBReconnectLoop재시도
관련 코드:
- 연결/스레드 시작:
Server/TestServer/src/TestServer.cpp:336 - ping 스케줄링:
.../TestServer.cpp:430 - DBServer 패킷 처리:
Server/DBServer/src/ServerPacketHandler.cpp:116
Stop()에서 아래 순서를 지킨다.
- DB 재연결 루프 깨움 및 join
- 연결 중 세션의 disconnect 기록 enqueue
DBTaskQueue->Shutdown()으로 큐 드레인- 로컬 DB disconnect
- DB 서버 소켓 disconnect
- 클라이언트 엔진 stop
코드 포인트:
- 전체 순서:
Server/TestServer/src/TestServer.cpp:165
- 네트워크 엔진 stop
- OrderedTaskQueue shutdown(남은 작업 처리)
- ServerLatencyManager shutdown
코드 포인트:
Server/DBServer/src/TestDBServer.cpp:160
- 네트워크/로직/DB 비동기 경로 분리 명확
- 플랫폼 폴백 체인과 공통 추상화 정리됨
DBTaskQueueWAL 복구로 종료/크래시 안정성 강화- 재연결 정책(ECONNREFUSED 분리)으로 운영 복원력 확보
TestServer의 DB 서버 소켓 경로는 Windows 전용 (#ifdef _WIN32)TestDBServer기본 경로는 현재 DB 주입 없음 -> 영구 DB 저장은 비활성(log-only)- TestDBServer 기본 포트(코드 기본 8001)와 실행 스크립트 포트(문서/스크립트에서 8002 사용 가능) 혼동 위험
TestDBServer에도 설정 기반 DB 주입(SetDatabase) 경로를 main 옵션으로 연결- TestServer의 DB 서버 연결 경로를 플랫폼 공통 소켓/AsyncIO 경로로 통합
운영 문서에 "기본 실행 경로(TestDBServer) vs 실험 경로(DBServer.cpp)"를 명시(DBServer.cpp 제거 완료)- 포트 기본값(8001/8002) 정책을 코드/스크립트/문서에서 단일화