커뮤니티

신년인사와 개발이야기

작성자
작성일자
2021-01-03 18:41:16
조회수
84

21년이 밝았습니다. 새해에는 더욱 건강하시고, 복 많이 드시길 바랍니다.

새해인사와 더불어, 그동안의 티엠서버 개발이야기를 한번 적어보았습니다.

1. 티엠서버의 시작

티엠서버를 운영한지도 4년차입니다. 네이버 카페 과거 공지들을 찾아보니, 17년 12월 30일날 티엠본섭 1기을 시작했었네요 https://cafe.naver.com/samtm/21 (티엠카페를 늦게만들어서, 오픈날보다 글작성시간이 늦습니다)

흑칠랑님이 공개하신 07년도 칠랑올드 코드는 예전부터 갖고 있었습니다. 따라서, 칠랑서버는 예전부터 오픈할 수 있었지만, 20년전 스타일로 작성된 perl 코드와 cgi 개념을 제가 이해를 하지 못했고, 억지로 열더라도 운영할 자신이 없었습니다.

17년 연말에 갑자기 삼국지모의전투 생각이 나서, 초선서버 칠랑카페 체섭 등을 순회하다가 (저도 과거부터 삼모를 라이트하게 했던 유저입니다.) 우연히, 앵벌스님이 삼모전 개발자를 찾는다는 글(삼모 부흥)을 카페에서 보게되었고, 갠톡을 드려서 이야기를 해보게됩니다.
운영도 해주시고, 인원도 모아주신다는데, '일단 한번 해보자!' 라는 마음으로 삼모전 관리와 개발을 시작했었습니다.

코드들이 파일시스템 기반으로 동작하다보니, 사비로 SSD기반의 VM 서버를 구매했었고, 이왕 하는거 최신버전으로 운영해볼 생각에 칠랑님(군세섭), 묘재님(묘재섭), 유기체님(체섭)에게 코드공개를 해주시면 삼모를 발전시켜보고 싶다는 메일을 보내게 됩니다.

image
(보낸메일함)

칠랑님은 메일을 5월에 읽으셨지만, 답장을 해주시지 않았고, 묘재님은 바로 답장해주셨지만 오픈소스로 재작업이 어렵다는 회신을 받게 됩니다. 유기체님은 5일날 2.91버전 코드를 오픈소스로 공개해주셨습니다. https://cafe.naver.com/62che/632

체섭코드도 오픈소스를 목적으로 만들어진 코드는 아니기도 해서, 여러 삽질끝에 1월 8일날 티엠체섭을 오픈하게 됩니다.
(maccyu 기반 삼모전은 단순해서 바로 구동이 되지만, 아마도 개발자가 아니시면, 체섭 오픈소스는 얻더라도 구동하기가 힘드실겁니다.)
https://cafe.naver.com/samtm/26

2. 구 서버의 개발

칠랑서버의 낡은 perl 코드, 전역선언, 파일시스템 기반 등은 신규 기능 개발과 패치를 매우 어렵게했습니다. 하나를 고치면 어디서 버그가 터질지 알 수 없는 형태이고, IDE(개발도구)에서도 추적이나 디버깅을 할 수 없었습니다.

또한, 버그가 매우많아서, 신규기능 추가보다는 대부분 버그해결과 편의성 증대 패치들 위주로 진행되었습니다. 체비님의 소개로 삼모를 시작하신 람다식 님이 칠랑패치에 많은 기여를 해주셨습니다. 함께 협업하기위해, 구동중인 서버 이외에 테스트서버가 필요했는데, 이것을 구매하고 구축한 후에 해당 서버를 돌려쓰며 협업했었네요

당시, 멀티문제가 대두되어서 카카오인증을 도입하고, 앵벌스님이 정리해주신 몇가지 밸런스 패치, 잡버그 해결 이외에는 람다식님이 거의 패치해주셨습니다.

티엠체섭은 개발자였던 HideD님과 SARS님이 기여해주셨습니다. 체섭은 카카오인증 외에 제가 패치한 것은 없는 것 같네요 18년 5월쯤부터는 HideD님이 직접 히데체서버를 오픈하시면서, 티엠체섭은 앵벌스님이 리셋만하는 상태가 되게됩니다.

3. 구 서버의 운영

과거부터 삼모서버는 수없이 많이 만들어졌었지만 모두 망했습니다.

단순히 코드를 구하고 구동시켜두는 것은 시작일뿐, 인프라비용, 유저 간 분란, 각종 어뷰징사례(멀티, 시스템악용 등), 버그 등 나열하면 끝이 없을 것 같네요 어쩔 땐, 매일 N시간씩 서버를 들여다봐야했습니다.

이렇게 들여다보지 않으려면, 어뷰징 모니터링, 인프라 자동화(배포 등), 관리자도구 들이 있어야했습니다. 하지만, 구서버들에서 이런 기능들을 추가하기엔 매우 어려웠습니다.

예를들면 멀티는 앵벌스님 입장에선 찾는게 어렵습니다. 사실상, 제가 서버의 터미널에 접속해서, access log 등 여러가지를 대조해봐야합니다. 이런 관점에서 저도 운영리소스가 계속 소모되었습니다.

또한, 사람에게서 오는 스트레스와 부담이 상당합니다. 삼모좀 오래하셨다는 분들이 앞장서 멀티, 국폭, 욕설, 타국 도청하는 사례도 보았고, 비상식적인 언행, 이해할수 없는 요청, 남에게 상처를 입히는 언행들로 인하여, 람다식님, 앵벌스님, 시체왕님 등 운영과 개발을 해주시던 분들이 많이 지쳐나갔습니다.

어떤 유저분은, 개발에 기여하고 싶다고하셔서, 티엠서버 코드를 공개해드렸었죠. 하지만, 그분은 그것으로 코드 취약점을 분석하시곤, 멀티캐릭터에게 curl(원격 호출)로 자동로그인 - 턴입력을 하셨습니다.

아마 이런 맥락에서, 과거 삼모운영자분들도 모두 접었지 않았을까 싶네요.

4. 신서버의 개발

사실, 저는 처음부터 칠랑과 체섭에 신규 콘텐츠 개발 등을 할 생각이 적었습니다. perl, cgi 는 더이상 쓰지 않는 기술이고, 프레임워크를 사용하지 않는 php4 의 몇 만라인의 코드 역시, 유지보수가 어려웠습니다.

약간의 패치는 어떻게든 할 수 있겠지만, 장기적으로 보았을 때, 칠랑과 체섭을 계속 발전시키고 있었다면 지금쯤 저도 손을 놓거나 서버가 이미 사라져있을지도 모르겠네요

이런 이유들로, 저는 삼모전을 베이스부터 아예 새로만들기로 결심했었습니다. 18년 초중부터 최신 아키텍처, 구조도를 계속 설계했었고, 7월부터는 실제 코드작업까지 들어가게 됩니다.

핵심 원칙은 다음과 같습니다.

  • 유지보수가 쉬워야한다 = 사이드이펙트가 적다, 뭘 고쳐도 다른데서 버그가 나지 않는다
  • 테스트가 쉬워야한다 = 신규기능의 개발 용이
  • 고성능 = 돈이 없기 때문에, 매우 안좋은 서버에서도 원할히 돌아갈 정도로
  • 운영이 쉬워야한다 = 자동화된 모니터링

짬날때마다, 틈틈히 개발했는데, 1년정도가 지나니, 기반 시스템을 얼추 완성했었네요. 여기서 기반 시스템이란, 회원가입 - 권한 - 인증 - 게시판 - 댓글 - 프로필 - 어드민 - 인게임 채팅 - 모니터링 - 로그 등을 의미합니다. 삼모전 핵심 로직을 제외하고는 완성한 것이지요.

19년 중반부터 반년정도는 진짜 삼국지 로직 개발에 들어갔습니다. 겉으로 보기엔 다른 삼모전 시스템 가져다 쓴거아니야? 생각하실 순 있겠지만, 내부 구현은 완전히 다릅니다.

예를들어, 턴 처리 방식을 살펴보면, 다른 삼모전들은 turn1 ~ turn 24 를 DB나 파일시스템에 칼럼으로 운용하는데, 티엠섭은 Queue를 기반으로 처리합니다. 전자는 턴을 실행할 때, 입력한 턴이 없더라도 DEFAULT 값인 휴식 턴을 실행하면서 유저수에 비례하여 리소스가 소모됩니다. 과거 삭턴을 두었던 이유로 추정되고, 휴식을 실행했다고 로그에 뜨는 이유입니다. 하지만, 티엠서버는 턴을 입력해야만 Queue 에 턴이 들어가기때문에, 삭턴타고 있는 유저들에게 리소스를 전혀 소모하지 않습니다. 티엠섭이 휴식을 로그에 찍을 수 없는 이유기도 합니다.

게임 방식이나 컨셉에 대해선, 설계레벨부터 고민이 많았습니다. 저는 실시간 삼모를 만들고 싶었으나, 예상하시겠지만, 실시간 삼모를 만들면 라이트유저와 헤비유저 간 격차가 매우 심해질 수밖에없고, 심화될수록 5분장은 사실상 게임을 하실 수 없게됩니다. 저 역시, 5분장 유저 출신으로, 저같은 라이트유저까지 모두가 삼모를 할 수 있게하자 라는 결론에 이르게됩니다.

다만, 실접을 할수록 어느정도 소소하게 격차가 발생하는 방향으로 가고자했습니다.

이 과정에서, 기존 삼모처럼 일부 턴제 방식을 채택하게 되었습니다. 농,상,기,징,훈,출 등이 되겠네요 참고로 컨셉과 방향만 비슷한 것이지, 코드나 수식 등은 모두 다릅니다. 티엠서버는 java 라는 프로그래밍 언어로 완전히 새로 구현되었습니다. (java와 spring으로 구현한 삼모는 티엠밖에 없을 겁니다.)

플레이해보셔서 아시겠지만, 이것 외에는 모두 실시간입니다. 부대 자체를 없앴고, 실시간 이동, 송금, 특기, 장비, 무술대회, 임관, 하야 등 실시간 성을 대폭 강화했습니다.

기존 삼모에는 존재하지않던, 칭호, 인벤토리, 천무, 영웅장비, 각인 등의 콘텐츠들도 추가했었네요

5. 신서버의 운영

운영에 대한 부담을 처음부터 매우 줄였기때문에, slack bot의 자동화된 모니터링, Error 대시보드를 살펴보며 버그난 부분을 찾고, 어뷰징을 차단해갔습니다.

하지만, 유저들에게 받는 스트레스와 회의감은 더욱 심해졌습니다.

멀티잡는거야 이젠 감정소모도 크게 하지않고 할수있습니다.

저와 개인톡해보신 분은 알겠지만, 모든 요청에 대해 정중히 성실히 응답하는 편입니다.

어떤 유저분은 이걸 컨셉이라며 저를 의도적으로 긁어보겠다더군요

또 어떤 유저는 법을 운운하기도 했고, 쟤 한번 흔들어보자하는 분도 있었고,

어떤 유저는 말 뒤에 칼을 숨기며 대화를 하기도 했습니다.

덕분에 한번은 공황발작까지 일어나더군요.. 숨이 안쉬어질때, 비닐봉지를 앞에 두고 호흡하면 되는 것까지 배웠습니다

이외에는 제가 분명히 의도한 스펙이라고 몇번을 설명드렸어도, 이렇게하면 게임이 망한다느니, ㅈ망겜, 쓰레기겜 등 이야기하시는 분도 있었네요.

어쩌다보니, 이런 이야기까지 꺼내게되었지만. 게임이 재미없고 이해가 안되면 게임을 접어주시고 떠나주세요

불만, 욕설은 계속 토로하시면서, 이 게임을 계속 하시기에는 제 역량이 부족할 뿐더러, 다른 재밌는 게임이 많다고 생각합니다.

저도 여태, 여러분과 동일하게 게임을 하던 유저이기만 했습니다. 막상 게임을 운영해보니, 운영이 쉽지가 않습니다.

내가 운영하면 저렇게 안할텐데.. 하시는 분도 분명히 있으실 텐데요, 세상은 넓고 사람은 다양합니다. 관리자, 운영자로써의 게임은 분명히 다른 세계라는 점을 배웠습니다.

좋게본다면, 베타테스트인데도 몇몇분들의 기대가 크신 것이라고 생각됩니다. 더욱 열심히 개발하고 운영해보겠습니다.

6. 수용할 수 없는 의견이나 건의들

몇가지 사례들을 통해, 설명드리고자 합니다.

예를 들어, 출병자 입장에선 회피확률 - 설치자 입장에선 함정발동확률이 %와 맞지 않다는 이야기를 자주 보곤합니다.

독립사건 등의 이야기는 QnA 등에서도 많이해서 여기선 하지 않겠습니다.

A국와 B국이 전쟁을 할때, A국의 유저X는 난 왜 70%인데도 함정을 매턴 맞냐? 라는 이야기에 A국 비슷한 상황의 다른 유저들이 공감을 합니다. 중요한건, 잘 회피한 장수들은 이야기를 안합니다. 성공하는 사람들은 오히려 조용한 경향들이 있는 것같네요

유저X는 이거 이상하다면서, 단톡이나 갠톡으로 이야기를 합니다.

영웅장비의 봉인해제도 마찬가지입니다. 분명히 50%로 동작하고 있지만, 유저X는 이걸 확률이 이상하다그러고, 목소리를 내지않던 유저Y는 난 장비가 깨지는 지 처음알았다(=깨져본적이 없다)고 합니다.

확률난수로 유저분들이 스트레스받는 점은 이해합니다. 하지만 %가 0.00000115% 이런식으로 기괴한 것도 아니고, 충분히 높고 납득이 가는 %라고 생각됩니다. 또한, 피지컬 실력을 구현할 수 없는 텍스트웹게임에서 확률난수는 버릴수없는 필수요소입니다.

이런 류(=나만 실패해)의 건의는 왠만하면 받지 않습니다.

또한, 대안을 고민하지 않은 의견이나, 사실상 불가능한 것이나, 역지사지로 고민해보지 않는 의견들도 수용하기 어렵습니다.

예를들면, 3국구도에서 A-B국이 서로 전쟁해서 A국이 처절히 승리를 했지만, B국의 유저들이 C국으로 많이 임관해서 천통은 C국이 무난하게 하는 경우를 들어보겠습니다.

전쟁보상, 혜택을 A국에게 지급해야하지 않냐는 의견류입니다. (주로 여기까지만 의견을 냅니다)

방향과 심정은 이해하지만, 현실적으로 많은 어려움과 어뷰징 가능성이 농후합니다. 몇가지 예를 들어보죠.

처절한 전투였는지는 어떻게 판별할까요? 인원? 국력? 세수? 이걸 수치로 정량화하려면 많은 통계시스템을 구축해야합니다. 이렇게 정량화해서 22000 vs 21500 이니 비슷한 국가간의 전투였다. 초반에 판단하는 것뿐만 아니라, 시간단위로 계속 수치를 뽑고 정량화해야합니다.

선포시점에는 국력이 같을수있지만, 선포받고 10명하야할수도 있으니까요.

A국의 국력이 22000 이니, 비슷한 국력은 10% 내외라고 해보겠습니다.

B국 수뇌부는 A국에게 보상을 지급하기 너무싫어서, 국력을 의도적으로 19000으로 맞춰버립니다. 필요하지 않는 징병으로 주민을 일부로 감소 등 시나리오는 정말 많죠

시간단위 통계시스템도 구축이 어렵지만, 뭘 구축하더라도, 사람이 하는거다보니 그 기준을 회피할 수 있습니다. (극단적으로는 국폭 등)

전쟁한 턴 횟수도 마찬가지입니다. 2주를 싸우면 보상기준이라고 가정한다면, B국은 13일까진 오픈해버리거나, A국은 2주될때까지 일부러 안 밀면 어떻게할까요?





아 전력비교는 불가능하네. 그러면, 그냥 멸망만 시키면 보상주자. 도 문제가 있습니다.

위성국, 1인잠수국은 둘째치더라도, 제3국의 어떤 장수는 전쟁보상시점마다 하야해서 임관을 해서 보상을 알뜰히 챙기는 케이스가 있을 수 있죠.

보상의 수준을 조정하면 된다고 생각하실 수있지만, 상충관계에 있습니다. 위 행동의 동기유발이 안될정도로 보상이 약하다면, 전쟁보상의 의미가 사실상 없어집니다.



그럼 물질보상은 됬다. 그럼 멸망시킨 국가로 장수가 안오는 문제가 있는데, 장수를 시스템적으로 유입하게해달라

A-B국이 치열히 전쟁해서 A국이 승리했는데, B국 장수가 전부 C국 가면, 기운빠지는 심정 이해합니다.

하지만, 예를들어 포로시스템을 만든다고 가정해봅시다. 우리 모두는 사람이고, 삼모전 하루 이틀하는 사람들이 아닙니다.

포로가되면 N턴동안 A국 수뇌의 처사를 기다리며 재야소속에서 포로상태로 대기(=C국소속을 갖지못하게 강제함)한다고해서, 그 사람이 임관할 마음이 생길까요?

N턴동안 내정못하네하곤, 멸망 10분전에 하야하면 그만입니다. (이걸 또 하야를 멸망 N턴전에는 못하게 하느니.. 이런식으로 꼬리물어가면 시스템만 매우 복잡해집니다..)

랜임확률을 보정해주면 해결될까요? 3국구도에서 B국이 멸망해서, A국 - C국만 남았습니다. 확률은 50% - 50% 이죠. 근데 전쟁보상으로 A국 임관확률을 20% 올려주면, 70% - 30%가 됩니다.

C국 수뇌는 자동임관을 막아버립니다. 그러면 1개국밖에 남지않기때문에, 랜임은 시스템적으로 불가능해집니다. (2개국 이상 랜덤임관 가능할때, 랜임이 동작합니다.)

결국 의미가 없어지게 됩니다.



베타 8기동안 지켜본 바로는, 멸망의 원한이 있는 분도 계시지만. 그보다는 제3국의 정성스런 서신, 사전 약속으로 제3국으로 임관하시는 분도 많았고,

멸망시킨 국가도 나름대로의 어필을 통해, A국으로 임관하는 경우들도 있었습니다.

N장들이랑 하는 싱글게임이 아니라, 자유의지가 있는 멀티유저 게임입니다. 무력으로 전쟁을 적국을 정복하더라도, 그 과정이 통상적인 방식이 아니라, 뭔가 문제가 있었다면, 제3국으로 가는게 사람 심리일 것입니다. 이런 것들은 위에서 살펴보았듯이, 시스템으로 제한이 가능하지도 않고, 해봤자 회피할 방법이 무수히 많기때문에, 시스템만 복잡해지는 결과만 만듭니다. https://samtm.net/posts/88

유저입장에서 이런식으로 포괄적으로 고민해보고 의견을 내는게 힘든 점인 것은 당연히 알고있습니다. 다만, 건의해주시는 분은 이거 진짜 중요한건데 왜 안해줄까 생각을 많이 갖고 계신데, 제 입장에선 반복되는 질문이고, 수용할 수 없는 의견입니다.

이런 점들을 한번쯤은 검토해주시고 의견주시면 정말 감사하겠습니다.

cf) 신규 콘텐츠, 기능들을 패치할때도 이런 다방면의 검토를 걸쳐 개발됩니다. 예를들어 거래 기능은 아이템이나 장비의 ownerId 필드만 바꿔주면 되는 간단한게 아닙니다.
이런식으로 작업해서 출시하게되면, 국가 당 한 자루의 참사검과 적토마가 있으면, 모두가 돌려쓸 것 입니다.
이런것까지 고민해서 제시하는 의견은 모두에게 큰 도움이 될 것 입니다.

7. 베타테스트 이야기

글이 길어졌네요, 다음 글에서 마저 이야기하겠습니다.