[DAY65] Remote Procedure Call

베리투스·2025년 11월 18일

TIL: Today I Learned

목록 보기
55/93

드디어 멀티플레이의 꽃이라 불리는 RPC(Remote Procedure Call)의 세계에 입문했다. 오늘은 클라이언트와 서버가 어떻게 '대화'하는지를 중심으로 RPC를 파고들었다. 클라이언트가 서버에게 무언가를 요청하는 방법(Server RPC)부터, 반대로 서버가 클라이언트에게 명령을 내리는 방법(Client, NetMulticast)까지, 통신의 각 방향에 대해 학습했다. 그리고 이 '대화'가 아무렇게나 이루어지는 것이 아니라, 소유권신뢰성이라는 엄격한 규칙과 약속 위에서 이루어진다는 사실을 깨달았다.


📌 오늘의 목표

  • 클라이언트가 서버에게 함수 실행을 요청하는 Server RPC의 원리와 규칙 이해하기
  • 서버가 클라이언트에게 명령을 내리는 ClientNetMulticast RPC의 차이점 파악하기
  • RPC 통신을 위한 약속(Ownership, Reliable, WithValidation)의 중요성 설명하기

📚 이론 및 원리

RPC(Remote Procedure Call)는 간단히 말해 "호출은 여기서, 실행은 저기서!"를 가능하게 하는 원격 제어 기술이다. 오늘은 클라이언트와 서버가 이 기술을 이용해 어떤 '대화'를 주고받는지, 그 방향에 따라 살펴보자.

1. 클라이언트가 서버에게 말 걸기 (Server RPC) 🙋‍♂️

게임에서 플레이어가 하는 모든 중요한 행동(총 발사, 스킬 사용 등)은 클라이언트에서 시작된다. 하지만 이 행동이 진짜 게임 세계에 영향을 미치려면, 게임의 유일한 '심판'인 서버의 허락과 실행이 필요하다. 이때 클라이언트는 Server RPC를 사용해 서버에게 "말을 건다".

  • UFUNCTION(Server): "서버님, 제 부탁 좀 들어주세요!"
    이 키워드가 붙은 함수는 클라이언트에서 호출되지만, 실제 실행은 서버에서 이루어진다.
  • 엄격한 규칙: 아무나 서버에게 말을 걸 수는 없다. 반드시 호출하는 클라이언트가 소유한(Client-Owned) 액터에서만 말을 걸어야 서버가 응답한다. 내 PlayerController나 내 캐릭터(AutonomousProxy)가 바로 그런 존재다. 이 규칙 덕분에 다른 플레이어의 캐릭터를 멋대로 조종하는 해킹이 원천적으로 불가능해진다.

2. 서버가 클라이언트에게 명령하기 (Client & NetMulticast RPC) megaphone

서버는 클라이언트의 요청을 처리하거나, 게임의 상태가 바뀌었을 때 클라이언트들에게 명령을 내려야 한다. 이 명령은 '특정 한 명'에게 내릴 수도, '모두'에게 내릴 수도 있다.

  • UFUNCTION(Client): "A 클라이언트, 너만 들어!" 🤫
    서버가 특정 클라이언트 한 명에게만 함수 실행을 '귓속말'로 명령하는 것이다. 그 클라이언트가 소유한 액터를 통해 명령을 내리며, 주로 개인적인 UI(아이템 획득 알림)나 효과를 보여줄 때 사용된다.
  • UFUNCTION(NetMulticast): "모두에게 알린다!" 📣
    서버가 서버 자신을 포함한 모든 클라이언트에게 함수를 실행하라고 '전체 방송'을 하는 것이다. 모든 플레이어가 동시에 봐야 하는 폭발 이펙트나 사운드 같은 '보여주기 위한' 기능에 주로 사용된다. 단, 모두에게 데이터를 보내므로 성능 부하가 크다는 점을 항상 명심해야 한다!

3. 우리끼리의 약속 (RPC의 규칙과 옵션) 🤝

클라이언트와 서버의 대화는 무질서하게 이루어지지 않는다. 안전하고 효율적인 통신을 위해 반드시 지켜야 할 '약속'들이 있다.

  • 약속 1: 신뢰성 (Reliable vs Unreliable)
    모든 말이 항상 100% 전달될 필요는 없다. 총알이 벽에 맞는 효과음은 가끔 유실되어도 게임에 큰 영향이 없지만(Unreliable), 플레이어에게 데미지를 주는 로직은 반드시 전달되어야 한다(Reliable). Reliable은 반드시 전달을 보장하지만 그만큼 비용(성능)이 비싸므로, 꼭 필요한 곳에만 써야 한다.
  • 약속 2: 유효성 검사 (WithValidation)
    Server RPC는 클라이언트의 요청을 받는 관문이므로, 항상 "이 요청이 올바른가?"를 의심해야 한다. WithValidation 키워드는 서버가 요청을 실행하기 전에 _Validate()라는 검증 함수를 거치게 하는 2차 방어벽이다. 여기서 마나가 부족하거나 쿨타임이 차지 않은 스킬 사용 요청 등을 거부할 수 있다.
// UFUNCTION 매크로를 이용한 약속이 포함된 RPC 함수 선언
// 서버로, 반드시 전달하고, 유효성 검사까지 하는 RPC
UFUNCTION(Server, Reliable, WithValidation)
void Server_PlayerFire(FVector LookDirection);

// 1. 유효성 검사 (서버의 방어벽)
bool AMyCharacter::Server_PlayerFire_Validate(FVector LookDirection)
{
    // 총알이 충분한가?
    return bHasEnoughAmmo; // true를 반환해야만 아래 함수가 실행됨
}

// 2. 실제 실행 로직
void AMyCharacter::Server_PlayerFire_Implementation(FVector LookDirection)
{
    // 실제 총알 발사 로직 (서버에서만 실행됨)
}

✅ 핵심 요약

키워드대화의 방향설명핵심 조건
ServerClient → Server클라이언트가 서버에게 함수 실행을 요청.클라이언트가 소유한 액터에서 호출
ClientServer → Client서버가 특정 클라이언트에게 함수 실행을 명령.서버에서 호출, 소유권이 있는 클라이언트에게만
NetMulticastServer → All서버가 모두에게 함수 실행을 명령 (주로 코스메틱)서버에서 호출
WithValidation(규칙)서버 RPC 실행 전, 서버에서 유효성을 검사하는 관문.보안을 위해 Server RPC에 적극 권장
Reliable(약속)RPC가 반드시 전송될 것을 보장. (데미지, 스폰 등)Unreliable은 보장 안 됨 (이펙트, 사운드 등)
profile
Shin Ji Yong // Unreal Engine 5 공부중입니다~

0개의 댓글