게임서버프로그래머가 되는 길

2005/11/05 05:26

* 이 포스트는  담긴 내용은 잘못되고 오해된 부분이 있을수도 있습니다.

  그리고 본인 스스로도  능력있는  프로그래머라고 생각하지 않습니다.

  다만 조금이나마 도움이 될지도 모르는 분들을 위해서 포스트를 작성합니다. 

 

 가끔씩 서버 프로그래머가 되기 위해서 무엇을 공부해야 하는지에 대해서 메일을
 보내는 분들이 있다. 그런 메일을 받을때마다 답장을 하기가 조심스러운게 사실이다.
 내가 무엇을 공부했다고 얘기를 해도 실제로 내가 그것을 모두 이해하고 있다고
 생각이 들지 않거니와 답변 받은 분들은 그것을 모두 공부해서 이해해야 한다고 오해를
 할수도 있기 때문이다.
 
 예를 들면, 어느날 길을 가고 있는데 어느 노인께서
 "총각.. 내가 길을 헤메고 있는데 XX예식장이 어디인가?"
 라고 물어보는 상황이라고 하자.
 그런데 XX예식장을 어디선가 본 적은 있는데  정확한 방향이 이쪽인지 반대쪽인지
 헷갈린다. 그럼 나는 잘 모른다고 말해야 하나? 아님 얼추 내가 짐작가는 곳으로
 답변을 드려야 하나? 속마음은 친절하게 답변을 해주고 싶은데 말이다.
 이는 실제로 내가 여러번 겪은 일이고 막상 노인께 답변을 드리고 돌아오는 길에
 노인께 알려드린 방향과 반대쪽에서 XX예식장을 찾았을때는 나때문에 헤메고 계실 노인분
 께 죄송한 마음이 든다.
 
 암튼 무엇을 공부해야 합니까라고 물어오는 메일을 받을때 내가 겪는 심정이다.
 하지만 자주 이런 메일을 받는것을 보니 차라리 포스트로 아는대까지만 적어보고
 틀린점이 있으면 수정을 하면 그나마 정보를 원하는 분들에게 조금이나마 도움이
 될 것이라는 생각을 가지고 시작을 해 볼까 한다.
 
 
 처음으로 게임 서버 프로그래머로 입문하고자 하는 분들에게 먼저 알리고 싶은것은
 
 게임 서버 프로그래머로써의 입문은 
         사전 기본 공부(20%) + 프로젝트개발(30%) + 오픈후 서비스(50%)로

 이루어 진다고 말하고 싶다.
 
 
 그렇다면 각 단계별에 대해서 설명을 해자.
 
 
 1. 사전 공부는 무엇을 해야하나?
 
    짧고 명확하게 말해서 네트워크와 데이타베이스 기본 지식이다.
   
   
    네트워크 기본 지식
    
    TCP : TCP 개념/작동원리/함수사용법/모듈화해봄
    UDP : UDP 개념/작동원리/함수사용법/모듈화해봄
    IOCP: 서버 네트워크 라이브러리
   
   
    네트워크 공부는 바이블로 통하는 몇개의 서적만을 통해서 실습을 해보면
    된다. 그런후 자신이 두고두고 쓸 안정적인 모듈화만 만들어 놓으면 좋다.
   
    보통 네트워크 모듈은 한번만 작성하면 크게 건드리지 않는다.
    때에 따라서는 남이 잘 만들어 놓은 모듈을 써도 상관없다.
    중요한 것은 네트워크 통신이 어떤식으로 작동하는지 명확하게만 이해하면
    된다.
   
    예) 가끔 다른 프로그래머가 묻는다.
        "우리 게임에서 클라이언트가 패킷을 보내는데 그게 거꾸로 오는것 같아요.."
        라고 물어올때 서버 프로그래머가 답변을 머뭇거린다면 그것은 문제가 있다.
       
        TCP라면 절대 그럴수 없고, UDP라면 가능성이 있다.라고 명확히 이해하고
        있어야 한다.(왜 그런지는 굳이 설명하지 않겠음)
   
   
    데이타베이스 기본 지식
   
    Oracle/MS-SQL/MySQL등과 같은 데이타베이스를 모두 공부해야할까?
   
    우선 초기에는 하나를 선택해서 공부하는것이 좋다.
    SQL에 대해서 경험이 쌓이면 다른 데이타베이스도 기본 SQL원리는 비슷함을
    깨닫게 된다.
   
    우선 쉽게 구할수 있는 MySQL로 데이타베이스 생성,테이블 설계,쿼리해보기
    등을 연습해보면 된다.MSSQL의 경우 실제 게임 개발에 많이 쓰이므로 MSSQL만을
    우선 공부해보는것도 좋다.
   
   
    처음에는 쉽게 배울수 있는 책을 1-2권정도 사서 따라해보면 기본은 금방 배운다.
    설치해보기, DB만들기, 테이블 설계하기 , 쿼리(질의,삽입,삭제)정도만 알아도
    된다.
   
   
    여기까지 공부를 했다면 우선 남들이 말하는 채팅서버정도는 만들 수 있을것이다.
    문제는 이제 막 20%정도를 배운것이라고 하면 된다.
   
   
    중요한 점은 이정도 실력으로 게임 서버 프로그래머로 입사를 하거나 프로젝트를
    진행할 수 있냐는 의문이 들 것이다. 그건 나도 모르겠다. 기회가 생기면 가능할
    수도 있다. 
   
    서버 프로그래밍을 할 수 있어도 서버 프로그래머라고는 할 수없는 정도랄까?
 
 
 
  2 프로젝트개발 단계
 
   실제적으로 공부를 많이 해야 하는 시점이 왔다. 회사에 입사해 서버 프로그램을 짜던
   스터디 프로젝트던 중요한 것은 뭔가 처음부터 끝까지 제대로 완성된 것을 만든다는
   것이 중요하다.
  
   
   공부하게 되는 것들!
          "모든 것을 공부해야 할 것이다!"
         
   
   무엇을 공부해야하나?(순서에 상관없음)
  
   1.디자인 패턴과 같은 언어적 스킬 공부
   2.쓰레드&공유데이타관리& Windows 작동 원리
   3.STL과 같은 자료 구조 & 알고리즘
   4.ODBC/OLE DB같은 게임서버와 데이타베이스 통신 방법
   5.OS지식
   6.프레임웍/아키텍쳐공부
   7.데이타베이스 중급 지식
   8.기타등등(암호화 방식/인터넷 프로토콜/XML)
 
  
   실제로 게임 개발에서 중요한 것은
  
          "게임 서버는 혼자 만드는 것이 아니고 팀이 만드는 것이다"
         
   이에 대한 설명은 뒤에 하겠다.
  
   1. 디자인 패턴 언어적 스킬
  
   서버 프로그램을 혼자서 작성할 수도 있고, 두 세명이 공동 작업을 할 수도 있다.
   대규모 게임의 경우 두세명은 기본이고 캐주얼 게임의 경우 혼자하는 경우도 있다.
  
   즉 누군가와 같이 코딩을 해서 완성을 해야 한다면 좀 더 세련된 방식과 수정이
   편리한 코드 작성이 필요하다.(사실 이부분은 상당히 애매한 부분이기도 하다)
  
   2. 쓰레드&공유데이타관리& Windows 작동 원리
  
   서버 프로그램에서 쓰레드를 쓸 경우가 많다. 쓰레드는 한번만 이해하면 쓰는데
   지장이 없다. 대신 공부할때 WINDOWS APPLICATION의 작동 원리를 자세히 설명한
   서적을 한번쯤 읽어보길 권한다.
  
   예) 쓰레드를 쓸때 beginthreadex와 CreateThread의 차이점은? 왜 beginthreadex
       를 쓰라고 권고하는가?
      
       Sleep()를 사용할때 인자로 0을 줘서 CPU를 최대한으로 사용하는걸 선호하는
       프로그래머가 있고, 1-10중에 하나를 줘서 어느정도 CPU 사용률을 적정하게
       유지하는 것을 선호하는 프로그래머가 있다.
      
       Mutex와 Critical_Section중 어느것이 더 부하를 주나? 그리고 각각이
       LOCK거는 작동원리와 단계는 어떠한가?
      
       쓰레드를 최대한 많이 사용하는걸 선호하는 경우가 있고 , ContextSwitch에
       대한 부하때문에 적정갯수를 선호하는 경우가 있다.
      
 
  예를든것 중에서 어느 것이 옳다라고 말할 순 없다. 제일 중요한 것은
  서버 프로그래밍이 정상적으로 작동하면 되는것이다.
  다만 어설프게 알고 쓰다가 갑자기 문제가 생겼을때 문제가 커진다.
  제대로 이해하고 있다면 문제가 발생해도 해결 능력이 생긴다.
  
  
   3.STL과 같은 자료 구조 & 알고리즘
  
   게임 서버에 유저 정보는 어떤식으로 관리할것인가? 검색은 어떤식으로?
   게임방 리스트는 어떤식으로 관리?
  
   가장 게임 서버에서 많이 다루는 것이 데이타 관리이다.
  
   Vector/List/Map/Queue 기본적인 자료 구조를 직접 코딩해서 쓸것인가?
   아님 STLPORT와 같이 이미 검증된 라이브러리를 쓸 것인가?
  
   어떤이는 직접 만들어 쓰는 것을 선호하고?
   어떤이는 STL을 쓰는 것을 선호하고?
   때에 따라서 혼합해서 쓰는 사람도 있다.
  
   어느쪽이 좋다고 할 순 없다.
   VECTOR하나만으로도 모든 것을 할 수 있다.
  
   다만 기본 알고리즘 공부도 하고 STLPORT가 제공하는 여러가지 함수들과 자료구조
   를 알고 있다면 실제 도움이 많이 된다.
  
  
   4.ODBC/OLE DB같은 게임서버와 데이타베이스 통신 방법
  
    게임서버와 디비서버의 연동은 필수다.
   
    가끔
        "ODBC보다 OLE DB가 더 빠르다고 하는데 OLE DB를 써야하나요?"
    라고 묻는 이가 있다.
    
    나는 둘중에 자기가 편한 걸 쓰면 된다고 말한다.
    ODBC로 작성한 모듈로도 충분한데 구지 ODE DB를 써야할 필요가 있을까?
   
    어쩔수 없이 속도를 조금이라도 올려야 할 때 더 빠르다고 말하는 OLEDB방식을
    고려해 볼 수도 있지만 ODBC로도 충분한 경우도 많다.
   
   
   5.OS지식
  
     서버 OS에 대한 지식은 사실 이때 공부해도 된다. 그럼 서버 프로그래머가
     알아야할 OS지식은 어떤걸 말하는 걸까?
    
     예)
     내가 만드는 서버는 서버당 몇 클라이언트를 감당할 것인가? 메모리는
     얼마나 필요한가? CPU는 어느정도면 될까?
    
     데이타베이스를 설치할것인데 어느정도 사양의 OS가 필요한가?
    
     서버가 이상하다. 프로그램 문제는 아닌것 같고 무엇이 문제이지? OS자체 문제인가?
     어딜 봐야하지?
    
     IIS를 설치해야하는데 뭘 설정하고 어떻게 작동시킬까?
    
     네트워크 카드는 몇개를 달아야할까? 내부용?외부용 두개면 될까?
    
     불필요한 서비스는 내리자. 어디에서 설정하지?
    
     하드는 스카시하드가 꼭 필요한가?
    
     RAID구성은 어떻게 하지?
    
    
     OS지식은 꼭 모두 알아야 할 필요는 없고 개발하면서 필요할때마다 자연스럽게
     공부하게 된다. 만약 테스트 버젼을 만드는데 프로그램상에 문제는 없는것 같은데
     통신이 안된다면 어떻게 해야할까? 이벤트 뷰어의 존재를 안다면 우선 그곳을 보게
     될 것이다. 가끔 랜카드가 고장나서 통신이 안되는데 코드만 열심히 드려다 보면
     해결이 될까? 적어도 OS에 관련한 서적은 항상 곁에 두고 틈틈히 보면 좋다.
    
    
   6.프레임웍/아키텍쳐공부
    
     게임서버 + 로그인 서버 + 디비 서버 + 기타 등등은 어떤식으로 연결/작동할 것인가?
    
     게임 서버를 개발하다가 중간중간에 코드를 뒤집거나 새로운 서버가 등장하거나
     아예 아키텍쳐를 재 설계하는 경우도 생긴다.
    
     이에 대한 공부는 평소 다른 사람들의 소스를 눈여겨 보거나, 인터넷에 질문을 올려
     다른 이의 의견도 들어본다. 서버 관련 서적도 많이 보는것도 좋다.
     책을 많이 보고 장단점을 따져보는 습관을 들이면 된다. 
    
     무엇이 가장 옳다고는 할 수 없다. 게임 서버는 우선 안정적으로 작동되는 것이
     최고다.
    
     예) 나의 경우 디비쿼리와 서버 프로세스 상에서 동기화/비동기화 프레임웍에
     대해서 고민하다가 개발 도중에 하프라이프2 소스를 보고 힌트를 얻어서
     프레임워크를 바꿨다. 남의 것을 보고 따라해보는 과정에서 다른 프레임웍에 대한
     아이디어도 생긴다.
    
    
    7.데이타베이스 중급 지식
   
     이제 중급 데이타베이스 지식이 필요한 시점이 왔다.
     게임 시스템에서 필요한 정보를 저정하는 것은 기초적인 지식만으로도 가능하지만
     복잡한 게임 기획에 따른 데이터 관리 방식이 복잡해 짐에 따라
     쿼리도 복잡해지고 쿼리양도 많아 지게 된다. 초반에 예상한 테이블의 필드들은
     무수히 길어지고 생각보다 쿼리속도도 떨어지게 된다.
     여기서 만약 오픈을 했을때 수많은 유저의 정보까지 쌓이게 된다면?????
    
     우선 StringQuery를 스토어 프로시져로 바꾸자. 복잡한 Join쿼리도 공부하자.
     속도 개선을 위해서 디비 튜닝 방법은 무엇이 있을까? 클러스터/넌클러스터에
     대한 개념을 확고히 알자. 하루에 자동으로 랭킹을 산출해 내야 하는데 그럼
     JOB을 걸어줘야하는데 어떻게 하는걸까? 백업 방식은 어떤식으로 할까?
    
     이때부터는 SQL에 대한 두꺼운 책을 두고 필요한 것들을 공부하자.
     데이타베이스의 작동 원리및 복잡한 쿼리에 대한 책도 보게 될 것이다.
    
     * 때론 회사에 DB를 담당하는 DBA가 따로 있을 수도 있다. 하지만
      게임 서버프로그래머가 DB에 대해서 많이 알면 알수도 모두가 편해진다.
      보통 DBA분들은 게임 서버 프로세스에 대해서 잘 모를 경우가 있다.
      공동 작업을 하면서 의견이 다를수도 있을때 상황 설명및 올바른 선택을
      위해서 많이 알수록 문제 해결이 잘 된다.
     
      
   
    8.기타등등(암호화 방식/인터넷 프로토콜/XML)
   
     패킷은 어떤식으로 암호화할까? 어떤 어떤 암호화 모듈이 있으며 어떤게
     빠르고 안전한지 공부를 하게 될 것이다. 직접 만들어도 써도 되고, 알려진
     모듈을 써도 된다.
    
     업데이트 프로그램을 만들것인데? HTTP를 이용할 것인가? FTP를 이용할 것인가?
     각 프로토콜의 장단점은?
    
     업데이트 파일 관리 방식은?
     버젼 업데이트는?
     게임 서버에서 사용하는 자료는 XML로 관리할것인가?
    
     잡다만 많은 것들을 공부하게 될 것이다.
    
    
     여기까지가 클로우즈베타를 하기까지의 여정이라고 보면 된다.
     한 30%정도를 배웠다.
     보통 1-2년 정도 개발기간이 소요되니까. 충분히 많은 것을 공부하게 된다.
     실제로 필요하기때문에 공부한것이기 때문에 더 기억에 남게 된다.
    
     그래서 여기까지오면 게임 서버 프로그래머로써 50%를 공부했다고 보면 된다.
   
   
   
  3. 오픈후 서비스 ( 50%는 뭘 의미할까? )
    
 
    클로우즈 베타이던 오픈 베타이건 세상에 서비스가 시작되면서 정말로
    많은 것을 공부하고 배우게 된다. 정말로 게임 서버 프로그래머가 되는 과정이다.
    이는 상용화까지 해보게 되면 정말 책에서는 배울수 없는 노하우가 많이 생기게 된다.
   
   
   
    어떤것들을 배우게 될까? 두서없이 나열해 보겠다.
   
   
    1.어느날 갑자기 데이타베이스에 문제가 생겼다. 
     
      갑자기 로그인이 느려지고 데이타베이스 CPU는 100% 넘나든다.
      아무것도 건드린 것이 없는데 어쩔까?
      이책 저책을 살펴본다. DBA가 있으면 상의도 해보지만 뚜렷한 원인을 모르게
      된다.
      유저들은 게시판에 난리를 친다. 돌아버릴것 같다.
      결국 긴급 점검에 들어간다.
      DB를 유심히 본다. 그리고 혹시나 하는 마음에 뭔가를 건드려본다.
      헉... 설마가 사람을 잡았다.
     
      이런식으로 디비가 문제가 생겼을때 원인에 대한 골머리를 썩다가보면
      디비에 대한 문제 발생시 의심해 볼만한 리스트 목록이 쌓이게 되고
      왠만한 문제 해결 능력이 생긴다.
     
    2. 서비스 중에 아무 이유없이 부하가 생기거나 서버가 죽는다.
   
      코드를 열심히 드려다 봐도 문제점을 찾을수 없다.로그 파일에도 이상은
      없었다. 몰까? 몰까?
      결국 네트워크 카드가 이상이 생긴것이었다. 하드웨어가 문제 발생할때
      이벤트 뷰어를 자동 검색해서 문제 발생시 즉각 통보해주는 프로그램을
      만들게 되었다.
     
     
    3. 서비스를 하게 됨에 따라서 GM들이 사용하게 될 툴이 필요하다.
   
      가끔 서버가 죽으면 GM들이 서버를 재 시작해달라고 요청한다.
      새벽에 서버가 죽으면 즉각 알아채지도 못하고 10분이 지나버린다.
     
      결국 SMS자동 알림 시스템으로 문자 메세지를 통해서 서버에 이상이
      있을때 관계자들에게 통보해주는 프로그램을 만들었다.
     
      서버가 죽으면 자동으로 서버를 재가동시킬수 있는 툴을 만들어서
      GM들에게 제공한다.
     
      정말 서비스에 필요한 많은 툴과 기능이 필요함을 알게된다.
      툴을 APP로 만들까 WEB으로 만들까? 이렇게 만들어봤다가 저렇게도 만들어
      보게 되고 로컬라이징에 따라서 어느쪽이 업데이트가 좋은지 깨닿게 된다.
     
    4. 효율적인 로그 시스템
   
      로그량이 엄청나게 불어났다. 로그 디비에 로그를 기록하는데도 엄청난
      하드가 필요하다. 그리고 유저 항의에 따른 로그검색도 제공해야 하는데
      400GB짜리하드가 등장한다. 로그는 수억 ROW를 넘어 선다.
     
      GM들에게 보다 편리하고 빠른 검색이 가능하기 위해서 DB에 대한 공부를
      많이하게 된다 하드웨어적인 측면도 배우게 되고 대용량 데이터 삽입
      데이터베이스 튜닝, 테이블 정리 방법도 배우게 된다.
     
      데이타베이스 백업 방법도 여러가지 방법을 알게 되고 장단점을 알게 된다.
      여러가지 검색 방법과 EM/쿼리분석기를 이용한 진단방법에 대한 노하우가
      생긴다.
     
   
  
    그리고도 너무 많은 것들을 만들어 보게 되고, 얘기치 못한 상황들로 인해서
    스트레스를 받게 되고 몇칠만에 해결 방법을 알게 되고.. 이렇게 1년이상
    서비스를 하다보면 많은것을 배운다.
   
   
    그리고 깨닫는다. 게임 서버 프로그래머가 네트워크 함수 좀 안다고 끝이 아니구나.
    그러나 걱정할 필요는 없다. 이는 어짜피 만들다보면서 배우게 되는 것이니,
    열심히 하다보면 당신도 프로젝트 하나 완성하고 조금씩 성장하게 될 것이다.
   
   
   
 
  *알아두면 도움이 될만한 이것저것 정보
 
   1. 마이크로 소프트웨어 정기 구독
  
    서버 프로그래머는 많은것을 알면 알수록 좋다. 마이크로 소프트웨어 잡지는
    정기구독을 하면서 보면 많은 도움이 된다. 본인도 2년동안 정기구독중.
   
    2.리눅스/유닉스도 공부해야 되나요?
   
    하고 싶으면 하세요. 해두면 좋죠. 그러나 리눅스/유닉스 모른다고 서버프로그래머
    안되는것은 아닙니다. 오히려 많은 게임서버가 MS계열을 사용합니다.
   
    문제는 리눅스/유닉스로 개발하는 회사에 입사하기는 힘들것이다.
    리눅스/유닉스로 개발하고나서 당사자가 없어졌을때 리눅스/유닉스 인력을 확보하지
    않으면 어떻게 될까요?
   
    유지비용이 싸사 어쩌다는 이유로 리눅스를 선택하는 회사도 있습니다.
    하지만 인력과 사후 관리적인 측면에서도 문제가 있을수 있고..
   
    암튼 필수 항목은 아닌것 같네요. 물론 이것저것 알면 좋습니다.
   
    참고로 업데이트 서버나 웹서버는 리눅스처럼 저렴하고 성능좋은 OS를 쓰는게
    좋죠.
   
    3. 게임 서버는 혼자 만드는것이 아닙니다.
   
    클라이언트 프로그램와 늘 상의하고 같은 서버 파트 분들과 같이 논의하고
    협동해서 만드는 것입니다. DBA가 있으면 같이 상의해야 하구요.
    니가 맞다.내가 맞다.싸우지말고 같이 협동으로 일을 진행시켜야 합니다.
    저도 버그때문에 고생할때 같이 밤샘하면서 도와주는 팀원들이 없었다면
    지금 어떻게 되었을지도 몰릅니다.
   
    4. 책을 많이 보세요.
   
    게임 서버나 네트워크 관련 서적은 많이 보면 볼수록 좋습니다.
    아무리 남들이 허접하다고  하는 책에도 조금씩 도움이 되는 정보가 언제나 있습니다.
    꾸준히 디비 책도 보시구요. 그냥 책을 많이 보면 도움이 많이 됩니다.
   
    5.모르면 모른다고 하고 주위에 물어보세요.
   
    모르면 모른다고 하는 것도 용기이자 능력입니다. 힘들면 팀원들한테 부탁하세요.
    같이 좀 해결해보자고. 절대 부끄러운것이 아닙니다.
   
   
    6.게임 서버는 안죽는게 장땡입니다.
   
     코드가 초라해보인다고 기죽지 마세요. 어렵사리 디자인 패턴이나 리팩토리에
     연연해 하지마세요. 싱글톤 않쓰고 STATIC 전역변수쓴다고 쪽팔려 하지마세요.
     함수 한번 덜 호출하는 대신에 빠른 성능을 내는 static이 서운해 합니다.
    
    7. 확실히 아는게 아니면 사용하지 마세요.
   
     어설프게 아는 지식을 사용하면 나중에 문제 생기면 해결책을 찾기가 힘듭니다.
     서버 죽으면 사장님이 달려옵니다.
    
    8. 많은 경험을 쌓을수 있는 곳에 참여하세요.
   
     가끔 MS에서 여는 데이타베이스 무료 강연장에도 한번 가보세요.
     온라인 무료 강연도 가끔있습니다.
     GDC 컨퍼런스도 돈은 좀 들지만 한번쯤 가보세요. 거기가서 세계적인 개발자들을
     보고 그들의 얘기를 들어보면 의지도 생기고 많은것을 느끼고 배우게 됩니다.
    
    9. 마지막으로 자기 적성에 맞는지 깊게 한번쯤 생각해보세요.
   
     이거 중요한 것 같습니다. 힘들거나 지칠때 적성에 맞지 않으면 더 힘들어 집니다.

     자기가 하고 싶은 일을 하세요.
     
     
    * 가끔 현업에 있는 다른 회사의 얘기를 들어보면 서버 프로그래머들 사이에서

       서로 모듈을 라이브러리를 만들어서 라이브러리만 공유하고 소스는 안 보여준다거나,

       서버 소스는 못 보게 한다고 하는 회사도 있다고 하고, 

       질문에 대한 답변에도 인색하다고 

 


Posted by 몽센트