서비스
교육 철학

Network and IO (네트워크 및 입출력)

Abstract

📌
게임이 인터넷과 주고받는 방식 세 가지 — 한 번 묻고 답 받기(WebRequest), 파일 받아 저장하기(Download), 연결을 유지하며 계속 주고받기(Network) — 를 한 페이지에서 소개합니다. 셋은 용도가 다르지만 뼈대가 같습니다: 요청을 넣으면 번호가 돌아오고, 정해진 수의 일꾼이 순서대로 처리하며, 결과는 이벤트로 옵니다.
셋 중 무엇이 필요한가
graph TD
    Q1{"서버와 무엇을 하나?"}
    Q1 -- "API 를 부르고 응답을 받는다<br>(로그인, 랭킹, 상점)" --> W["WebRequest"]
    Q1 -- "큰 파일을 받아 디스크에 둔다" --> D["Download"]
    Q1 -- "접속을 유지하며 실시간으로 주고받는다" --> Q2{"지연에 얼마나 민감한가?"}
    Q2 -- "턴제, 채팅, MMO 정도" --> N["Network (TCP)"]
    Q2 -- "FPS, 격투, 레이싱" --> X["이 프레임워크 밖의 UDP 솔루션"]
Mermaid
복사
대부분의 싱글플레이 게임은 WebRequest 하나로 끝납니다. Download 는 추가 콘텐츠가, Network 는 자체 실시간 서버가 있을 때만 필요합니다.
세 모듈의 공통 사용법
WebRequest
Download
Network
시작
AddWebRequest(uri)
AddDownload(저장 경로, uri)
CreateNetworkChannel → Connect
돌아오는 것
요청 번호
요청 번호
채널 객체
동시 처리 수
에이전트 수 (기본 1)
에이전트 수 (기본 3)
채널마다 연결 하나
성공 이벤트
WebRequestSuccessEventArgs
DownloadSuccessEventArgs
NetworkConnectedEventArgs • 패킷 핸들러
취소
RemoveWebRequest(id)
RemoveDownload(id)
channel.Close()
게임 코드가 채워야 할 것
없음
없음
INetworkChannelHelper 구현 필수
앞의 둘은 프레임워크가 다 해 주므로 바로 쓸 수 있고, Network 만 패킷 형식을 정하는 헬퍼를 직접 만들어야 합니다.
ToyboxNightmare 에서는
세 모듈 모두 쓰지 않습니다. 오프라인 싱글플레이 게임입니다. 온라인 기능을 붙인다면 가장 자연스러운 첫걸음은 게임오버 시 최고 점수를 WebRequest 로 올리는 것이고, 그 예제 코드는 Unity 쪽 Networking and I/O (네트워킹 & 입출력) 페이지에 있습니다.
⚠️
본문을 읽을 때 주의할 점
•
본문 예제의 webRequestManager.WebRequestSuccess += ... 는 코어의 C# 이벤트입니다. 게임 코드에서는 GameEntry.GetComponent<EventComponent>().Subscribe(WebRequestSuccessEventArgs.EventId, handler) 로 받습니다.
•
이벤트는 전역이라 다른 코드가 넣은 요청의 결과도 같이 들어옵니다. Add… 가 돌려준 번호와 SerialId 를 비교해 자기 것만 처리합니다.
•
Network 의 재연결은 자동이 아닙니다. 본문에 "자동으로 … 재연결"이라고 적혀 있던 문장을 고쳤습니다.
•
WebRequest 는 GET 과 POST 만 지원합니다(postData 를 주면 POST, 없으면 GET). 요청 헤더를 붙이는 API 도 없습니다. PUT / DELETE 나 인증 헤더가 필요하면 WebRequestAgentHelperBase 를 상속한 헬퍼를 만들어 userData 로 넘긴 정보를 읽어 처리하게 합니다.
•
세 모듈 모두 "비동기"이지만 메인 스레드의 Update 에서 조금씩 진행됩니다. 별도 스레드가 아닙니다(Network 의 소켓 수신만 예외적으로 .NET 의 비동기 소켓 콜백을 씁니다).

Network and IO (네트워크 및 입출력)

관련 소스 파일

•
GameFramework/Download/DownloadAgentHelperCompleteEventArgs.cs
•
GameFramework/Download/DownloadAgentHelperUpdateBytesEventArgs.cs
•
GameFramework/Download/DownloadAgentHelperUpdateLengthEventArgs.cs
•
GameFramework/Download/DownloadManager.DownloadAgent.cs
•
GameFramework/Download/DownloadManager.DownloadCounter.DownloadCounterNode.cs
•
GameFramework/Download/DownloadManager.DownloadCounter.cs
•
GameFramework/Download/DownloadManager.cs
•
GameFramework/Download/DownloadStartEventArgs.cs
•
GameFramework/Download/DownloadSuccessEventArgs.cs
•
GameFramework/Download/DownloadUpdateEventArgs.cs
•
GameFramework/Download/IDownloadAgentHelper.cs
•
GameFramework/Download/IDownloadManager.cs
•
GameFramework/Network/INetworkChannel.cs
•
GameFramework/Network/INetworkChannelHelper.cs
•
GameFramework/Network/INetworkManager.cs
•
GameFramework/Network/IPacketHeader.cs
•
GameFramework/Network/NetworkManager.cs
•
GameFramework/WebRequest/IWebRequestManager.cs
•
GameFramework/WebRequest/WebRequestManager.cs

소개

Network 및 IO 시스템은 게임 애플리케이션이 네트워크 연결, 파일 다운로드, 웹 요청 등을 수행할 수 있도록 지원합니다.
이는 온라인 기능 구현, 게임 콘텐츠 업데이트, 원격 서버와의 데이터 교환을 위해 필수적입니다.

개요

GameFramework의 Network 및 IO 시스템은 크게 세 가지 컴포넌트로 이루어져 있습니다:
1.
Network System: 패킷 기반 TCP 소켓 통신 관리
2.
Download System: 파일 다운로드 및 진행 상황 추적, 이어받기 지원
3.
Web Request System: HTTP 요청/응답 관리 (가벼운 서버 통신용)
각 시스템은 공통적으로 다음과 같은 아키텍처 패턴을 따릅니다:
•
중앙 Manager 클래스 (GameFrameworkModule 구현)
•
동시 작업 처리를 위한 Agent/Channel 풀
•
플랫폼별 구현을 위한 Helper 인터페이스
•
이벤트 기반 상태 변경 알림

Network System

네트워크 시스템은 TCP 소켓 기반 통신을 제공합니다.
여러 개의 독립적인 네트워크 채널, 하트비트 모니터링, 패킷 직렬화, 에러 처리 등을 지원합니다.

아키텍처

•
핵심 클래스: NetworkManager
•
여러 네트워크 채널을 관리 (각 채널은 소켓 연결 단위이며 이름으로 식별)
•
지원 서비스 타입:
◦
TCP: 일반 TCP 소켓 통신
◦
TCP with Sync Receive: 동기식 수신을 포함한 TCP
•
INetworkChannelHelper: 패킷 직렬화/역직렬화 및 하트비트 관리 등 플랫폼별 구현 제공

사용 흐름

1.
네트워크 채널 생성 (고유 이름과 Helper 지정)
2.
패킷 핸들러 등록
3.
원격 서버 연결
4.
패킷 송수신
5.
필요 시 채널 닫기
하트비트 타이머와 에러 보고는 자동으로 처리합니다. 재연결은 자동이 아닙니다 — 연결이 끊기면 NetworkClosed 이벤트를 받아 게임 코드가 직접 Connect 를 다시 불러야 합니다.

Download System

다운로드 시스템은 파일 다운로드를 관리하며, 진행 상황 추적, 우선순위 지정, 에러 처리 등을 지원합니다.

아키텍처

•
핵심 클래스: DownloadManager
•
다운로드 작업(Task) 풀과 다운로드 속도 카운터 유지
•
개별 다운로드는 DownloadAgent가 담당하며, 플랫폼별 작업은 IDownloadAgentHelper가 구현

다운로드 과정

1.
클라이언트 코드에서 다운로드 작업 추가 (경로 및 URI 지정)
2.
매니저가 작업을 풀에 등록
3.
사용 가능한 에이전트가 작업 시작, 파일 스트림 열기
4.
헬퍼가 실제 다운로드 수행
5.
데이터 수신 → 파일에 기록, 진행 상황 추적
6.
이벤트 발생: 시작, 진행, 성공, 실패
주요 기능:
•
이어받기 지원 (부분 다운로드 재개)
•
다운로드 속도 추적 (시간 기반 카운터)
•
우선순위 부여 (다운로드 순서 제어)
•
태그 기반 다운로드 그룹화
•
버퍼 크기 설정 (디스크 기록 제어)

Web Request System

웹 요청 시스템은 서버와의 HTTP 통신을 처리합니다.
데이터 조회, 정보 전송 등 가벼운 네트워크 작업에 적합합니다.

아키텍처

•
핵심 클래스: WebRequestManager
•
요청을 처리하는 WebRequestAgent 풀 관리
•
플랫폼별 구현은 IWebRequestAgentHelper 제공

사용 예시

// GET 요청 int requestId = webRequestManager.AddWebRequest("https://example.com/api/data"); // POST 요청 byte[] postData = Encoding.UTF8.GetBytes("key=value"); int requestId = webRequestManager.AddWebRequest("https://example.com/api/submit", postData); // 응답 이벤트 핸들링 webRequestManager.WebRequestSuccess += OnWebRequestSuccess; webRequestManager.WebRequestFailure += OnWebRequestFailure;
C#
복사
지원 기능:
•
GET / POST 요청
•
요청 태깅 (그룹 관리)
•
우선순위 제어
•
요청 타임아웃 관리

공통 패턴

Task Pool 패턴

모든 시스템은 작업 풀을 이용해 동시 작업을 관리:
•
작업 생성 → 큐잉(우선순위 기반) → Agent 할당 → 상태 추적

Agent-Helper 패턴

•
Manager: 전체 관리 및 고수준 작업 처리
•
Agent: 개별 작업 담당
•
Helper Interface: 플랫폼 독립적 계약 정의
•
Helper Implementation: 플랫폼별 구체 구현
→ 일관된 인터페이스, 플랫폼별 확장 용이, 테스트/모킹 가능

이벤트 기반 알림

모든 시스템은 이벤트로 상태를 알림:
•
시작(Start) 이벤트
•
진행(Update) 이벤트
•
성공(Success) 이벤트
•
실패(Failure) 이벤트
→ 클라이언트 코드는 구현에 강하게 결합되지 않고 상태에 반응 가능

요약

Network & IO 시스템은 네트워크 통신, 파일 다운로드, 웹 요청을 위한 종합적인 도구를 제공합니다.
일관된 패턴과 관심사의 분리를 통해 사용과 확장이 용이합니다.
시스템
주요 클래스
목적
핵심 기능
Network
NetworkManager
소켓 기반 통신
다중 채널, 패킷 직렬화, 하트비트
Download
DownloadManager
파일 다운로드
이어받기, 속도 추적, 우선순위
Web Request
WebRequestManager
HTTP 요청/응답 관리
GET/POST, 타임아웃, 태깅
이 시스템들은 GameFramework 기반 게임에서 온라인 플레이, 콘텐츠 업데이트, 서버 통신의 기초를 이룹니다.