EP.01 — 프롤로그: 20년 만에 열어본 코드
이 글은 『서버 개발 수기』 시리즈의 첫 번째 글이다.
2006년산 MMORPG 서버 코드를 2026년에 Linux로 포팅하는 과정을 기록한다.
그 시절 이야기
SI로 시작한 나의 개발 커리어, 항상 아쉬웠던 게 있었다.
빵빵한 서버 사양을 가지고 겨우 저걸 돌리고 있나?
PC 스펙은 해마다 올라가는데 실제 리소스의 10%도 안 쓰고 있군.
그래서 생각했다. 어떤 분야가 컴퓨팅 파워를 한계까지 몰아서 쓸까? 게임이었다.
그런데 게임업계로 넘어가는 건 그렇게 쉬운 일이 아니었다. 워낙 좁은 바닥이기도 했고, SI랑은 완전히 다른 분야니까. SI 출신은 안 받는 거지. 어찌저찌 얇은 동아줄 잡고 간신히 건너왔다. 서버팀에 배치받았고, 받은 지시는 "길드워를 만드시오".
그런데 손에 열린 서버 소스 코드가 문제였다.
XIOSpinLock, XIOBuffer, XIOAutoVar... 이름부터 위압감이 있었다. 스핀락 안에 while 루프가 3개였고, 버퍼 풀에는 슬롯이라는 게 16개나 달려 있었다. 참조 카운팅 함수는 AddRef만 7종류.
SI에서 하던 거랑은 차원이 달랐다. 내가 아는 서버는 요청 받고, 처리하고, 응답하는 거였다. 그런데 이 코드는 수만 명이 동시에 때려서 전쟁을 벌이는 세계를 버티는 코드였다.
그때 내 생각: "이걸 이해하는 날이 올까?"
오지 않았다. 그냥 돌아가니까 돌아가는 코드였고, 나는 그 위에서 길드워 로직만 짜면 됐다. 서버 프레임워크는 "그냥 쓰는 것"이었다.
그런데 길드워 모듈 개발이 차일피일 미뤄졌다. 어디다 뭘 어떻게 박아야 되는지 알 수 없으니 당연했던 일. 그래도 아무도 나한테 뭐라고 안 했다. 우리팀 팀장도 그랬고… 어찌저찌 테스트까지는 했는데 — 6개월쯤 됐을까. 대표님이 급하게 들어오시더니 회사를 접어야겠다고 그러시더라. 헐 대박! 나만 모르고 다 알고 있었던거야???
그렇게 문을 닫았다.
기를 쓰고 건너온 게임업계였는데, 6개월 만에 끝나버렸다. 그리고 그 서버 코드는 내 하드디스크 어딘가에 쳐박혔다.
"갖다 쓸 수 있으면 가져다 써"
대표님은 특이한 분이었다.
그 시절 게임업계는 소스 코드에 대한 폐쇄성이 대단했다. SVN 권한은 철저히 통제됐고, 회사 밖으로 소스를 갖고 나가는 건 불가능했다. 소스 코드는 곧 회사의 자산이자 비밀이었다. 그런데 우리 회사는 그냥 접근 권한도 열어주고 마음대로 보게해줬다. 놀라웠다.
그런 시대에 대표님은 이랬다.
"소스? 갖다 쓸 수 있으면 가져다 써."
…뭐지? 진짜로?
국내 탑 MMOPRG 서버를 만든 사람이다. 그 코드를 기반으로 이 서버를 만들었다. 본인이 직접 만든 코드를 "가져다 쓰라"고 하는 거다.
당시에는 그게 얼마나 파격적인 태도인지 몰랐다. 이건 뭐 오픈 소스 정신도 아니고 그냥 내 새끼들이 가져다 쓴다 그러면 걍 갖고가~! 정신이랄까?
20년 후, 다시 열다
2026년. Claude랑 바이브 코딩을 열심히 하다가 생각이 난 잊혀진 외장하드.
바로 발굴.
혹시나 하는 마음에 뒤적여보니 그때 그 소스가 조용히 잠자고 있었다. 그때는 누구한테 물어보기도 어려웠고, 무섭기도 했고, 모르는 게 쪽팔리기도 했는데 이제는 든든한 Claude가 있으니 분석도 시키고 설명도 해달라고 할꺼다. 그리고 윈도우 서버 보다는 리눅스에서 돌리는게 좋을 듯 하니 포팅(Porting)도 해야지.
Windows IOCP 기반으로 돌아가던 서버를 Linux io_uring으로 포팅할꺼다. 단순히 컴파일만 되게 하는 게 아니라, 제대로 동작하게.
그러려면 이 코드를 이해해야 한다. 20년 전에 포기했던 그 작업을.
다시 열어봤다.
열어봤더니
여전히 모르겠다.

스핀락? 3단계? 버퍼 풀에 슬롯이 16개나 있는 이유는? send()를 직접 안 부르고 버퍼에 모아서 보내는 건 뭐 때문에? AddRef가 7종류인 건 또 뭐야?
20년 전이랑 똑같다. 코드를 봐도 왜 이렇게 만들었는지는 안 보인다.
그런데 Claude한테 물어보니까 보이기 시작한다.
이 코드는 수만 명이 동시에 접속해서 전쟁을 벌이고, 거래를 하고, 채팅을 치는 MMORPG에서 — 단일 서버가 버티기 위한 모든 기술이 다 들어있는 코드였다.
SI 시절 꿈꾸던 "컴퓨팅 파워를 한계까지 쓰는 코드". 내 눈앞에 있었는데, 20년 동안 몰랐다.
이 시리즈에서 할 이야기
이 시리즈는 두 가지를 다룬다.
하나는 해독. Claude와 같이 20년 전 코드에 담긴 기법들을 하나씩 읽어나간다. "이게 뭐야?"에서 시작해서, 왜 필요했는지, 당시 기준으로 얼마나 대단한 건지, 현대에는 어떤 대안이 있는지까지. 모르는 걸 알아가는 과정 그대로를 기록한다.
다른 하나는 변환. 이 코드를 Windows IOCP에서 Linux io_uring으로 옮기는 실제 포팅 과정을 기록한다. 삽질, 시행착오, 그리고 "아 이래서 이렇게 만든 거구나" 하는 깨달음의 순간들까지.
코드 원문은 공개하지 않는다. 설계 기법의 분석과 포팅 경험만 다룬다.
다음 회에서는
본격적으로 코드를 들여다보기 전에, 먼저 이 서버의 전체 구조를 살펴본다. 3계층으로 나뉜 아키텍처와, 각 계층이 담당하는 역할.
20년 전 설계인데, 그냥 솜솜 뜯어보는 것 만으로도 너무 재미있다. 클로드에게 계속 묻는다.
‘이건 뭐야? 저건 뭐야? 이건 왜 이렇게 한거야? 요즘엔 어떻게 해?’
무작정 게임판에 들어가는게 소원이던 아가리 코더가 과거의 유산에 쌓인 먼지를 털어내고 자신의 과거를 돌이켜보는 회고록 쯤으로 읽어주면 좋겠다.
→ EP.02: 전체 아키텍처 — 3계층 구조와 설계 철학