유니티 엔진 - 게임 프로젝트/데디케이트 기반 모바일 게임

서버 - 최종) 서버의 패킷 처리 구조 설계

monstro 2025. 11. 18. 20:33
728x90
반응형

- 개요

이전과 동일하게 DI 컨테이너를 사용하여 클라이언트에게 전송받은 패킷별핸들링하는 구조를 설계한다

이때 각각의 패킷을 핸들링하는 핸들러 클래스사용자 정의 어트리뷰트를 사용하여 지정한다

 

- 서버 사이드

1) HandlerRegisterAttribute 클래스

 

HandlerRegisterAttribute 클래스패킷 핸들러마다 무슨 패킷을 핸들링할지 설정한다

사용자 정의 어트리뷰트 형태로 사용하며 어트리뷰트로 지정된 패킷을 핸들링한다

  • AttributeUsage 어트리뷰트 : AttributeTargets.Class 속성을 설정하여 클래스에서만 사용하도록 설정
  • System.Attribute를 상속받아 어트리뷰트 클래스로 사용

 

생성자에서는 PacketType을 인자로 받아 프로퍼티를 설정한다

프로퍼티를 사용하여 해당 어트리뷰트가 수식된 핸들러어떤 종류의 패킷을 처리해야 하는지 설정한다

 

2) IPacketHandler 클래스

 

IPacketHandler 클래스패킷 핸들러 클래스들이 상속받아야 하는 인터페이스로 사용한다

자식 클래스들은 Handle 추상 함수를 오버라이드해야 한다

 

3) AuthRequestHandler 클래스

 

AuthRequestHandler 클래스클라이언트의 패킷 중에서 AuthRequest 패킷을 처리하는 핸들러 클래스이다

따라서 HandleRegister 어트리뷰트에 PacketType.AuthRequest 속성을 사용한다

Handle 함수의 로직은 따로 오버라이드하지 않았다

 

4) HandlerRegistry 클래스

 

HandleRegistry 클래스는 이전의 PacketRegistry 클래스와 동일하게

네트워크 통신에서 패킷들에 대한 타입별 패킷에 대한 핸들러 클래스의 타입관리하고 등록하는 역할을 수행한다

멤버변수의 구성은 위와 같다

  • _handlers 딕셔너리 : 패킷의 타입인 PacketType Key로, 핸들러 클래스의 Type Value로 저장
  • Handlers프로퍼티 : _handlers 초기화되지 않았다 Initialize 함수를 호출하고, 아니라면 반환

 

 

Initialize 함수를 호출하여 리플렉션을 통해 패킷의 타입핸들러의 등록 작업을 진행한다

로직은 다음과 같다

  • 현재 어플리케이션의 모든 클래스 타입을 가져와서 다음의 조건으로 필터링한다
    • 추상 클래스 + 제네릭 클래스가 아님
    • IPacketHandler 인터페이스를 상속받았는지 확인
    • HandlerRegisterAttribute 어트리뷰트를 사용하였는지 확인

 

이후 필터링된 (핸들러 클래스의 Type, HandlerRegisterAttribute 어트리뷰트)의 형태의 튜플들을 순회하면서

어트리뷰트에 정의된 PacketTypeKey로, 핸들러 클래스의 TypeValue로 저장한다

 

5) ExServiceCollections 클래스

 

ExServiceCollections 클래스DI 컨테이너모든 핸들러 클래스들을 등록하기 위해

AddPacketHandlers 익스텐선 함수를 갖고 있도록 구성한다

현재 애플리케이션에 속해있는 모든 패킷 핸들러 클래스들을 가져와 Scoped 수명 주기로 DI 컨테이너에 등록한다

 

6) Container 클래스

 

ConfigureServices 함수를 위와 같이 수정하여

애플리케이션을 동작시키기 위한 서비스에 다음의 서비스를 추가한다

  • 패킷 핸들러의 타입 설정을 수행하는 싱글톤의 생성
  • 패킷 핸들러들의 DI 컨테이너 등록

 

7) NetworkServer 클래스

 

RessolveHandler 함수를 위와 같이 정의한다

주입된 DI 컨테이너를 통해 HandlerRegistry 싱글톤을 가져와 저장한다

저장한 싱글톤의 Handlers를 탐색하여 전달받은 패킷 핸들러 클래스의 Type 정보를 가져와 저장한다

가져온 핸들러 클래스의 Type 정보로 서비스 인스턴스를 생성하여 반환한다

 

 

OnNetworkReceive 함수에서 기존의 코드의 주석을 해제한다

 

- 최종 실행 결과

728x90
반응형