UDP와 TCP: 게임 서버를 채팅과 분리하여 실행해야 하는 이유
Published: 2023-11-30 08:28:11

멀티플레이어 게임을 개발할 때 개발자는 종종 딜레마에 직면하게 됩니다.

-   이미 멀티플레이어 기능을 지원하는 기존 게임 서버를 활용하여 채팅을 실행할 수 있을까요?
    
-   아니면 게임 서버를 분리하여 채팅을 독립적으로 실행할까요?
    

결국은 채팅 메시지일 뿐이니까요? 한 명의 사용자나 소규모 그룹에게 보내는 작은 메시지라면 이미 구축된 기능을 활용하면 되지 않을까요? 뭐가 나쁠까요? 처음에는 이미 구축된 것을 활용하는 것이 좋은 선택처럼 보일 수 있지만, 이 디자인 패턴을 선택하면 여러 가지 문제가 발생할 수 있습니다.

게임 서버와 소셜 기능(가장 중요한 것은 [채팅](https://www.pubnub.com/use-case/in-app-chat/))을 독립적으로 운영하여 게임 개발자와 최종 사용자 모두에게 이득이 되는 이유를 설명합니다. 이렇게 하면 게임 자체의 성능과 확장성을 높이고 향후 새로운 기능을 추가할 때 소셜 기능을 쉽게 확장할 수 있습니다.

**TCP와 UDP란 무엇인가요?**
--------------------

기본적으로 TCP와 [UDP는](https://www.pubnub.com/guides/udp/) 인터넷을 통한 데이터 전송에 사용되는 네트워크 프로토콜입니다. TCP는 연결 지향적인 인터넷 프로토콜인 반면, UDP는 연결이 필요 없는 프로토콜입니다.

멀티플레이어 게임 프로토콜에 대한 가장 큰 논쟁은 UDP(사용자 데이터그램 프로토콜)와 [TCP(전송 제어 프로토콜](https://www.pubnub.com/guides/tcp-ip/) )를 언제 사용해야 하며, 어느 쪽을 사용하는 것이 가장 좋은가 하는 것입니다.

하지만 그 전에 온라인 게임 아키텍처에 대해 알아보겠습니다.

**UDP와 TCP 게임 서버: 온라인 게임을 더 관리하기 쉽게 만드는 방법**
--------------------------------------------

마이크로서비스 지향 아키텍처는 대규모 애플리케이션(이 경우 게임)을 독립적인 버전의 작은 모듈식 서비스로 나누고, 범용적으로 액세스할 수 있는 간단한 API를 통해 서로 통신합니다. 이를 통해 새로운 기능을 구축하는 것이 훨씬 쉬워지고, 구축한 대역폭과 기능을 유지 관리하기가 더 쉬워집니다.

게임 서버와 채팅 기능을 분리하면 전체 인프라를 더 쉽게 관리할 수 있고 완전한 마이크로서비스 지향 아키텍처에 가까워집니다. 이 사례에서는 게임 내 채팅과 멀티플레이어 게임을 구동하는 게임 서버와의 관계를 구체적으로 살펴보겠습니다.

모놀리식 아키텍처를 사용하면 개발팀은 게임이 이미 구축된 것과 동일한 프로그래밍 언어, 데이터베이스, 소프트웨어 환경을 사용하는 단일 기술 스택에 갇히게 됩니다. 새로운 개발자를 영입하거나 새로운 기술 및 시스템을 프로토타이핑하려는 경우 마이크로서비스 아키텍처에서 훨씬 더 빠르게 움직일 수 있습니다.

또한 모놀리식 아키텍처에서는 종속성이 훨씬 더 분명해집니다. 단일 애플리케이션 기능에 장애가 발생하면 게임 전체가 다운됩니다. 게임을 마이크로서비스로 분할하면 단일 모듈에 장애가 발생해도 오류를 분리하고 수정하기가 더 쉽습니다.

게임 서버는 다음을 위해 구축됩니다. [플레이어의 움직임과 상태를](https://www.pubnub.com/docs/general/presence/overview) 실시간으로 전달하도록 설계되었으며, 실제로도 잘 작동합니다. 채팅 메시지에 동일한 기술과 디자인을 적용하는 것은 특정 기능에 가장 적합한 옵션을 사용하지 않는 것입니다. 분산형 컴포넌트는 유지 관리가 쉽고 확장성이 뛰어납니다.

![](https://images.ctfassets.net/3prze68gbwl1/h3rC4If7TY4W9s4s3NADr/ef310e0b3415530bc0cfcd72a089131c/game-infrastructure.png)

채팅이 게임 서버와 분리되어 있는 게임 인프라의 예입니다. 또한 게임 서버 외부에서 인증, 프레즌스, 통계 및 리더보드 등 다른 서비스를 실행할 수 있습니다.

**UDP와 TCP 게임 서버 비교: 원활한 게임 경험 및 채팅 성능 보장**
-------------------------------------------

멀티플레이어 게임에서 전반적인 게임 성능은 중요한 고려 사항입니다. 모놀리식 아키텍처를 사용하면 실험실에서 게임이 원활하게 작동할 수 있지만, 많은 사용자가 빠른 속도로 통신하는 온라인 게임의 경우 채팅 메시지 전달과 게임 경험 모두에서 지연이 발생하고 지연 시간이 증가하기 시작합니다.

이 두 가지를 분리하면 CPU와 네트워크 리소스를 보다 효율적으로 사용할 수 있습니다. 게임 서버의 주요 목적은 게임의 모든 사용자에게 원활한 경험을 제공하는 것입니다. 따라서 처리 능력은 이러한 성능을 극대화하는 데 사용되어야 합니다.

리그 오브 레전드나 EVE 온라인과 같은 온라인 배틀 아레나 게임이 있다고 가정해 보겠습니다. 한 번에 하나의 월드에 수백 명의 플레이어가 있을 수 있습니다. 이는 게임 서버를 통해 각 플레이어가 생성하는 모든 입력을 전달하는 수천 개의 메시지가 전송되는 것을 의미합니다. 여기에 채팅 메시지까지 더해집니다. 모든 메시지의 우선순위가 동일하기 때문에 플레이어가 채팅 채널에 스팸을 보내 게임 서버를 고의로 느리게 만들 수 있습니다.

게임 서버는 이미 물리, 그래픽, 사운드 등 집중적인 게임플레이 경험을 처리하고 있습니다. 여기에 일대일, 그룹, 팀 등 채팅 메시지를 추가하여 메시지를 파싱하고 올바른 사용자에게 라우팅하려면 대규모 게임의 경우 이러한 모든 메시지가 서서히 쌓여 게임의 전반적인 성능을 저하시킵니다. 채팅 채널을 멀티플레이어 채널과 별도로 운영하는 것은 당연한 일입니다. 채팅 메시지 라우팅보다 더 복잡한 문제에 더 적합할 수 있는 중요한 처리 능력을 빼앗기고 있는 것입니다.

**TCP와 UDP - 둘 다 필요할 때와 필요하지 않을 때 비교하기**
----------------------------------------

빠르게 진행되는 멀티플레이어 게임(1인칭 슈팅 게임, 아레나 게임 등)에서는 플레이어의 움직임을 동기화하고 게임 상태를 업데이트하기 위해 UDP 프로토콜을 사용합니다. UDP 헤더는 이러한 게임 업데이트를 엄청나게 빠른 속도로 전송하는 데 이상적이지만, 다음 메시지가 너무 빨리 도착하기 때문에 메시지 전송이 보장되지는 않습니다.

### 왜 UDP가 TCP보다 선호될까요? 그 반대의 경우도 마찬가지일까요?

TCP 연결은 메시지 전달을 보장하므로 채팅에 적합한 옵션입니다. 게임은 UDP에서, 소셜 기능은 TCP에서 실행하면 뛰어난 성능을 경험할 수 있습니다.

![](https://images.ctfassets.net/3prze68gbwl1/3F6epR2uvWaGMsZs6QVgjF/43009b230140dde81fa41153063718d9/tcp-vs-udp.png)

하지만 턴제 게임과 같이 덜 격렬한 멀티플레이어 게임의 경우, 게임 플레이와 채팅 모두에 TCP가 적합한 옵션입니다. TCP는 메시지 전달을 보장하며, 스크래블 턴이나 틱택토처럼 모든 움직임이 중요한 게임에서는 멀티플레이어 게임플레이를 강화하는 데 훌륭한 옵션입니다. 물론, 게임이 시작되어 한 번에 수천 명의 사용자가 접속하는 경우에는 채팅을 게임 서버 연결과 분리하는 것이 좋습니다.

### 서로 다른 기능을 위해 TCP와 UDP를 선택할 때 지연 시간 고려하기

지연 시간은 멀티플레이어 기능과 소셜 기능의 지연 시간 표준이 다르기 때문에 고려해야 할 또 다른 사항입니다. 게임 상태를 보장하고 플레이어 입력을 전달하는 멀티플레이어 게임의 경우 업계 표준은 20밀리초 이하입니다. 반면 채팅 애플리케이션의 경우 채팅 메시지 전송의 최대 지연 시간은 250밀리초입니다. 따라서 온라인 게임에는 서로 다른 두 가지 유형의 실시간 메시징과 두 가지 표준이 있습니다. 이 두 가지를 독립적으로 운영하면 필요에 따라 각각을 관리할 수 있습니다.

**TCP 또는 UDP 프로토콜 사용 여부에 관계없이 손쉽게 새로운 소셜 기능 추가하기**
--------------------------------------------------

채팅을 독립형 서비스로 실행하고 업계 표준 네트워크 프로토콜[(XMPP](https://www.pubnub.com/learn/glossary/what-is-xmpp/), [WebSockets](https://www.pubnub.com/guides/what-are-websockets-and-when-should-you-use-them/), [ngrok](https://www.pubnub.com/guides/what-is-ngrok/)) 또는 호스팅 서비스(PubNub)를 선택하면 새롭고 강력한 소셜 기능을 쉽게 추가할 수 있는 기회가 열립니다.

사용자가 개별 및 그룹 채팅을 할 수 있는 핵심 채팅부터 시작하세요. 이를 통해 기본 [게시/구독은](https://www.pubnub.com/guides/everything-you-need-to-know-about-pub-sub/) 물론 기본 인프라를 갖추게 되며, 그 위에 다른 많은 소셜 기능을 쉽게 구축할 수 있습니다. 최소한의 코딩으로 타이핑 표시기, 온라인 및 오프라인 상태 표시, 읽지 않은 메시지 카운터와 같은 테이블 스테이크 채팅 기능을 추가할 수 있으며, 이는 사용자들이 기대하는 기능입니다.

**TCP와 UDP: 앞으로의 전망**
---------------------

다음과 같은 크고 작은 게임 앱이 이 아키텍처 설계로 전환하고 있습니다. [포켓 젬스](https://www.pubnub.com/customers/pocket-gems/)을 비롯하여 최근에는 [이브 온라인](https://www.eveonline.com/article/p4i0qx/new-chat-backend-coming-with-the-march-release). 더 나은 확장성, 흐름 제어, 더 효율적인 성능, 단일 스택에 얽매이지 않고 혁신할 수 있는 자유까지, 게임 서버에서 채팅을 분리하는 것이 가져다주는 이점은 분명합니다.

_PubNub Chat을 사용하면_ _강력한 소셜 기능의 기반이_ 되는 [_인게임 채팅을_](https://www.pubnub.com/industry/gaming/)_쉽게_ [_구현할_](https://www.pubnub.com/industry/gaming/)_수_ _있으므로 소셜 인프라 확장 및 유지 관리에 신경 쓰지 않고 핵심 게임 개발에 더 집중할_ 수 있습니다.

#### **_참고 자료_**

-   [_멀티플레이어 게임 프로그래밍 시작하기_](https://hub.packtpub.com/getting-started-multiplayer-game-programming/)
    
-   [_EVE 온라인의 채팅 아키텍처 분석 및 리팩토링_](http://uu.diva-portal.org/smash/get/diva2:408940/FULLTEXT01.pdf)
    

펍넙이 어떻게 도움이 될까요?
================

이 글은 원래 [PubNub.com에](https://pubnub.com/blog/tcp-vs-udp/) 게시되었습니다.

유니티 플랫폼은 개발자가 웹 앱, 모바일 앱, IoT 기기를 위한 실시간 인터랙티브를 빌드, 제공, 관리할 수 있도록 지원합니다.

저희 플랫폼의 기반은 업계에서 가장 크고 확장성이 뛰어난 실시간 에지 메시징 네트워크입니다. 전 세계 15개 이상의 PoP가 8억 명의 월간 활성 사용자를 지원하고 99.999%의 안정성을 제공하므로 중단, 동시 접속자 수 제한, 트래픽 급증으로 인한 지연 시간 문제를 걱정할 필요가 없습니다.

PubNub 체험하기
-----------

[라이브 투어를](https://www.pubnub.com/tour/introduction/) 통해 5분 이내에 모든 PubNub 기반 앱의 필수 개념을 이해하세요.

설정하기
----

PubNub [계정에](https://admin.pubnub.com/signup/) 가입하여 PubNub 키에 무료로 즉시 액세스하세요.

시작하기
----

사용 사례나 [SDK에](https://www.pubnub.com/docs) 관계없이 [PubNub 문서를](https://www.pubnub.com/docs) 통해 바로 시작하고 실행할 수 있습니다.