본문 바로가기

온라인 서브시스템과 세션 인터페이스

@iamrain2025. 12. 17. 20:38

1. 온라인 서브시스템과 세션 인터페이스 (Online Subsystem & Session Interface)

언리얼 엔진의 온라인 서브시스템(Online Subsystem)은 스팀(Steam), Xbox Live, PlayStation Network(PSN), Epic Online Services(EOS) 등 다양한 온라인 플랫폼의 기능을 통합적이고 일관된 방식으로 접근할 수 있도록 제공하는 강력한 추상화 계층이다. 개발자는 플랫폼별 네이티브 SDK를 직접 다루지 않고도, 언리얼 엔진이 제공하는 공통 인터페이스를 통해 멀티플레이어 게임의 핵심 기능인 세션 관리, 플레이어 인증, 친구 목록, 리더보드, 업적 등을 구현할 수 있다.


2. 이론

2.1. 핵심 개념

2.1.1. 온라인 서브시스템 (Online Subsystem)

온라인 서브시스템은 '브릿지(Bridge)' 디자인 패턴의 구현체로 볼 수 있다. 언리얼 엔진의 게임 로직(추상화의 사용자)과 각기 다른 온라인 플랫폼의 SDK(구체적인 구현체) 사이를 연결하는 다리 역할을 한다.

  • 추상화(Abstraction): IOnlineSubsystem 인터페이스와 그 하위 인터페이스들(IOnlineSession, IOnlineFriends, IOnlineIdentity 등)이 담당한다. 게임 개발자는 이 추상 인터페이스만을 바라보고 코드를 작성한다.
  • 구현(Implementation): OnlineSubsystemSteam, OnlineSubsystemEOS, OnlineSubsystemNull 등 각 플랫폼에 특화된 구체적인 클래스들이 담당한다. 이들은 내부적으로 각 플랫폼의 SDK(Steamworks, EOS SDK 등)를 호출하여 실제 기능을 수행한다.

이 구조 덕분에, DefaultEngine.ini 설정 파일에서 사용할 서브시스템을 지정하기만 하면, 코드 변경 없이 게임을 스팀용, EOS용으로 전환할 수 있는 극강의 이식성을 확보하게 된다.

2.1.2. 세션 (Session)

세션은 멀티플레이어 게임의 한 판(match)을 나타내는 데이터 집합이다. 단순한 서버 연결 정보 이상으로, 게임의 상태와 규칙을 포함하는 포괄적인 개념이다.

  • 세션 상태(Session State):
    • Pending: 세션이 생성되었지만 아직 시작되지 않은 상태.
    • Starting: 세션이 시작 중인 상태.
    • InProgress: 게임이 활발하게 진행 중인 상태.
    • Ending: 세션이 종료 중인 상태.
    • Ended: 세션이 완전히 종료된 상태.
    • Destroying: 세션이 파괴되는 중인 상태.
  • 세션 정보(Session Settings, FOnlineSessionSettings):
    • NumPublicConnections: 공개적으로 참여할 수 있는 최대 플레이어 수.
    • bShouldAdvertise: 다른 플레이어들이 이 세션을 검색할 수 있게 할지 여부. (예: 서버 목록에 표시)
    • bIsLANMatch: LAN 게임인지 여부.
    • bUsesPresence: 플레이어의 '현재 상태' 정보(예: "게임 중", "로비 대기 중")를 사용할지 여부.
    • Settings: FOnlineSessionSetting의 맵(Map) 구조로, 게임에 필요한 커스텀 데이터를 저장하는 데 사용된다. (예: 맵 이름, 게임 모드, 최소 플레이어 레벨 등)

2.1.3. 세션 인터페이스 (IOnlineSession)

IOnlineSession은 세션의 전체 생명주기(Life-cycle)를 관리하는 함수와 델리게이트를 제공하는 핵심 인터페이스다. 모든 세션 관련 작업은 비동기(Asynchronous)로 처리된다. 네트워크 통신은 즉시 완료되지 않기 때문에, 특정 작업을 요청하고, 작업이 완료되면 '델리게이트(Delegate)'를 통해 결과를 통보받는 콜백(Callback) 방식으로 동작한다.

2.2. 내부 구조 및 구현 방식

IOnlineSession의 주요 함수와 델리게이트는 다음과 같은 쌍으로 구성된다.

함수 (요청) 델리게이트 (결과 통보) 설명
CreateSession OnCreateSessionComplete 새로운 게임 세션을 생성한다.
FindSessions OnFindSessionsComplete 특정 조건에 맞는 세션들을 검색한다.
JoinSession OnJoinSessionComplete 검색된 세션에 참여한다.
StartSession OnStartSessionComplete 세션을 시작 상태로 변경하여, 더 이상 새로운 플레이어가 참가할 수 없게 한다.
EndSession OnEndSessionComplete 게임을 종료 상태로 변경한다.
DestroySession OnDestroySessionComplete 세션을 완전히 파괴하고 백엔드에서 제거한다.
UpdateSession OnUpdateSessionComplete 진행 중인 세션의 설정을 변경한다. (예: 공개/비공개 전환)

예시: 세션 생성 과정 (CreateSession)

  1. 게임 코드(요청자): UGameInstance 등에서 IOnlineSession::CreateSession 함수를 호출한다. 이때 FOnlineSessionSettings 객체와 OnCreateSessionComplete 델리게이트에 바인딩할 함수를 함께 전달한다.
  2. 온라인 서브시스템: 요청은 현재 활성화된 서브시스템(예: FOnlineSubsystemSteam)의 SessionInterface로 전달된다.
  3. 플랫폼 SDK 호출: FOnlineSessionSteam::CreateSession은 내부적으로 Steamworks SDK의 SteamMatchmaking()->CreateLobby() 함수를 호출한다. 이 호출은 비동기적으로 스팀 서버에 로비 생성을 요청한다.
  4. SDK 콜백: 스팀 서버에서 로비 생성이 완료되면, Steamworks SDK는 등록된 콜백 객체(예: CCallResult)를 통해 결과를 반환한다.
  5. 델리게이트 실행: FOnlineSessionSteam은 SDK 콜백을 수신하여, 그 결과를 분석한 후 언리얼 엔진의 OnCreateSessionComplete 델리게이트를 실행(Broadcast)한다.
  6. 게임 코드(결과 처리): 1번 단계에서 델리게이트에 바인딩했던 함수가 실행된다. 이 함수 내에서 생성 성공 여부를 확인하고, 성공했다면 맵을 로드하여 플레이어를 이동시키는 등의 후속 처리를 진행한다.

이러한 비동기/델리게이트 구조는 네트워크 지연 시간(Latency)이 있는 환경에서 프로그램이 멈추지 않고(Non-blocking) 다른 작업을 계속 수행할 수 있게 하므로, 온라인 기능 구현에 필수적이다.

2.3. 동작 계층 구조

세션 기능이 사용자 입력으로부터 시작되어 다시 사용자에게 피드백을 주기까지의 과정은 다음과 같은 계층을 거친다.

[ 사용자 영역 (Application Layer) ]
       ▲                ▼
[ 엔진 계층 (Engine Layer) ]
       ▲                ▼
[ 온라인 서브시스템 추상 계층 (Online Subsystem Abstraction Layer) ]
       ▲                ▼
[ 온라인 서브시스템 구현 계층 (Online Subsystem Implementation Layer) ]
       ▲                ▼
[ 플랫폼 SDK 계층 (Platform SDK Layer) ]
       ▲                ▼
[ 백엔드 서비스 계층 (Backend Service Layer) ]
  1. 사용자 영역: 플레이어가 UI에서 '게임 만들기' 버튼을 클릭한다. UI 위젯은 UGameInstance나 관련 관리자 클래스의 함수를 호출한다.
  2. 엔진 계층: UGameInstanceIOnlineSubsystem::Get()을 통해 현재 활성화된 온라인 서브시스템의 인스턴스를 얻고, 다시 GetSessionInterface()를 호출하여 세션 인터페이스에 대한 포인터를 얻는다. 이 인터페이스의 CreateSession 함수를 호출한다.
  3. 온라인 서브시스템 추상 계층: IOnlineSession::CreateSession이라는 추상 함수가 호출된다.
  4. 온라인 서브시스템 구현 계층: 이 호출은 가상 함수(Virtual Function) 메커니즘을 통해 실제 구현체(예: FOnlineSessionSteam)의 CreateSession으로 연결된다.
  5. 플랫폼 SDK 계층: FOnlineSessionSteam은 내부적으로 SteamMatchmaking()->CreateLobby()를 호출하여 Steamworks API를 직접 사용한다.
  6. 백엔드 서비스 계층: 스팀의 서버(또는 EOS 서버 등)가 요청을 받아 로비를 생성하고 데이터베이스에 기록한다.
  7. 역방향 전파: 백엔드에서의 작업이 완료되면, 결과는 SDK 콜백 -> 구현 계층의 델리게이트 실행 -> 엔진 계층의 델리게이트 핸들러 호출 -> 사용자 영역의 UI 업데이트 순서로 다시 전파된다.

2.4. 서브시스템 간 비교

기능 OnlineSubsystemNull OnlineSubsystemSteam OnlineSubsystemEOS (Epic Online Services)
주요 목적 LAN 환경 및 오프라인 개발/테스트 Steam 플랫폼 전용 배포 크로스 플랫폼(Steam, EGS, 콘솔 등) 지원
장점 - 외부 의존성 없음
- 빠른 테스트 및 개발
- 설정이 매우 간단함
- Steam의 강력한 커뮤니티 기능 활용 (친구, 초대, 로비 등)
- Steam 유저들에게 익숙한 환경 제공
- 안정적인 인프라
- 여러 PC 스토어 및 콘솔 간의 크로스 플레이 지원
- Epic Games가 제공하는 백엔드 서비스(인증, 음성 채팅 등) 무료 사용
- 플랫폼에 종속되지 않음
단점 - 인터넷을 통한 매치메이킹 불가
- 플랫폼 기능(업적, 리더보드 등) 사용 불가
- Steam 외 다른 플랫폼과 연동 불가
- Steam 클라이언트 실행 필수
- 초기 설정이 Steam보다 복잡함
- Epic Games 개발자 포털 설정 및 SDK 연동 필요
사용 시기 - 프로젝트 초기 개발 단계
- LAN 파티용 게임
- 싱글플레이어 게임의 최소 온라인 기능 테스트
- 게임을 Steam에만 단독 출시할 경우 - 여러 스토어(EGS, Steam)에 동시 출시하거나, 콘솔과 PC 간 크로스 플레이를 구현하고 싶을 경우

 

iamrain
@iamrain :: Annals of Unreal

iamrain 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차