[▲엑스엘게임즈 김민욱 개발자]

  • 주제: '달빛조각사' 엘릭서를 이용한 MMORPG 서버 개발
  • 강연자 : 김민욱 - 엑스엘게임즈 / XLGAMES
  • 발표분야 : 프로그래밍
  • 권장 대상 : 서버 프로그래머
  • 난이도 : 기본적인 사전지식 필요


  • [강연 주제] 아직까지 많은 게임 서버는 C++/C# 과 같은 객체지향언어로 개발되고 있습니다. 저도 마찬가지로 C++를 이용해 여러 게임을 개발하고 서비스해왔습니다. 현재 저는 달빛조각사라는 프로젝트에서 엘릭서라는 함수형 언어를 이용해 서버를 개발하고 있습니다. 이전까지 C++ 프로그래머였던 제가 함수형 언어 '엘릭서'를 이용해 모바일 MMORPG 서버를 개발하면서 고민했던 내용과 개발과정에서 얻은 경험을 공유하고자 합니다.

    판교 넥슨 사옥에서 진행되는 넥슨 개발자 컨퍼런스, NDC 2019 첫 번째 날에는 엑스엘게임즈의 김민욱 프로그래머가 강단에 올라 신규 프로젝트 ‘달빛조각사’ 개발에 이용하고 있는 신생 프로그래밍 언어인 엘릭서(Elixir)를 소개했다.

    이날 강연에는 모바일 MMORPG 신작, ‘달빛조각사’의 일러스트가 공개되기도 했다. 엑스엘게임즈의 신작 ‘달빛조각사’는 정통 MMORPG의 경험을 모바일에서 구현하는 것을 목표로 하고 있으며, 쿼터뷰 시점의 존을 이동해 진행하는 게임 플레이를 담을 예정이다.


    ▲공개된 '달빛조각사' 아트 일러스트

    신생 프로그래밍 언어인 엘릭서는 함수형 언어로, 아직은 쉽게 접하기 어려운 생소한 언어다. 이날 강연에서 김민욱 프로그래머는 엘릭서의 특징을 설명하고, 서버 구조 설계와 엘릭서를 도입한 결과를 소개하는 자리를 가졌다. 그는 이 강연을 통해 신생 언어인 엘릭서에 대한 심리적 장벽을 낮추고, 새로운 영감이나 구조를 설계할 때 사고에 전환을 줄 수 있는 계기가 되길 바란다고 설명했다.

    엘릭서의 첫번째 특징은 현대적이고 생산적인 언어라는 점이다. 엘릭서는 빌드, 배포, 유닛테스트, 패키지 매니저, 문서화 등 시스템을 갖추고 있다. 또한, 프로젝트를 생성하고 관리 및 배포를 통합적으로 관리하며, 다양한 하위 프로젝트를 통합 관리하는 엄브렐라 프로젝트 기능을 제공한다. 인클루드가 없어 하위 프로젝트나 종속되어있는 라이브러리에 직접적으로 접근이 가능하다는 특징을 가지고 있다. 또한, 파이프 연산자 기능, 패턴 매칭을 지원해 가독성 있게 처리해준다. 자동 코드 포맷팅으로 컨벤션을 강제하기 때문에 스타일에 대한 논쟁이 없어져 시간을 절약해주기도 한다.

    김민욱 프로그래머는 이어 두 번째 특징으로 안정적인 얼랭(Erlang)을 기반으로 하는 견고한 언어라는 점을 꼽았다. 물론 안정성은 코드를 잘 짜야 한다는 점이 중요하지만, 언어 차원에서 다양한 기법을 제공한다는 것이다.


    엘릭서 코드는 기본적으로 가볍고 작은 프로세스 단위 내에서 실행되며, 수십만 개의 프로세스를 생성할 수 있다. 각 프로세스는 액터 기반 모델로, 메시지를 주고받을 수 있다. 따라서 클라이언트와 통신할 수 있는 서버를 몇 줄만으로도 제작할 수 있으며, 하나의 프로세스가 종료되더라도 전체 서비스에 영향을 미치지 않는 마이크로 서비스를 쉽게 제작할 수 있다.

    엘릭서의 특징은 서버가 다운됐을 때 버그에 의한 프로세스를 죽게 놔둔다. 그리고 이 죽은 프로세스를 다시 살리는 슈퍼바이저 기능을 제공한다. 드물게 일어나는 복잡한 예외 사항에 대해서는 해결하기보다는 아예 프로세스를 종료시키고 재 시작하기도 한다. 김민욱 프로그래머는 이러한 메커니즘을 통해 ‘달빛조각사’의 사내 테스트를 진행하는 동안 문제없이 서버 서비스를 할 수 있었다고 덧붙였다.

    엘릭서 언어의 허들은 크게 세 가지로 나눠볼 수 있다. 먼저, 함수형 언어이기 때문에 심리적 진입 장벽이 생길 수 있다는 점이 있으며, 지원하는 매크로가 있는데 이에 대한 학습이 다소 어렵다는 점이다. 마지막으로, 얼랭코드에 대한 허들 또한 존재한다.

    엘릭서의 서버 구조 설계에서 중요한 것은 프로세스를 나누는 기준이다. 프로세스 간 인터랙션이 많지 않은 로직, 명확하게 분리 가능한 콘텐츠는 무엇인지, 비동기로 동작하는 로직까지, 실제 프로세스 로직 처리 비용이 비싼 경우가 프로세스를 나누는 기준이 된다. 이어 김민욱 프로그래머는 유저 프로세스와 지역 프로세스 간의 메시지 전달 및 처리 과정, 공격자와 피격자의 프로세스간 메시지가 전달되고 반영하는 과정을 설명했다.


    이러한 과정은 채널 프로세스에 집중되는 병목을 분산시키고, 액터 기반으로 인터랙션하는 프로세스를 기반으로 변경되기 때문에 특정 프로세스에 버그가 생긴다고 하더라도 서비스 자체가 다운되지 않는다. 전체적으로 성능과 안정성, 생산성을 증가시킬 수 있다.

    김민욱 프로그래머는 그 외에 엘릭서의 기능으로 OTP(Open Telecom Platform)과의 호환, ETS 등 다양한 기능 지원, 그리고 기본적으로 매크로로 만들어져있어서 좀 더 빠르게 치트를 추가할 수 있다는 점을 꼽았다. 또한, 인터랙티브 모드(쉘 모드)로 실행 가능하다는 점, 동적 코드 리로딩, 실시간 코드 패치 등도 언급됐다.

    엘릭서는 아직까지는 마이너한 언어지만, 매년 얼랭 및 엘릭서 컨퍼런스가 개최되고 있으며, 반년 주기로 업데이트가 진행되고 있다. 김민욱 프로그래머는 현재 엘릭서가 활용되고 있는 사례로 디스코드를 언급하며, 메시지, 소셜 네트워크에서 많이 사용되고 있다고 설명했다.

    이어 그는 엘릭서 도입의 장점으로 빠른 빌드를 구성할 수 있었으며, 메모리 릭은 해결하지 못하나 메모리 문제에서 어느 정도 해방될 수 있다는 점을 꼽았다.

    김민욱 개발자는 마지막으로 REST API를 사용하는 Stateless 게임 서버, 스케일 아웃 가능한 벡엔드 서버, MO 형태의 게임 서버에 엘릭서 언어를 추천하며, MMORPG의 경우 ‘달빛조각사’에서 시도해보겠다고 전했다. 그는 “멀티 코어 시대에 공짜 점심은 없다는 말이 있다. 엘릭서는 근본적으로 프로세스를 잘게 나누며 하드웨어 리소스를 최대한 활용한다. 엘릭서가 새로운 공짜 점심이 되어줄 수 있지 않을까 기대한다”며 강연을 마무리했다.