늘모자란, 개발 :: 싴갤러스에 대한 소고(小考)

늘모자란, 개발

시작하며

싴갤러스가 햇수로 올해로 10년, 그간 싴갤러스를 되돌아보고 정리한적은 없는것 같아요. 이깟게 뭔지.. 하는 생각이지만, 오랜세월 함께 해왔는데 한번은 정리의 시간이 필요하지 않나해서 글을 작성하게 되었습니다.
기술적인 얘기도 좀 적을거라 글이 재미없고 길어질것 같은데, 소고(小考)가 아닌, 아주아주길어질것만 같은 기분이 듭니다.

배경 - 늘모봇

정확히 2008년, 늘모봇이라는 hanirc 내에서 서비스를 시작하면서 일은 시작되었습니다.
07년부터 오게임이라는 게임의 정보 스크립트를 제작하고 있었는데, 많은 이들에게 더 다양한 서비스를 제공할 수 있으면 어떨까? 하는 생각에 탄생한 늘모봇 서비스.
퀴즈라는 컨텐츠로 큰 성공을 거뒀고, 이런말을 스스로 하긴 부끄럽지만 irc를 대표하는 봇 중 하나였다고 생각합니다.




늘모봇은 mIRC라는 윈도우 기반 IRC 클라이언의 자체 언어인 msl(mirc-script language)로 제작되었습니다.
사실 이 클라이언트를 이용해 봇을 제작하는 사람은 아무도 없습니다. 왜냐면, 윈도우 기반의 프로그램이기때문에 더미 메모리가 너무 많고, 시스템 구조가 불편하기 때문입니다. 또한, 한개의 IP에서는 2개까지밖에 접속할 수 없다는 제약이 존재하기때문에 배포할때도 일일히 실행해야 된다는 점도 한몫합니다. (실제로, 늘모봇'만' 돌리기 위해 8대의 VM을 사용했습니다. 자원낭비, 과대포장 갑...)

헌데 왜 이런 봇을 만들었느냐? 당시엔 할줄아는게 너무 없었기때문입니다. C를 하긴했는데 소켓은 모르고, 소켓을 하자니 통신도 모르고..
다 생각안하고 그냥 덤벼들자니 IRC에 존재하는 raw event들을 일일히 처리하기가 더 귀찮았습니다. 그래서, 이미 다 구현되어 있는 mIRC로 부딪혀 봤던 것 같습니다. mIRC로 할수있는걸론 거의 극한까지 했다고 생각합니다. 혼자한건 아니고, 유카리코라는 친구와 함께 구현했습니다. 봇 버전관리까지 전부 싹다 msl로 짰었는데 어우...

너무 서론이 길어지고 있는데, 여튼 퀴즈라는 컨텐츠를 만들때, msl의 기본 I/O 단위인 ini를 사용해 사용자 랭킹을 구현했습니다.
그러자 두가지 이슈가 발생했습니다.

1. 봇 클라이언트들이 자체(로컬) ini를 사용하니, 랭킹 및 문제 동기화가 되지 않는다.
2. 트랜잭션 개념이 존재하지 않으니, 랭킹을 읽거나 동시에 새로 쓰는 상황이 오면 파일이 크래시가 나며 모두 사라진다.
3. 모든 봇이 동기화된 랭킹을 사용하면서 안정화를 꾀할순 없을까?

그래서 어떻게 했느냐? 우선 무작정 도움을 요청했습니다.
ac18rt 라는 분이 처음에는 perl 을 이용한 cgi스크립트로 처리하게 해주셨었습니다. 그래서 봇들의 랭킹 동기화가 이루어졌습니다
하지만, 웹에 올렸더라도 결국 txt기반으로 랭킹을 기록하다보니 I/O에 의해 랭킹이 다 날아가는 이슈가 반복되었습니다.

결국은, penguin이 PHP-MYSQL을 이용한 웹 + DB연동을 진행하게 되었고, 제가 유지보수를 담당하게 되면서 웹을 공부하게 되었습니다.
당연히 트랜잭션같은게 없는 msl에서 하던 고민을 웹에서 구현하면 고려하지도 않아도 되서 안정성이나 기술 난이도나 웹쪽으로 점점 무게가 실리게 되었죠. (대신 무료 호스팅에서 얻을 수 있는 무료트래픽이 부족해 여러번 이사를 가야만 했다는... 건 가슴 깊숙히 묻어둡시다)
결과적으로 봇의 후반엔 거의 대부분의 기능을 웹으로 포팅하게 됩니다

배경 - 마비노기

늘모봇을 제작하면서 웹을 깨작이고 있던 와중에, 거짓말 같이 게임을 같이 했던 길드원들이 접은걸 펴고 한날 한시에 모이게 됩니다.
길드원들은 마비노기의 레이드라는 컨텐츠에 매우 주력하고 있었고, 성애가 시간표를 만드는 일을 담당하고 있었습니다. (류트한정!)
첨) 쿠쿠타이머라는 웹페이지에서는 하프만 지원하고 있었고, 임시점검등의 시간지연에 제대로 대응하지 못하는 이슈가 있었기때문에 일일히 수동으로 시간 계산 노가다를 하고 있었습니다

당시 저는 웹을 배우고 있었고, 길드원인 성애에게 건의했습니다.
가장 빠른 시간내 출현하는 레이드를 볼 수 있고, 레이드 몹 별로 필터링을 해서 볼 수 있으면 좋겠다는 아이디어를 제시했죠.
그리고 성애가 ok함으로서 2011년 7월, 어느 여름날 싴갤러스 프로젝트가 시작 되었습니다. 결국 소수인원을 위해 시작한...


왜 싴갤러스였느냐? 시크서버는 오래된 얘기긴한데..
제가 마비노기 갤러리(마갤)의 고정닉으로 활동하고 있었기 때문입니다.(현재도 고정닉 늘모는 제가 맞습니다)

레이아웃을 보시면 알겠지만 조악 그 자체입니다. 레이아웃은 정말 말할 필요도 없고, 투데이는 게임어바웃 의존도 100%.
자게는 아마 제로보드였던것 같고, 그나마 다음 서버상태에 좀 공을 들였습니다.

이땐 정말.. 보정이고 뭐고 서버에서 오는 반응 그대로 표시했기때문에 신용자체가 없었습니다.
그래도 언젠가는, 레이드를 자동화할 수 있지 않을까 하는 마음에 이것저것 알아보고 열심히 했었죠.. (웹 지식은 정말 제로에 가까웠습니다)
하지만 메뉴들을 보시면 지금 유저분들이 많이들 사용하시는 주요기능들은 하나도 없죠. 

첨1) 당시 레이드 계산은 공식이 있었기 때문에 정확한 서버 계산이 필요시 되었습니다.
첨2) 처음에는 사이트 대부분 길드원들과 유틸리티란의 언패킹 유틸리티를 공유하는데 쓰였습니다. (뭐가 있을지 궁금해하던 분들이 있었을지도..)

시간이 흐르며

가닥을 잡고 앞으로 나아가고 있던 와중에 마비노기 타임즈 TIP란에 글이 하나 올라왔습니다. 로컬로 뿔피리를 저장할 수 있다는 프로그램이었는데, 신기해하며 사용해보고 있는 와중에 이건 도대체 어떻게 하는걸까란 생각에 공부를 시작했고, 아주 간단히 흉내를 내서 csv형태로 저장하게 만들 수 있었습니다. 해당 파일을 msl을 이용해 csv를 서버에 업로드함과 동시에, csv파일을 지우도록 로컬을 구성하고, 서버에서는 오픈소스를 이용해 csv를 파싱후 DB에 저장하도록 했습니다. 

이 작업을 실시간으로 할 수 없었기 때문에, 10분의 텀을 두고 처리하도록 했습니다. 기억하실진 모르겠지만 갱신 10분텀은 이 때문에 발생했었습니다. 그러다가 패킷에 대한 지식이 많이 없던 저는 밥도 안먹고(--) 이틀동안 패킷공부를 하여 지금 시스템의 근간이 되는 프로그램을 만들 수 있었습니다. (이 과정에서  뿔피리가 실시간이 되었습니다. 현재는 더 많이 개선되었습니다.)


여전히 조악하죠? 이름도 tRader였는데 당시엔 ~러 어투가 유행이어서 일부러 뿔피리러라고 붙였는데 인기가 있어서 이름은 유지했던 것 같습니다. 익숙한 이름도 제법 있군요. 공부한걸 응용해서 던배른 와쳐를 만들고, 이때부터 생긴걸 의식해서 레이아웃을 바꾸고 그랬습니다. 다른 기능은 제공하지 않는 타갤러스도 이때 부터였습니다.(이때쯤엔 룬다,골렘, 모리안 서버도 서비스했습니다. 아래는 타갤러스 화면)




요거는 모바일 싴갤러스입니다. 주소도 다르게 뒤에 /m/ 으로 했는데 그땐 그게 대세였죠



레이드도 이때쯤엔 공부한걸 기반으로 완벽히 시간 계산을 하기 시작했습니다. 위 이미지는 싴갤러스 v3 때인데 이 레이아웃을 쓰기 시작한 시점부터는 더 이상 성애의 시간표는 필요 없을정도로 계산을 자동화 하는데까지 성공했습니다. 되도않는 웹표준이라고 마크도 붙여놨군요.
그리고 이제 따로 올리진 않겠지만 수야의꽃을 꼬드겨 블로그에서 개선된 지염도서관을 만들었고, 특별조나 음벞시뮬 같은 큰 기능들을 넣어가며 공부를 하고 동시에 저 스스로도 성장하는 계기가 된 것 같습니다. 가끔은 신기능이 되게 느린데 이것저것 꼼꼼히 검토하느라 그렇습니다.. (게으름 필때가 더 많습니다마는..)

서버 구조

싴갤러스의 시작은 PHP-MYSQL 구조로 시작되었습니다. 웹 구조는 현재도 비슷하고요. 당시엔 코딩 능력도 많이 부족했기때문에 배치 작업들도 전부 PHP로 만들었습니다. cron을 이용해서 php를 실행하게 .. 심지언 php 커맨드를 쓰는게 아니라 wget으로 호출시켰습니다.. 이후 배치 작업은 쉘파일이나, python 과 같은 언어로 대체되었습니다. (서버체커의 경우 아주 대대적인 성능개선을 수행했습니다. 티는 안나지만...)
모바일 푸시나 웹푸시를 담당하는 nodejs 서버가 두개있고, 별개의 다른 로직을 처리하기 위한 3개의 docker 컨테이너가 있습니다.

맨땅으로 시작을 했던거라 DB 최적화나 구조등에 대해 고려하지 않고 만들었기때문에 성능이슈가 빈번했고, 성능뿐 아니라 안정성에도 많은 장애가 있었습니다. 이를 해소하기 위해서 mysql 은 이중화 (replication) 되었고, 전체 db 형상들은 docker 컨테이너로 관리하고 있습니다. 적고보니 컨테이너가 꽤 많네요. 그외에도 c 및 c# 같은 언어들도 많이 사용되었습니다. 처음에 비하면 꽤 많이 복잡해졌습니다. 사이트 덩치가 커지면 커질 수록 처음보는 장애들을 마주했고 커널패닉이 떠서 자료가 전소되기 직전의 위기도 있었습니다.

호스팅을 받아서 쫓겨나기도 하고 이리저리 옮겨다닌 날도 있었으나 지금은 2대의 물리 서버에서 동작하고 있습니다. IDC도 다름.. (출세함)

여러가지 시도를 했습니다.

페이스북을 운영하기도 했고, 옐로우 아이디(카카오톡 + 채널), 트위터, 문의채널, 무엇이든 말해요 등등 여러 유저분들의 소리를 듣고자 했는데 사실 잘 되진 않았습니다. SNS 운영은 아무나 하는게 아닌것 같아요. 아직도 활성화되지 못했고 ... 기술적으로 궁금한걸 많이 해본것 같습니다. 요즘은 잘 안하지만 당시에 핫했던 Logstash - MYSQL bridge를 통핸 Elastic Search 를 연동까지 거의 다하고 취소했던 기억같은...  데이터 메세지들을 처리하기 위한 kafka 검토등... 등등......

앱을 만들었던것도 도전 중 하나였습니다. 당시에 앱은 내고 싶었는데 처음부터 만들기에는 너무 삽질을 하게 될거같아서 (API를 따고 연동하고 하는게...) 웹을 그대로 보여주는 하이브리드 앱으로 만들기로 결정하고 보여지는 부분을 많이 다듬었습니다. 그리고 약간의 토큰 작업들을 하고.. 이때 친절한주인, Jake가 많이 고생했습니다.

브라우니라는 거래 게시판도 만들고 있었는데, 앱이 꼭 필요하다 생각해서 작업을 했었으나.. 여가부에서 성인이 아닌사람들의 사이트 제한을 해야 된다고 답변 받아서 접었던 기억이 납니다. 외압아닌 외압에 이제... 접게된 최초의 사례인데 이건 글로 남겨놨습니다.. 여가부 남자직원이 아덴으로 설명을 해주시더군요.. (현거래가 아니어도 제재 대상..) 

관련글:
싴갤러스 가판대(브라우니) - 리뉴얼에 대해 고민하다
싴갤러스 - 하나의 기능 리뉴얼을 준비하며 (1)
싴갤러스 - 하나의 기능 리뉴얼을 준비하며 (2)

받은 질문 모음

Q. 게임도 안하는사람이 굳이 고생해서 좆망겜 관련사이트 운영하는 이유가 뭐임?
A. 게임은 2011년에 싴갤러스를 하면서 접었습니다. 우선 염려되었던게 좆목에 휘말릴까봐도 있었고 다행히도 당시에 게임에 대한 애정이 많이 식은 상태였습니다. 아본과 세공이 막 나오던 시절이었는데 세공에 투자할 재력도 없었고, 실제로 현실에서 많이 바빴습니다. 그래서 게임을 정리했던건데 결과적으론 접어서 다행인거 같습니다.

운영을 계속하는 이유는 보람이 젤 크지 않을까 합니다. 우리가 설계하고 기획한 기능들 (거의 대부분 유저분들의 자료를 긁어모으지만)이 잘 쓰이는걸 보면 기분이 좋습니다. 뭐 그게 다 인거같아요.

Q. 사이트 원리가 뭐에요
A. 네트워크 공부를 하시면 누구나 쉽게 할만한 기술들입니다. 마비엔 초고수들이 아주 많으나 그냥 다들 하기 귀찮아서가 아닐까... 싶습니다.

Q. 개발 및 유지보수는 혼자하나요
A. 처음엔 그랬는데 지금은 도와주는 드자이너들도 있고, 앱같은경우는 개발은 직접하지 않았고 유지보수는 맡아서 하고 있습니다.

Q. 트럭시위때 사이트는 왜 닫은건가요
거상 팬 커뮤니티중에 '파란만장 거상' 이라는 카페가 있습니다. 이 카페는 공식사이트보다도 더 큰 영향력과 지분을 가지고 있는것으로 알고 있는데, 약 1주일간 운영에 시위의 의미로 카페를 닫은적이 있습니다. 그 결과로 게임사에서 운영개선을 약속했던것으로 알고 있습니다.
마비노기는 유저층이 모두가 꼭 전투나 생활을 할 필요가 없어서 이해 관계가 나뉜다고 생각합니다. 따라서 관심없는 유저들은 세태를 끝까지 모르게 될것이라고 생각했고, 상황을 알리고 정리하는 지면의 역할을 해야겠다고 생각했습니다.

Q. 광고 수입은 얼마쯤 되나요
A. 서버 비용을 제한 광고 수입은 월 10만원 정도입니다.
도메인 결제가 겹치게 된다면 한 5만원정도로 잡는게 맞지 않을까요? 현재는 애플에 서비스하고 있지 않아서 이정도이고, 애플 결제를 진행하면 한 3만원대..의 수입이 있지 싶습니다. 그래도 치킨한마리는 먹는거 같네요.

아시다시피, 싴갤러스는 중간 컨텐츠에는 광고를 삽입하고 있지 않습니다.  총 광고는 4개이나, 화면이 1920 사이즈로 풀 확대되었을때 양쪽 세로에 두개가 출력되고, 그게 아니면 페이지의 가장 상단 및 하단에 출력되는 구조입니다. (특히 하단은 사이트가 스크롤이 많기때문에 거의 출력안되는거 같습니다)

그래서 밥벌이는 세로로광고로 거의 하는거 같고, 본문의 광고로는 수입이 거의 발생하지 않습니다. (생각보다 인터넷 창을 다 키워놓고 하는 분들이 많아서 놀랬습니다) 

Q. 기억에 남는 썰이 있다면?
학교 다닐때 용돈을 받아서 생활했었는데, 당시에 서버비를 내고 나면 컵라면 두개를 살 수 있었습니다. 주말동안 컵라면 두개로 살아야했는데 다 먹어버리면 끼니 해결이 안되니까 ㅋㅋㅋ 컵라면을 반반씩 쪼개서 먹었던 기억이 있습니다. 불쌍하다고 후원해주셔서 해당일엔 치킨 먹었습니다. 아직도 호르헤님 닉이 안잊혀지네요...

두번째로는 훈련소 들어가있는데 인터넷 편지로 서버 터졌다고 관리자중에 한명이 에러 메세지를 적어서 보내줬었습니다... 장황하게...
어떻게 고쳐야 최대한 빨리 고칠 수 있을까 원인은 뭘까 고민 및 시뮬레이션과 답답함에 미쳐버리는 시간을 보내게 해주었습니다. 고마워...

10년

10년이면 3650일인가요? 러닝타임이 그정도까진 되지 않을거 같습니다. 잠깐 닫은적도 있고.. 하지만 햇수로는 10년이 맞겠죠.
울고 웃고 많은 일들이 있었습니다. 여기까지 오기엔 혼자만의 힘으론 불가능했습니다. 도와준 관리자들에게 다시한번 감사의 인사를 드리고 또 사이트를 계속 사용해주시는 여러분들도 정말 고맙습니다.

사실은, 싴갤러스의 graceful shutdown 을 생각하고 있습니다.
마비노기 타임즈나 쫀득쫀득 인챈트와 같이 이미 10주년을 넘긴 사이트들앞에서 주름잡는게 조금 민망합니다.

커뮤니티들이 떠오르고 지고를 많이 반복했습니다만 그 끝은 사이트를 접은게 아니라 접힌쪽에 가까웠습니다.
접히는게 아니라, 사이트를 내손으로 접을 수 있다면, 또 내가 이 사이트를 평생 운영할 계획이 아니라면 10년이 되는 시점에서 커튼을 내리는것도 아름답지 않을까? 하는 생각을 했습니다. 그보다 적절한 시점이 없지 않을까 생각했어요.

그래서 디데이 옆 아이콘도 전원버튼을 달아놨는데요. (응원을 바라고 쓰는글이 아닙니다. 그냥 생각했던 내용입니다) 남은 시간동안 계속 생각해볼것 같은데 아마 계속 운영하지 싶습니다. 아마도...

지난 10년간 싴갤러스를 이용해주셔서 감사했고, 앞으로도 감사드리겠습니다!!
2021/04/07 10:30 2021/04/07 10:30