fix : 코드 분석 후 버그 및 결함 16건 수정

- ARepository 전체 메서드 IDbConnection using 추가 (커넥션 풀 누수)
- GameServer NotImplementedException → 로그 출력으로 변경
- ServerBase Auth/Echo payload 길이 검증 주석 해제
- PacketSerializer MemoryStream using 추가 (양쪽 솔루션)
- PacketSerializer size 파라미터 제거, 자동 계산 + size 검증 구현
- ServerBase NetDataWriter cachedWriter 재사용 (GC 압력 감소)
- ServerBase isListening volatile 추가
- ServerBase Deserialize 실패 시 null payload 체크
- ServerBase Serilog 구조적 로깅 템플릿 구문 수정
- TestHandler 전체 메서드 try-catch 추가
- TestRepository IDbConnectionFactory 인터페이스로 변경
- DummyClients BodyLength 계산 불일치 수정
- DummyClients pendingPings 메모리 누수 방지
- EchoClientTester async void 이벤트 → 동기 Cancel()로 변경
- ANALYSIS.md 코드 분석 및 문제점 보고서 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-03 01:09:27 +09:00
parent d73487df5b
commit cf2be6b125
10 changed files with 339 additions and 91 deletions

View File

@@ -18,6 +18,7 @@ public class DummyClients
// seq → 송신 타임스탬프 (Stopwatch tick)
private ConcurrentDictionary<int, long> pendingPings = new();
private int seqNumber;
private const int MaxPendingPings = 1000;
// 통계
public int SentCount
@@ -104,9 +105,20 @@ public class DummyClients
int seq = seqNumber++;
pendingPings[seq] = Stopwatch.GetTimestamp();
// 응답 없는 오래된 ping 정리 (패킷 유실 시 메모리 누수 방지)
if (pendingPings.Count > MaxPendingPings)
{
int cutoff = seq - MaxPendingPings;
foreach (int key in pendingPings.Keys)
{
if (key < cutoff)
pendingPings.TryRemove(key, out _);
}
}
PacketHeader packetHeader = new PacketHeader();
packetHeader.Code = 0;
packetHeader.BodyLength = $"seq:{seq}".Length;
packetHeader.BodyLength = $"Echo seq:{seq}".Length;
writer.Put((short)packetHeader.Code);
writer.Put((short)packetHeader.BodyLength);
writer.Put($"Echo seq:{seq}");