출처 : http://www.ebuzz.co.kr/content/buzz_view.html?uid=78004
온라인 게임에서 기본적인 캐릭터 생성, 이동, 기본 공격 및 스킬 그리고 게임에 또 다른 재미를 주는 파티와 길드. 또한 이제는 이미 게임의 대세가 되어버린 퀘스트와 인스턴트 던전. 이런 모든 것은 클라이언트 상에서 보이지만 실제로 구현을 위한 규칙과 룰은 서버 프로그래머가 창조를 한다. 이처럼 실제 모든 게임을 창조하고 구동하는 서버와 서버 개발에 대해서 알아보기로 하자.
■ 온라인 게임 서버와 서버프로그래머
온라인 게임에서 게임 서버란 모든 유저들이 살아가는 세상의 터전을 말한다. 인간이라는 개체가 살아가는 지구라는 행성과 같다고 할 수 있다. 이런 세상의 기초가 되는 게임 서버를 창조하는 분야가 서버 프로그래밍이며 건축물의 개발과정에서 본다면 기반 공사 및 뼈대 공사라고 할 수 있다.
온라인 게임에서 서버 파트가 담당하는 업무는 핵심적이면서도 매우 다양하다고 할 수 있다. 게임 개발 초기에는 게임 기획자들과 업무협조를 하면서 업무를 진행한다. 회사마다 약간씩 다르기는 하지만 대부분 기초 기획에 대해서 같이 토론을 하며 프로그램적으로 실현가능성이 있는지 즉 시스템이 개발이 가능한지를 검토한다.
그리고 마지막으로 테이블 디자인을 하는데 쉽게 설명하면 기본 구조를 형성하는 작업이라고 할 수 있다. 초기 개발 단계에서 서버와 클라이언트 간의 통신모듈(네트워크) 작업도 진행된다. 시중에 나온 서버 프로그래밍 책들이 대부분 ‘어떻게 통신 한다’ 이런 식으로 게임 서버에 접근하는데 실제로 통신관련 작업은 너무 기본적인 작업이다.
대부분의 일반 사람들은 서버업무라고 하면 네트워크를 제일 중요한 작업으로 생각하는데 실제 서버 프로그램 작업에서 통신 업무는 얼마 되지 않는다. 오히려 다른 시스템 작업과 유기적인 서버구조 및 유지보수의 편의성을 구축하는 것이 더 힘들다고 할 수 있다.
초기 개발 작업 이후 본격적으로 게임 개발이 진행되면 서버 파트는 시스템을 만드는 작업을 하는데 이는 기획에서 나오는 모든 것을 제작하는 것이라고 할 수 있다.
아이템, 경험치, 전투, 파티, 스킬 및 AI 등 거의 모든 기본적인 시스템을 만든다. 게다가 최근에는 여러 가지 해킹 툴 및 해킹 프로그램(스피드 핵, 한방 핵 등)으로 인해서 많은 부분을 서버에서 처리하는 방식이기 때문에 결국 클라이언트는 보여주는 게 전부가 되어 버리곤 한다. 물론 그렇다고 클라이언트 개발이 쉽고 의미가 없다는 말은 아니다.
이처럼 서버파트는 온라인 게임의 기본적인 세계를 구현하고 수많은 유저들(클라이언트) 움직임과 행동을 중계방송 해주고(통신) 서로에게 실시간으로 알려줌으로써 모든 유저들이 동시에 플레이하는 것처럼 느끼게 만들어 주는 일을 한다고 할 수 있다. 즉 수많은 유저들의 움직임과 행동을 전파해 줌으로서 서로 중계역할을 한다고 할 수 있다.
■ 게임 서버의 분류
기본적으로 온라인 게임에서 서버 구조는 그 장르를 결정하는 중요한 요소라고 할 수 있다. 우선 채널형 게임 서버 구조와 MMO(Massively Multi-players Online)형 게임 서버 구조로 나눌 수가 있다. (실제로 서버를 분류하는 방식은 여러 가지가 있으며 여기서는 수용인원 규모에 따른 채널 유무로 나누었다.)
채널형 게임 서버는 게임 서버를 채널 방식으로 나누어 채널별로 100~500명으로 인원을 제한한 것을 말하며 실제 플레이는 한 방(Room)에서 2~8명의 플레이어에 의해 진행된다. 대형게임 포탈의 고스톱, 테트리스 등이 모두 포함되며 캐주얼 게임인 포트리스, 크레이지 아케이드, 카트라이더 등이 해당된다. 비교적 서버 당 수용인원이 적은 게 특징이다.
MMO형 게임 서버 구조는 바람의 나라, 뮤 온라인 같은 일반적인 존(Zone) 방식의 게임 서버를 의미하며 최근에는 존 방식 대신 심리스(Seamless) 맵 방식이 널리 애용되고 있다. 대부분의 경우 한 서버 당 수용인원이 채널형 서버보다 월등하게 많다.
이 중에서 존 방식(Zone) 구조는 특정지역 즉 맵과 맵이 따로 분리돼 있어 맵을 이동할 때 로딩이 진행되는 방식을 말하며 맵 하나하나를 따로 존이라고 부른다.
존 방식의 경우 존을 따로 로딩하므로 탁월한 퀄러티와 섬세한 그래픽을 보여주며 기본적으로 랙을 최소화할 수 있다. 하지만 잦은 로딩이 있을 경우 번거로울 수가 있으며 전체적으로 맵이 좁게 느껴지는 단점이 있다. 대표적인 게임으로는 그라나도 에스파다, 데카론 등이 있다.
심리스(Seamless) 방식은 유저들이 현 포지션에서 취할 수 있는 위치 이동을 예측해 미리 로딩 하는 방식을 의미하며 로딩 없이 모든 맵의 이동이 이루어진다. 한꺼번에 모든 맵을 로딩 하는 것 같지만 실제로 모든 맵의 구역이 있으며 해당 구역을 조금씩 로딩 하는 방식이라고 할 수 있다.
심리스 방식의 장점은 맵이 넓다는 것이고 그런 맵을 자유롭게 이동할 수 있으므로 맵 이동에 있어서는 최상의 자유도가 있다고 할 수 있다. 하지만 존 방식의 장점이 그대로 심리스 방식의 단점이 되어 아무래도 그래픽 퀼러티가 저하된다고 할 수 있다.
한편 에버퀘스트2나 아이온의 경우 존 방식을 지원하지만 개별 존이 여타 온라인 게임 전체 맵의 1/4 에 육박하므로 존 방식의 단점인 답답한 느낌을 주지는 않는다.
■ 게임 서버의 구조
온라인 게임에서 내부적으로 게임을 구동 및 진행시켜주는 것은 게임 서버이기에 게임 서버의 구조는 게임의 진행과 시스템 효율성에 많은 영향을 미친다. 또한 물리적으로 한정적인 시스템 자원을 효율적으로 사용하기 위해서 다양한 분산 처리는 필수적인 요소이다. 분산처리 구조를 얼마나 효율적으로 하느냐에 따라 좀 더 세련되고 뛰어난 성능을 발휘할 수 있는 게임 서버를 구축할 수 있는 것이다.
온라인 게임에서 서버는 실질적인 게임을 진행하는 역할을 담당한다. 앞서 말한 바와 같이 게임 서버는 유저간의 동기화, NPC의 인공지능, 전투 및 아이템 시스템 등 게임 시스템의 총 집합이라 할 수 있다.
게임 진행에 필요한 모든 게임의 요소들을 총괄하여 진행시켜주는 작업을 하기 때문에 당연히 가장 많은 일을 담당한다. 또한 이런 게임 요소들의 데이터양이 매우 방대하기 때문에 하나의 서버에서 이 모든 것을 처리하는 데에는 많은 부담이 된다.
게임 서버 테스트 과정에서 수십 명 단위의 서버 처리는 크게 문제가 되지 않는다. 최근에는 서버를 구성하고 있는 하드웨어 성능이 발달하였고 게임 쪽에도 고사양의 서버를 사용하기 때문에 서버의 부담이 줄어든 것도 사실이다. 하지만 실제로 게임 서버를 구동 시 동시에 많은 수의 사용자가 접속하고 그 접속 유저가 늘어나면 날수록 서버가 부담하는 부하 수치는 급격한 증가를 보이게 된다.
또한 최근 온라인 게임이 예전에 비해서 콘텐츠 수가 급격하게 증가했으므로 얼마나 많은 콘텐츠를 과부하 없이 적용시키느냐가 중요한 요소가 된다. 그렇기 때문에 실제로 서버 프로그래머가 게임 서버를 제작하면서 가장 신경을 써야 하는 것이 서버의 과부하 분산이며 이런 것이 실력이자 노하우라고 할 수 있다.
앞서 말한 것처럼 네트워크가 중요한 것이 아니고 이런 최적화 및 최적화를 실현하기 위한 알고리즘이 더 중요한 것이다. 실제로 최근의 게임 서버를 보면 NPC 서버와 동기화 서버를 분리하는 경향이 뚜렷하다. 우선 NPC 서버는 구성에 따라서 게임 서버에 가장 많은 부하를 줄 수 있기 때문이다.
특히 AI 작업의 경우 패키지 게임에서는 클라이언트에 AI를 넣지만 온라인 게임은 서버에 MOB들의 전투 AI가 포함되므로 서버에서 처리하는 작업이 생각보다는 많다고 볼 수 있다. 예를 들어 인던이 100개가 생성이 됐고 각 인던마다 몬스터가 500마리씩 출현한다고 하면 약 5만 개의 AI를 처리해야 한다. 거기다가 모든 인던을 합쳐 보스 몬스터도 100마리 정도는 될 것이고 보스 몬스터의 AI는 더욱 까다롭기에 AI 처리가 복잡하게 된다.
사실 이런 5만 개의 AI를 한 서버에서 처리할 수는 있지만 막상 유저는 100명 일 수도 있는 것이다. (각 인던마다 1명씩만 출입한 경우) 이런 현상이 발생하면 한 대의 서버가 부담하는 과부하는 대폭 증가하지만 실제로 이득을 보는 것은 별로 없다고 할 수 있다. 이런 현상에서도 효율적으로 대처하기 위해서 많은 부하를 차지하는 NPC의 AI 부분을 따로 분리해 전체 게임 서버의 부하를 줄이게 된다.
이 경우 게임 서버는 NPC 오브젝트만 생성한다. NPC 서버가 게임 서버에서 생성된 NPC 오브젝트의 AI 부분을 처리하는 것이다. 게임 서버 입장에서는 NPC 서버와 통신을 해야 하는 번거로움은 있지만 결과적으로는 많은 리소스를 절약할 수 있으며 NPC 서버를 이용하여 더욱 복잡하고 뛰어난 AI를 만들어 내는 장점도 있다.
온라인 게임을 하다가 가끔 서버가 다운되어서 재접속을 했을 때 맵이랑 필드는 보이는데 NPC가 안 보이는 경우가 있는데 이럴 때 NPC 서버가 분리되어 있다는 것을 느낄 수 있다. 한편 이런 경우는 NPC 서버와 게임 서버 간의 동기화가 안 된 상황에서 클라이언트가 접속하였을 때 발생하며 이후 시간이 지나면 NPC가 생겨나는 것을 볼 수 있다.
또한 게임 서버가 가장 중요시해야 하는 일이 중계역할로서의 캐릭터 간 동기화 작업이다. 동기화 작업이라는 것은 위의 경우처럼 캐릭터가 접속할 때부터 지속되는 것이며 서로 간의 동기화를 맞추기 위해서 캐릭터의 일정 반경 안에 있는 다른 모든 캐릭터와 NPC 정보를 서로 간에 알려주는 것을 말한다.
이런 동기화는 많은 부하가 걸리는 작업이므로 NPC 서버와 마찬가지로 동기화 서버를 분리해 처리하며 이를 통해 전체 게임 서버의 퍼포먼스를 향상시킬 수 있다. 그러므로 서버 개발자는 개발 시 항상 서버 분산화를 염두에 두고 설계를 해야만 하며 이를 위한 테스트와 지식 획득을 게을리하지 말아야 한다.
실제 운영되고 있는 게임의 서버 구조 |
위 모식도는 실제로 구동되고 있는 한 상용게임의 대략적인 게임 서버 구조이며 일반적인 온라인 게임의 경우 크게 위의 모식도처럼 서버가 분리 운영된다. 모식도에서도 NPC 서버와 동기화 서버 역할을 하는 에이전트 서버는 분리되어 따로 구동되는 것을 알 수 있다.
대부분 온라인 게임의 게임 서버는 이처럼 비슷하지만 실제로 같은 서버구조를 가진 게임은 거의 없다고 해도 과언이 아니다. 필요에 따라서 구조가 달라진다고 보는 게 맞으며 한 가지 확실한 것은 서버 구성이 복잡해질수록 프로그래밍 복잡도도 그만큼 올라간다는 사실이다.
최근에는 날로 좋아지는 하드웨어 성능(물리적인 서버)을 믿고 단일 서버에 이런 서버를 다 몰아넣은 온라인 게임이 개발되기도 한다. 하드웨어의 발전으로 확실히 예전보다는 프로그래밍도 좀 쉽고 관리가 편해졌다고 할 수 있다.
■ 서버와 동접
동접 5만, 10만 같은 이야기는 흔히들 들어 봄 직한 단어다. 동접이란 동시 접속자 수를 의미하며 일반적으로 전체 서버를 합한 수치를 의미한다. 그렇기 때문에 서버 수가 많은 온라인 게임이 기본적으로는 동접자 수도 높다고 할 수 있다.
이처럼 서버 수와 동접을 이야기할 때 “왜 이렇게 서버를 나누어 놓았을까” 혹은 “단일 서버에 전체 유저를 다 접속시키면 동접 계산하기에도 편하고 다 같이 즐길 수 있어 더 좋지 않을까”라는 생각을 안 해본 유저는 아마도 없을 것이다.
마케팅적인 요소를 전부 제외하고 생각한다면 실제 서버를 분할하는 이유는 서버의 한계 때문이라고 할 수 있다. 대부분의 MMORPG 온라인 게임은 기본적으로 장비 창이나 인벤토리 창 등을 모든 캐릭터가 소유하고 있다. 이런 아이템 보관함이나 아이템 등의 데이터는 패키지 게임이라면 당연히 클라이언트가 보관하겠지만 온라인게임의 경우 해킹이나 비정상적인 종료 등의 위험으로부터 보호하기 위해서 모두 서버에 보관하고 있다.
개별 캐릭터가 해당 공간을 이용할 경우 내부적으로 서버와 클라이언트 간의 동기화 및 데이터 통신이 이루어지는데 이런 통신하는 데이터를 의미하는 패킷 양에 의해 서버 당 최대 동접이 결정된다고 볼 수 있다. 즉 서버의 한계로 인해 무한히 늘어나는 패킷 양을 감당할 수 없어 동접자 수를 제한하는 것이다.
패킷 양을 계산하여 동접을 제한할 때 기본적으로 인터넷 회선 용량에 의해서도 영향을 받는다. 게임의 캐릭터당 서버와 주고받는 데이터 패킷의 평균치를 계산하여 인터넷 회선 용량 이내로 잡아야 하는 것이다.
그리고 메모리 용량도 동접이 제한되는 서버의 한계라고 할 수 있다. 시스템 개발 시 아무리 데이터를 적게 차지하는 방식으로 제작한다고 하여도 인벤토리, 스킬, 몬스터나 전투 공식 등 여러 요소가 서버 메모리에 로드되기 때문에 메모리 크기도 동접의 제약 조건이 된다.
한편 여러 가지 요소에 의해 서버가 처리할 패킷 양이 많을 경우 하드웨어적인 장비로 커버하기도 한다. 예를 들어 와우(월드 오브 워크래프트)의 경우 게임 내 시스템이 다양하고 맵의 형태도 심리스 방식이라 많은 패킷을 차지한다. 그래서 와우는 심리스의 넓은 맵을 서버가 분할해서 처리해 어느 정도의 메모리 제약은 장비로 커버한다고 할 수 있다. 메모리의 양을 대폭 늘려 메모리 당 처리하는 과부하를 줄여주는 방식이라고 할 수 있다.
물론 존 방식의 게임도 패킷 량을 장비로 커버할 수 있으며 심리스 방식보다 장비가 적게 소비된다. 쉽게 얘기한다면 서버의 한계 즉 서버의 대역폭 때문에 단일 서버가 아닌 여러 개의 서버로 분리되며 각 서버의 대역폭에 의해 서버 당 최대 동접도 결정이 되는 것이다. 또한 이런 대역폭은 어느 정도는 장비로 커버가 가능하다.
그렇기 때문에 서버 프로그래머는 어떻게든 서버와 클라이언트 간의 데이터를 최소화시켜 동접을 늘리려 노력한다. 인벤토리 내의 아이템 이동 방식이나 상점에 판매한 아이템의 정보를 몇 개까지 있느냐 등의 사소해 보이는 여러 가지 사항에 대해서 기획자와 의견 충돌하는 것이다. 왜냐하면 기획자에게는 새로운 시스템이지만 서버프로그래머에게는 단순한 패킷 양이기 때문이다.
그리고 서버 프로그래머는 캐릭터당 패킷 대역폭도 중요하지만 한 지역에 유저가 많이 몰리는 경우도 생각해야 하기 때문에 이런 문제에 더욱 민감할 수밖에 없다.
그래서 실제로 많은 기획 내용이 패킷 문제로 어느 정도 걸러지기도 한다. 다양한 시스템이 도입되고 모든 걸 할 수 있는 자유로운 온라인게임을 만들 수는 있지만 서버 당 최대 동접 제한이 100명이라면 누가 그런 온라인 게임을 플레이 할 것인가.
게다가 최근 온라인 게임은 많은 콘텐츠가 추가돼는 추세이다 보니 서버 프로그래머와 기획자는 항상 최소의 데이터로 최대의 효과를 보기 위해서 오늘도 머리를 싸매고 있다고 할 수 있다.
■ 서버와 해킹
어느 정도 유명해진 게임이라면 끊임없이 해킹 툴이 발견된다. 특히 예전에 개발된 게임들에서 많이 발견되고 있는데 스피드 핵, 한방 핵, 메모리 핵 등이 대표적이다. 예전 디아블로2 맵 핵은 거의 모든 국내 사용자가 사용할 정도였다.
최근에는 어느 정도 규모 이상의 온라인 게임은 외부 해킹 방지 프로그램을 사용한다. 물론 어느 정도 효과를 볼 수 있으며 대외적으로 ‘고객으로부터의 신뢰’도 얻을 수 있는 장점이 있다. 하지만 게임 서버를 보호한다는 관점에서는 거의 효용성이 없다고 할 수 있다.
일단 이런 외부 프로그램의 경우 일단 해킹 프로그램을 찾기 위해 외부 해킹 방지 프로그램에 목록이 등록돼야 하는데 해당 목록이 등록될 때면 이미 널리 퍼져서 많은 피해가 발생한 경우가 많다.
또한 이런 해킹 툴의 경우 업데이트 주기가 매우 빠르다. 유명 해킹 툴의 경우 게임이나 외부 해킹방지 프로그램이 업데이트를 하면 거의 실시간으로 버전 업이 된다. 안티바이러스 프로그램과 바이러스 프로그램과의 관계와 같다고 할 수 있다.
이런 해킹 툴 등을 막기 위해서는 기본적으로 서버에서 패킷의 암호화가 필요하다. 해킹 툴이라는 것이 대부분 서버와 클라이언트 간의 패킷을 훔쳐서 수정하는 경우가 많은데 기본적으로 패킷을 주고받을 때 암호화를 하면 많은 부분 해킹을 예방할 수 있다.
하지만 모든 패킷에 이 방법을 적용할 수 있는 것은 아니다. 서버는 굉장히 많은 패킷을 보내야 하는데 그때마다 암호화 및 복호화가 일어난다면 이것 또한 상당한 부담이 되기 때문이다. 암호화를 할 때는 어느 정도 속도와 보안을 생각해야 하며 그런 이유로 최근에는 무거운 암호화 알고리즘을 사용하지 않는 추세다.
패킷 암호화 이외에도 기본적으로 클라이언트에 많은 권한을 주지 않아야 한다. 국내 온라인게임 초기 서버관련 기술의 미비로 - 받쳐줄 수 있는 제대로 된 서버 장비가 없어서인 경우도 있다 - 클라이언트에 많은 권한을 주었는데 이것으로 인해서 영구히 막을 수 없는 해킹 툴이 지금도 지속적으로 암약하고 있는 온라인 게임도 있다. 이런 게임의 경우 솔직히 서버 자체를 재설계하지 않는 이상 방법이 없다고 할 수 있다.
그러므로 서버 프로그래머는 ‘클라이언트는 항상 적의 손에 있는 것’이라고 생각해야 하며 클라이언트로부터 온 정보를 최대한 보수적으로 해석해서 클라이언트로부터 온 잘못된 정보에 의해 서버 정보가 망가지지 않도록 주의 깊게 구현해야만 한다.
■ 서버 강국 대한민국과 서버 프로그래머
‘온라인 게임 강국 대한민국’이라는 말과 ‘게임 서버 강대국’이라는 말은 온라인 게임이 강세를 띠기 시작한 시점부터 흔히 들을 수 있는 말이다. 하지만 이런 말들이 현재 진행형이냐고 묻는다면 아니라고 할 수 있다.
게임 업계에서 서버가 필요한 분야는 온라인 게임이라고 할 수 있는데 전 세계 게임 시장에서 온라인 게임이 차지하는 비중은 약 9% - 네트워크 되는 패키지 게임을 제외한 결제방식으로만 온라인 게임 유무를 비교할 때 - 정도다.
이 중 와우가 차지하는 비중이 60%가 넘는다. 3, 4위인 리니지와 리니지2를 합해도 약 13%밖에 되지 않는다. 또한 2005년도에 10.2%에 이르던 국산 게임의 세계시장 점유율도 2007년 기준으로 3.5%로 하락하였다.
이런 걸 감안할 때 우리나라가 게임 강국 혹은 서버 기술력이 대단하다고 하기에는 많이 모자란다고 할 수 있다. 그리고 우리가 많이 비교하는 일본의 경우는 온라인 기술 자체가 한참이나 늦게 도입되었기에 비교 대상으로 삼기에는 부족하다고 할 수 있다.
그래서 일선 서버프로그래머들은 “한국 서버기술이 진짜로 강세라고 생각해 본적은 없다” 라며 오히려 외국 온라인 게임을 보면서 배울 점을 많이 찾는다고 한다.
이런 이야기를 하는 것은 국내의 서버 기술력이 부족하다거나 서버 프로그래머들의 노고를 깎아내리자는 것은 아니다. 오히려 언론매체 등에서 무분별하게 재생산되는 자화자찬식 어구에서 눈을 떠 좀 더 현실적인 측면에서 많은 노력을 해야 한다는 것을 말하고 싶은 것이다. 물론 이런 것들이 온전히 서버의 노력만으로 이루어지지는 않기에 다른 파트의 많은 노력도 함께 있어야만 한다.
마지막으로 서버프로그래머를 꿈꾸는 사람들에게 서버 프로그래머는 여러 기반 기술들을 많이 사용하기 때문에 기본 기술이 가장 중요하며 기획자와 많은 의견 충돌이 있으므로 아무래도 코더나 프로그래머적인 가치관보다는 트레이드오프(trade-off)적인 가치관을 가지고 있어야 한다고 말해주고 싶다.
기술자나 엔지니어들은 계산적, 수치적으로 모든 것을 논리적으로만 따지려는 특징이 있는데 실제 개발에 필요한 협업에서는 그것만으론 해결이 안 되기 때문이다. 즉 게임 서버 개발자가 되려면 기술적인 측면도 중요하지만 협력의 스킬이 무엇보다 더 중요하다고 할 수 있다.
그리고 항상 즐거워해야 한다. 이건 다른 파트에도 마찬가지지만 특히 프로그래머들에게는 필수적이라고 할 수 있다. 매일 프로그램 코드를 보는 것이 직업인 프로그래머들에게 지겹다는 생각이 든다면 일 자체가 힘들 수밖에 없기 때문이다.
'ETC > 프로그래머 이야기' 카테고리의 다른 글
열혈강의 HTML5 게임 프로그래밍 - 네이티브 못지 않은 멀티 플랫폼 게임 만들기 (0) | 2014.04.02 |
---|---|
온라인 게임 서버 프로그래머 (0) | 2011.08.13 |
개발자라며...? (0) | 2011.08.13 |
[한국게임업계 파워인맥] 게임업계 인물 대동여지도 (0) | 2011.08.13 |
[프레시안] '일의 노예'… 한국의 IT개발자가 사는 법 (0) | 2011.08.13 |
