이전에 Client, Server를 알아보면서 CS 모델도 살펴보았다.
이번엔 우리가 앞으로 만들 게임 서버는 과연 웹 서버와의 공통점과 차이점에 대해 알아보자~
웹 서버
- HTTP 또는 HTTPS 프로토콜을 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트를 전송해주는 서비스 프로그램을 의미
- 실생활에서 우리는 웹 브라우저(Chrome, Safari, Edge 등)로 여러 웹 페이지(Naver, Google, Youtube 등)를 방문하여 사용하고 있다.
- 우리가 보고 있는 웹 페이지는 해당 웹 서버가 제공해주는 HTML 문서이다.
<웹 서버의 특징>
1) HTTP 프로토콜을 통해 Request -> Response
과정(단방향 통신)을 통해 데이터를 주고 받는다.
2) Stateless 서버로 클라이언트와 서버는 데이터를 주고 받을 때만 연결을 유지하고 끝나면 바로 연결을 끊는다.
게임 서버
- 온라인 게임 상에서 여러 플레이어가 같이 게임을 할 수 있게 하기 동작하는 위한 프로그램
- 클라이언트가 특정 데이터를 요청하면 서버는 이를 연산하여 클라이언트에게 결과값을 다시 클라이언트에게 제공해주는 역할을 한다.
<클라이언트와 게임 서버의 상호작용 과정>
- 연결 : 클라이언트와 서버는 데이터를 주고 받을 준비를 하는 것으로 서로 연결을 맺는다.
- 요청-응답 : 연결을 유지하면서, 클라이언트가 데이터를 보내면 서버는 이를 처리한 후 결과를 보내준다.
- 능동적 통보 : 클라이언트가 요청을 보내지 않아도 서버에서 능동적으로 통보해야 할 때가 있다.
- 연결 종료 : 게임을 정상 종료하거나 클라이언트의 비정상적인 행동 적발 시, 연결은 종료된다.
<게임 서버의 특징>
1) HTTP 프로토콜뿐만 아니라 TCP/UDP 프로토콜을 사용한 게임 서버도 있다.
- MMORPG 게임의 경우, 보통 TCP 프로토콜을 활용하여 게임 서버(Stateful)를 구현한다.
- 모바일 게임(방치형, 수집형, 디펜스형, 퍼즐 등)은 가능한 경우 HTTP 프로토콜을 활용하여 게임 서버(Stateless)로 구현하는 경우도 많다.
2) Stateful 게임 서버는 클라이언트와 서버는 연결을 유지하면서 데이터를 주고 받는다.
- 플레이어 정보는 게임을 플레이하는 실시간으로 변경이 되기 때문에,
서버와 클라이언트는 연결을 유지한 채로 데이터를 변경하면서, 유저들이 즉각적인 반응을 볼 수 있다.
- 하지만, 많은 플레이어들의 데이터를 서버 내에서 실시간으로 관리하고 있으므로, 서버의 부하가 크다. 따라서, 구현이 어렵고, 동시 최대 접속자 수의 제한이 존재한다.
3) Stateless 게임 서버는 유저들 간의 상호작용이 없어도 되는 게임의 경우 웹 서버를 활용하여 구현한다.
- 스테이지 클리어, 아이템 구매 등 중요한 순간에만 서버와 연결하여 데이터를 반영하는 방식으로,
이는 우리가 알고 있는 웹 서버 동작 방식(Request->Respone)과 유사하기 때문에 HTTP 프로토콜을 사용하게 되었다.
- Stateful 게임 서버보다 개발이 편리하지만, 모든 데이터를 대부분 DB에 저장하고 있기 때문에, DB 설계/성능/분산 관리가 무엇보다 중요하다.
- 또 DB의 처리 과정이 느리기 때문에, 실시간 처리에 어려움이 존재한다.