[Server] Server + WAS + GameServer 알아보기

Jaeyoung Ko·2024년 11월 19일
0

(1) Client-Server 구조

[1] Client-Server 구조란?

오랜만에 전공책을 펴서 서버-클라이언트 구조 개념이 어느 부분에 나오는지 찾아보았다.

(Data Communication and Networking Ch 25 - 26 참고)

컴퓨터 네트워크에서, OSI 7 Layers의 Application Layer에 해당하는 응용층에 대한 이야기가 필요하다.

유저에게 서비스를 제공하는 응용층에서,
논리적 연결을 통해 서비스/메시지를 호스트들이 교환하는 방식에 있어 2가지 패러다임으로 분화된다.

1) Client-Server

응용층 패러다임에서 전통적인 패러다임으로, 두 응용 프로그램간 통신이지만 server와 client로서 불리는 각 프로그램은 완전히 다른 역할을 수행한다.

Server는 끊임없이 실행되는 응용 프로그램으로서 서비스 제공자 역할을 하기 위해 클라이언트와 연결되어 요청을 기다린다.

Client는 서버 프로세스로부터 서비스를 받아야 할 때 서버에게 요청을 한다.


이 패러다임의 문제는 다음과 같다.

Server에 통신 부담이 집중되기 때문에 강력한 컴퓨터가 되어야만 한다.

Server가 존재하기 위해서는 특정 서비스를 위해 비용을 지불하여 서버를 만들고자 하는 서비스제공자가 있어야만 하는 것이며, 서버에 어떤 형태의 수입을 반드시 돌려줘야 한다.


  • 용례: WWW, HTTP, SSH, 전자우편 등의 여러 전통적인 서비스들


2) P2P: Peer-to-Peer

전통적인 Client-Server의 경우, 서버는 항상 실행되어야만 하고 클라이언트의 연결 요청을 기다려야하는 반면, P2P 구조에서는 책임이 두 통신의 주체 peer 간에 나누어져 있다.

즉, peer간 서비스/정보를 교환하는 데에 있어 서비스를 제공하거나 받는 역할을 달리 하거나, 혹은 동시에 제공하면서 받을 수 있다.

항상 실행시켜야 하는 강력한 컴퓨터여야 하는 값비싼 서버를 제거하여 쉽게 규모 조정과 경비 절감을 할 수 있는 반면, 다음과 같은 도전이 있다.


보안

  • 전용 서버에 의해 제어되는 서비스들에 비해 분산된 서비스들 간의 안전한 통신을 만드는 것은 더 어려운 태스크이다. 모든 노드가 서로 상호 연결이 되어 있기 때문에, 보안의 리스크가 더 클 수 밖에 없다.

응용성

  • 모든 어플리케이션이 이 패러다임을 사용할 수 있는 것은 아니다.

  • 용례: BitTorrent, Skype, IPTV와 같은 인터넷 전화




개념적인 이야기는 위와 같고, 아래는 필자가 느낀 바를 정리한 바이다.

Client와 Server라는 것은 결국에 '특정 서비스'를 두고 나뉘어지는 양자간의 역할이라고 볼 수 있다.


(2) 웹 애플리케이션 서버와 게임 서버

0. Web Server VS WAS

웹 서버란 말이 중복되기 때문에 둘은 같은 말이라고 생각들 수 있지만 엄밀하게 다른 개념이다.

두괄식으로 요약한다면, 주요 역할이 다르기 때문에 웹 서버로부터 웹 애플리케이션 서버의 개념을 구분하는 것이다.

먼저 웹 서버를 정의해보자.

웹 서버는 클라이언트로부터 HTTP 요청을 받아 정적 컨텐츠를 제공하는 역할을 한다.

이 때,

클라이언트는 주로 웹 브라우저이며,
제공하는 정적 컨텐츠는 CSS, JS, IMG, FILE등이다.

하지만 우리가 일반적으로 생각하기에는

데이터베이스와 연동된 작업이나 기타 트랜잭션 처리 또한 담당하는데 이에 대한 언급이 없다.

이와 관련하여 웹 애플리케이션 서버를 정의해보면,

웹 애플리케이션 서버(WAS)는 클라이언트의 요청에 따라 동적 컨텐츠를 생성하고 비즈니스 로직을 처리하는 역할을 한다.

즉, 눈에 띄는 차이점으로 본다면 간단히 말해 정적 컨텐츠를 다루느냐 동적 컨텐츠를 다루느냐로 볼 수 있다.

좀 더 자세히 공통점과 차이점을 정리해보면 다음과 같다.

웹 서버와 WAS는 공통적으로 HTTP 프로토콜을 사용한 클라이언트 요청으로부터 응답을 반환하는 역할을 한다.


하지만 웹 애플리케이션 서버는 동적인 HTML 페이지의 반환,
사용자 인증, 유저 관리, 주문 처리, 재고 관리 등 다양한 비즈니스 기능의 처리의 담당,
데이터베이스와 통신하여 SQL query나 ORM을 사용하여 데이터를 읽고 쓰는 작업을 수행한다.

웹 애플리케이션 서버 또한 웹 서버의 정적 컨텐츠 처리를 수행할 수 있지만, 연산 과정 중 더 많은 오버헤드가 발생하기 때문에 시간 퍼포먼스가 중요한 서버 입장에서는 기능에 따라 분리를 하는 것이 좋기 때문이다.




사실 둘 간의 차이를 찾아보면서,
WAS = Web server + Web container라는 의견이 있고 (주류),
WAS = Web server - APP 간의 Middleware라는 의견도 있고,
WAS = Web server + APP 이라는 의견처럼 다양한 해석이 존재한다.

이에 대해서는 필자도 WAS가 웹 서버의 기능(정적 컨텐츠 제공)과 서블릿 컨테이너 기능을 모두 가지고 있기 때문에 WAS = Web server + Web container라는 주류 의견이 맞다고 생각한다.




+ HTTP (HyperText Transfer Protocol)

웹에서 웹페이지를 가져오기 위해 어떻게 Client-Server 프로그램이 작성되는지를 정의하는데에 사용되는 프로토콜이다.

기본적으로는 80번의 port #를 사용한다.


+ Request 와 Response

클라이언트가 서버에게 요청을 전달할 때,
HTTP 메서드, URL, header, body로 구성된 Request를 전송하여 요청한다.

서버는 클라이언트로부터 받은 요청에 대해
status code, header, body 등으로 구성된 Response를 전송하여 응답한다.

(이에 대해 HTTP 메서드들, 상태 코드들 등 자세한 내용은 이하 생략한다.)




웹 서버와 WAS 예시: Netflix

https://www.linkedin.com/posts/alexxubyte_systemdesign-coding-interviewtips-activity-7104851972184236032-F9Oe/ 참고

// 경고: 현재 버전이 아닌 넷플릭스 레거시 기술 스택일수도 있음.

1. Nginx

웹 서버로서, 고성능 HTTP 및 리버스 프록시 서버인 Nginx를 통해 프론트엔드 단에서의 요청을 처리하고 로드 밸런싱을 수행

2. Apache Tomcat

아파치 톰캣은 Java 서블릿과 JavaServer Pages(JSP)를 실행하기 위한 오픈 소스 웹 서버 및 서블릿 컨테이너로 백엔드 서비스 호스팅을 담당.

현재 가장 일반적으로 사용되는 WAS

Java 서블릿 및 JSP 실행

cf. Servlet: Java로 클라이언트 요청에 대해 웹에 동적으로 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술


3. Spring Boot

기타 백엔드 단의 마이크로서비스에 사용



B. 게임 서버란?


대부분의 정의에서는 멀티 플레이에 초점이 맞춰져 있고, 실제로 중요한 부분이라고 생각한다. 하지만 포괄적으로 정의해본다면,

게임 서버는 게임의 로직, 데이터, 상태를 관리하고 클라이언트와의 통신을 통해 플레이어에게 게임 경험을 제공하는 서버라고 정의할 수 있다.

게임 서버의 주요 역할로 본다면

  • 게임 및 플레이어의 상태 관리와 동기화
  • 게임 내 로직 처리 (전투 판정 등)
  • 게임 데이터, 유저 데이터의 저장과 보안

으로 볼 수 있다.



예시:

Unity 엔진 + Photon Server

  • 게임 상태의 실시간 업데이트, 플레이어 위치, 아이템 상태 등의 데이터를 네트워크를 통해 서버와 클라이언트 간 통신

  • RPC(Remote Procedure Call)를 통해 클라이언트가 서버에 있는 함수나 프로시저를 호출하는 형태


Unreal Engine + Dedicated Server

  • 데디케이트 서버는 클라이언트를 실행할 때 그래픽 출력이 없는 콘솔 프로그램인 전담 서버로 실행 시켜 클라이언트가 서버에 접속해서 통신하도록 도와줌.



    게임 서버를 이용하는 이유는 너무나도 자명하다.

    MOBA 장르나 MMORPG를 차치하고서라도, 대전 격투 게임처럼 실시간 전투 판정이 중요한 곳에서

    한 쪽 클라이언트 단에서 판정을 처리한다면 공정성에 다분히 문제가 생길 것이다.





[2] WAS와 게임서버의 공통점


둘의 공통점을 따져 본다면, 서버로서의 기능을 한다는 점이다. 클라이언트의 요청을 받아, 그에 따른 복잡한 로직 등을 처리하거나 데이터 저장/불러오기 등의 관리를 한다.





차이점


아니 선생님 진짜 눌렀잖아요


아래에서 차이점에 대해서 설명하겠지만, 두괄식으로 요약하자면,

"게임의 실시간성" 이 차이를 가져오는 가장 근본적인 이유라고 생각한다.



WAS는 요청에 따라 정적/동적 컨텐츠의 제공에 주 목적이 있다면,

게임 서버는 높은 동시접속 속에서 실시간 이벤트에 대한 빠른 처리와 동기화가 주 관건이다.



웹 애플리케이션 서버(WAS)

  • Stateless: HTTP 프로토콜을 통해 각 요청은 독립적으로 처리되며, 서버는 응답 이후 그 상태를 유지하지 않는다.
  • 단방향 통신: 클라이언트가 서버에 요청을 보내고, 서버가 응답을 반환하는 방식이다.
  • 응답: 클라이언트의 요청에 대해 반드시 응답을 반환해야 한다.
  • 예시: 온라인 쇼핑몰, 은행 서비스 등.

게임 서버

  • Stateful: 각 클라이언트의 상태를 지속적으로 추적/관리하여 상태 유지와 실시간 동기화를 한다.
  • 실시간 양방향 통신: 클라이언트와 서버 간의 지속적인 데이터 교환이 필요합니다. 플레이어의 행동이 실시간으로 다른 플레이어에게 반영됩니다.
  • 응답: 클라이언트 요청에 대해 반드시 개별 응답이 필요한 것이 아니라, 게임 상황에 따라 여러 클라이언트에게 동일한 정보를 broadcast하는 경우가 많다.
  • 예시: MMORPG, FPS 게임 등.






게임서버에서 중요한 것


앞에서 말했듯이, 게임의 실시간성 때문에 제 1원칙으로 중요한 부분은

결국 실시간 동기화와 관련하여 시간 성능이 제일 중요하다고 생각한다.



응답 시간은 결국 유저의 플레이 경험과 관련하여 밀접한 관련을 가지기 때문에

불쾌한 UX를 경험한다면 유저의 이탈을 막기란 쉽지 않기 때문이다.



여담으로 필자가 2개월간 인턴을 한 모 게임회사에서, 서버 팀장님께서는 성능이 매우 중요한 부분이기 때문에 전통적인 MVC 패턴을 버리고 최대한 오버헤드를 덜어낸 경량화된 아키텍쳐를 사용한다고 말씀하셨던 것이 기억난다. 또한 전반적인 게임 서버는 .NET을 통해 진행하지만, 게임 룸에서 입장한 플레이어들의 실시간 판정이 중요한 인게임에서는 소켓 통신을 이용하는 혼합방식을 택했다.



두 번째는 보안이다.

모든 게임에 대해서 Anti-cheat를 하기 위한 노력은 필수불가분하다. 이를 추적 관리하기 위한 서버에서 로깅 환경도 중요할 것이다.

profile
안녕하세요, 고재영입니다. 언제나 즐겁게 살려고 노력합니다.

0개의 댓글