일반적으로 MMO(MO)와 싱글플레이의 차이는, 필드에 사람들과 같이 다니는지 혹은 협동PVE, 경쟁PVP가 있는지로 구분하고는 합니다.
하지만 우리는 코드를 만드는 입장에서 서버 구조를 통해서 이러한 개념을 구분할 수 있습니다.
MMO vs Single? (Stateful vs Stateless)
기본적으로 실시간 경쟁과 반복적 플레이를 통한 득템을 위시하는 MMO에서는 서버가 권위를 가지는 구조를 택합니다.

플레이어가 공격하는 행위, 데미지를 주는 처리 아이템을 얻는 행위 모두 서버가 처리하기 때문에 서버의 코드가 문제가 있는 것이 아니라면 모든 플레이어가 일관된 결과를 얻을 수 있습니다.
이러한 서버를 stateful server라고 하며, 대표적인 예시로는 MMORPG, AOS, FPS 등의 멀티플레이게임이 있습니다.
반면 싱글플레이 RPG는 기본적으로 경쟁플레이가 적고 실시간 처리가 필요하지 않기 때문에 모든 요청을 서버가 처리하지는 않습니다.

일부 서버와 소통이 필요한 정보만 가끔 전달하며, 이로 인해 액션성이 강한 게임은 pvp를 넣지않고, 스폰되는 몬스터의 수를 제한하는 등의 통제로 플레이어가 예상되는 범위 안에서 행동하도록 합니다.
이러한 서버를 stateless server라고 하며, 대표적인 예시로는 싱글플레이RPG, 퍼즐류, 타이쿤류 등이 있습니다.
서버구조와 핵
서버를 만들면서 유의해야할 점은 서버의 보안입니다.
온라인 구조를 신경쓸필요가 없는 콘솔형 싱글플레이 게임과 다르게, 기본적으로 온라인게임은 아이템이 BM과 엮여있고, 유저들이 형평성을 중요하게 생각하기 때문에 개발자는 악의적인 핵 유저를 검출할 의무가 있습니다.

이론상 서버가 권위를 가지는 stateful 방식은 핵이 존재할 수 없습니다.
다만 서버에 버그가 전혀 없고 모든 경우의 수를 틀어막는다는 가정이기 때문에 이것또한 이루어질 수 없는 일이죠
다만 stateless 방식은 모든 입력에 대해 검증하지 않기 때문에 핵을 만들기가 비교적 쉽습니다.
따라서 유료재화획득같은 엄격하게 검증해야하는 부분은 서버에서 통제하지만 위치, 데미지 연산 등은 검증하지않아
오픈월드 게임에서 파밍상자의 위치를 변경하거나, 클리어할 수 없는 스펙의 유저가 엔드컨텐츠 보스를 클리어하는 등의 행위가 심심치않게 발견됩니다.
이렇게 설명했지만 사실 stateful과 stateless는 혼합하여 사용되는 경우도 많습니다.
MMO에서도 클라이언트에서만 처리해도 괜찮은 연산은 stateless로 처리하고 소급해서 적용할 수 있고,
싱글플레이 중심의 게임이라도 실시간 채팅을 넣는 등 실시간 처리가 필요한 경우 stateful(TCP 연결) 들어가기도 합니다.
동기화
같은 필드에 여러 플레이어가 존재한다면 동기화가 필요합니다.
A, B 유저가 가시거리 내에서 동시에 움직인다면 A에게는 B의 움직임이, B에게는 A의 움직임이 보여야하며
더 중요한 것은 두 유저에게 최대한 동일한 화면을 볼 수 있도록 해야한다는 것입니다.

적은 유저라면 서버가 빠른 응답을 줄 수 있지만, 수많은 유저가 한 필드에서 많은 이벤트를 발생시킨다면 서버의 처리량으로 인해 패킷 전달이 딜레이 될 것이고, 이로 인해 다른 유저가 순간이동하는 느낌을 받는 등의 이슈가 생길 수 있습니다.
이를 위해 서버는 많은 기법을 활용합니다.
클라이언트가 적은 패킷을 보내게하고 서버가 예측하거나 같은 유저의 패킷은 중복해 보내지 않는 등의 기법을 사용합니다.
이에 대한 기술은 나중에 다루도록 하겠습니다.
'이것저것 > 서버 이것저것' 카테고리의 다른 글
| [서버 이것저것] 로직 성능 측정해보기 (0) | 2025.10.15 |
|---|