오늘의 학습 목표
오늘은 언리얼 엔진의 멀티플레이 구조를 이해하기 위해 다음 개념을 학습했다.
- 서버의 역할과 종류
- Listen Server와 Dedicated Server의 차이
- 현재 게임 인스턴스의 역할을 나타내는 NetMode
- 네트워크 통신을 관리하는 NetDriver
- 서버와 클라이언트의 연결을 표현하는 NetConnection
1. 언리얼 엔진의 서버 권한 구조
언리얼 엔진의 멀티플레이는 기본적으로 **서버 권한형 구조(Server Authority)**를 사용한다.
클라이언트가 이동이나 공격 같은 행동을 요청하더라도 최종 게임 상태는 서버가 결정한다. 서버에서 확정된 결과는 Replication을 통해 다른 클라이언트에 전달된다.
예를 들어 플레이어가 적을 공격한다면 다음과 같은 흐름으로 처리할 수 있다.
클라이언트 입력
↓
Server RPC 호출
↓
서버에서 공격 가능 여부 검증
↓
서버가 체력 변경
↓
변경된 체력이 각 클라이언트로 Replication
클라이언트의 값을 그대로 신뢰하지 않고 서버가 결과를 판단하기 때문에 치팅과 데이터 불일치를 줄일 수 있다.
2. 서버의 종류
Listen Server
Listen Server는 한 명의 플레이어가 서버이면서 동시에 클라이언트 역할도 수행하는 방식이다.
호스트 플레이어의 컴퓨터에서 서버 로직과 화면 렌더링이 함께 실행된다.
호스트 컴퓨터
├─ 서버 역할
└─ 로컬 플레이어 역할
원격 플레이어
└─ 클라이언트 역할
장점
- 별도의 서버 프로그램을 운영하지 않아도 된다.
- 소규모 협동 게임에 적용하기 쉽다.
- 서버 운영 비용이 비교적 적다.
단점
- 호스트가 종료하면 게임 세션도 종료될 수 있다.
- 호스트의 컴퓨터 성능과 네트워크 상태에 영향을 받는다.
- 호스트 플레이어가 네트워크 지연 측면에서 유리할 수 있다.
- 호스트에게 서버 권한이 있으므로 보안에 불리할 수 있다.
Dedicated Server
Dedicated Server는 플레이어가 직접 접속해서 조작하지 않는 서버 전용 프로그램이다.
화면을 렌더링하거나 플레이어 입력을 처리할 필요 없이 게임 상태와 네트워크 통신을 관리한다.
Dedicated Server
├─ 게임 규칙 처리
├─ 플레이어 상태 검증
├─ 월드 상태 관리
└─ 데이터 복제
Client A ─┐
Client B ─┼─ Dedicated Server에 접속
Client C ─┘
장점
- 특정 플레이어가 호스트 역할을 맡지 않는다.
- 모든 플레이어에게 비교적 공정한 환경을 제공한다.
- 호스트가 나가도 서버를 계속 유지할 수 있다.
- 보안과 서버 권한 관리에 유리하다.
- 많은 플레이어가 참가하는 게임에 적합하다.
단점
- 별도의 서버 컴퓨터나 클라우드 환경이 필요하다.
- 서버 운영 비용이 발생한다.
- 배포, 모니터링 및 장애 대응이 필요하다.
- 클라이언트와 서버 빌드를 구분해서 관리해야 한다.
3. NetMode
NetMode는 현재 월드가 네트워크 환경에서 어떤 역할로 실행되고 있는지를 나타낸다.
언리얼 엔진에서는 ENetMode 열거형으로 정의되어 있다.
enum ENetMode
{
NM_Standalone,
NM_DedicatedServer,
NM_ListenServer,
NM_Client
};
NM_Standalone
네트워크 연결 없이 단독으로 실행되는 상태다.
싱글 플레이 게임이나 네트워크 기능을 사용하지 않는 테스트 환경에서 확인할 수 있다.
NM_DedicatedServer
현재 인스턴스가 Dedicated Server로 실행되고 있다는 뜻이다.
로컬 플레이어가 없고 화면 렌더링이 필요하지 않다.
NM_ListenServer
현재 인스턴스가 Listen Server라는 뜻이다.
서버 역할을 수행하면서 로컬 플레이어도 존재한다.
NM_Client
현재 인스턴스가 원격 서버에 접속한 클라이언트라는 뜻이다.
4. NetMode 확인하기
액터에서는 GetNetMode()를 사용해 현재 NetMode를 확인할 수 있다.
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
switch (GetNetMode())
{
case NM_Standalone:
UE_LOG(LogTemp, Log, TEXT("NetMode: Standalone"));
break;
case NM_DedicatedServer:
UE_LOG(LogTemp, Log, TEXT("NetMode: Dedicated Server"));
break;
case NM_ListenServer:
UE_LOG(LogTemp, Log, TEXT("NetMode: Listen Server"));
break;
case NM_Client:
UE_LOG(LogTemp, Log, TEXT("NetMode: Client"));
break;
}
}
서버에서만 실행해야 하는 코드라면 다음처럼 확인할 수도 있다.
if (GetNetMode() != NM_Client)
{
// 서버 또는 Standalone에서 실행
}
화면이나 UI처럼 Dedicated Server에서 실행할 필요가 없는 로직은 다음과 같이 구분할 수 있다.
if (GetNetMode() != NM_DedicatedServer)
{
// 화면이 존재하는 환경에서만 실행
}
다만 게임 상태에 대한 권한을 검사하려는 목적이라면 NetMode만 확인하기보다 HasAuthority()를 사용하는 것이 의도를 더 명확하게 표현할 수 있다.
if (HasAuthority())
{
// 이 액터에 대한 서버 권한이 있을 때 실행
}
5. NetDriver
NetDriver는 언리얼 엔진의 네트워크 통신을 전체적으로 관리하는 객체다.
쉽게 말하면 서버와 클라이언트 사이에서 패킷을 주고받고, 연결을 유지하며, 액터의 Replication을 처리하는 네트워크 관리자라고 볼 수 있다.
주요 역할은 다음과 같다.
- 네트워크 연결 생성 및 관리
- 데이터 송수신
- 접속 상태와 시간 초과 관리
- 액터 및 프로퍼티 Replication 처리
- RPC 전달
- 각 NetConnection 관리
일반적인 게임 네트워크에서는 UNetDriver를 기반으로 하는 UIpNetDriver가 사용될 수 있다.
구조를 단순화하면 다음과 같다.
World
└─ NetDriver
├─ ServerConnection
└─ ClientConnections
├─ NetConnection A
├─ NetConnection B
└─ NetConnection C
서버와 클라이언트는 NetDriver를 통해 직접 연결되며, NetDriver 내부에서 여러 NetConnection을 관리한다.
6. NetConnection
NetConnection은 서버와 특정 클라이언트 사이의 논리적인 연결 하나를 나타낸다.
Dedicated Server에 플레이어 10명이 접속했다면 서버의 NetDriver는 일반적으로 각 클라이언트에 대응하는 여러 연결을 관리한다.
Server NetDriver
├─ NetConnection: Client A
├─ NetConnection: Client B
└─ NetConnection: Client C
반대로 클라이언트는 하나의 서버에 접속하므로 서버를 향한 연결을 가진다.
서버 기준
ClientConnections
└─ 접속한 클라이언트별 NetConnection
클라이언트 기준
ServerConnection
└─ 현재 접속한 서버와의 NetConnection
NetConnection은 다음과 같은 정보를 관리하는 데 사용된다.
- 연결된 상대방의 네트워크 정보
- 접속 상태
- 패킷 송수신 상태
- 타임아웃
- 해당 클라이언트가 소유한 액터와 RPC 전달 관계
7. NetDriver와 NetConnection의 차이
두 개념은 이름이 비슷하지만 담당하는 범위가 다르다.
구분NetDriverNetConnection
| 역할 | 전체 네트워크 통신 관리 | 특정 서버·클라이언트 사이의 연결 관리 |
| 관리 범위 | 여러 연결과 Replication 시스템 | 하나의 연결 |
| 서버 | 여러 ClientConnection 관리 | 클라이언트마다 하나씩 존재 |
| 클라이언트 | 서버 연결 관리 | 서버를 향한 연결 표현 |
NetDriver를 전화 교환 시스템이라고 본다면 NetConnection은 실제로 연결된 개별 통화 회선이라고 생각할 수 있다.
8. 전체 구조 정리
Dedicated Server
└─ World
└─ NetDriver
├─ ClientConnection A
│ └─ Client A와의 통신
├─ ClientConnection B
│ └─ Client B와의 통신
└─ ClientConnection C
└─ Client C와의 통신
멀티플레이 게임의 전체 흐름은 다음과 같이 정리할 수 있다.
- 서버에 NetDriver가 생성된다.
- 클라이언트가 서버에 접속한다.
- 클라이언트마다 NetConnection이 만들어진다.
- 서버가 게임의 최종 상태를 관리한다.
- NetDriver가 Replication과 RPC를 처리한다.
- 각 NetConnection을 통해 데이터가 전달된다.
9. 오늘 배운 내용
오늘은 언리얼 엔진의 멀티플레이가 서버를 중심으로 동작한다는 점을 배웠다.
Listen Server는 호스트가 서버와 플레이어 역할을 함께 수행하고, Dedicated Server는 플레이어 없이 서버 역할만 수행한다. 현재 실행 중인 월드의 역할은 NetMode로 구분할 수 있다.
또한 NetDriver는 전체 네트워크 통신과 Replication을 관리하고, NetConnection은 서버와 개별 클라이언트 사이의 연결을 나타낸다.
처음에는 이름이 비슷해서 헷갈렸지만 다음과 같이 정리하면 이해하기 쉽다.
NetMode = 현재 실행 환경의 네트워크 역할
NetDriver = 전체 네트워크 통신 관리자
NetConnection = 특정 상대와 연결된 개별 통신 경로
다음에는 Authority, Ownership, Role의 차이와 RPC가 어떤 연결을 통해 전달되는지 공부해 봐야겠다.
'TIL' 카테고리의 다른 글
| [Unreal Engine 멀티플레이] 서버 권위 기반 숫자 야구 구현 (0) | 2026.08.03 |
|---|---|
| [Unreal Engine 멀티플레이] NetRole과 RPC 기초, Ownership, 채팅 시스템 흐름 (1) | 2026.07.31 |
| [UE5] ProjectFT#17 프로젝트 마무리(데이터 기반 거점 시스템 구현 — 퀘스트부터 제작, 창고, 레벨 이동까지) (0) | 2026.07.28 |
| [UE5] ProjectFT #16 퀘스트 보상과 데이터 구조 확장 (0) | 2026.07.27 |
| [UE5] ProjectFT #15 퀘스트 UI를 메일 형태로 설계하기 (0) | 2026.07.24 |