zepinos
18k
2015-04-30 11:17:51
22
19311

웹 프로그래머들이어...모바일(캐주얼) 게임서버 프로그래머가 되어보자


이 글은 제가 부사수 교육 및 발표를 위해 만들 자료의 내용을 서술해둔 것이고, 0.0.1 의 초기 버전입니다. 좀 더 다듬어서 PPT 용으로 만들어서 써먹어야 하는 놈이니...내용에 대해서 태클이나 조언을 해주신다면 매우 고맙겠습니다. 그리고 혹시나 시간이 되셔서 무료로 매우 유려하게 PPT 나 키노트로 만들어주실 수 있는 분이 계시면, 이 자료에 항상 그 분의 이름을 크게 적어서 고마움을 표시해드리겠습니다(제가 예쁘게 꾸미는 걸 너무 못해요. T.T)





비슷한 점

빠른 개발 등을 위해 웹 기반 서버로 실제 서비스를 하고 있는 곳이 많다. (웹서비스 아니다. 그냥 웹이다)

클라이언트 개발자가 웹 언어를 금방 배워서(주로 php, 간혹 python 도 있다) 서버까지 커버하려고 한다. 소켓보다는 웹 규약이 더 쉽게 느껴지나보다.

데이터 저장을 위해서 전통적인 텍스트 파일 저장 방식에서 점점 rdbms 을 쓰는 쪽으로 변하고 있다.

어짜피 서버-클라이언트 통신 내용을 가로채는걸 암호화해서 막아야 할 수 있다는 점에서 웹의 HTTPS 통신은 동일한 기능을 제공해준다.

 

눈여겨 볼 점

소켓 방식보단 한 서버 당 받을 수 있는 동시접속자 수가 더 많다.

유저들간에 실시간 연동이 필요한 데이터가 없을 경우 큰 고민 없이 웹 서버만 늘리고 L4 에서 분배만 잘해주면 Clustering(Fail-Over, Road Balance)을 별로 신경쓸 필요가 없다.

HTTP 프로토콜은 표준화된 프로토콜이기 때문에 수많은 라이브러리를 공짜로 가져다 쓸 수도 있다. 이게 웹 서버에만 국한된 게 아니다. (왜 접속할 게임 클라이언트는 생각 안하는가?)

HTTP 프로토콜에는 압축 기능도 포함되어 있기 때문에 약간은 큰 데이터를 보내도(json 으로 보내도) 괜찮은 편이다. 이 또한 라이브러리 차원에서 지원을 해주면 개발자가 압축에 관한 프로그래밍을 생각하지 않아도 된다.

상당수의 스타트업 개발사는 서버 개발자를 구하지 못해서 클라이언트 개발자 중 하나가 총대를 메고 웹으로 서버를 개발하고 RDBMS 로 데이터를 저장한다.

 

한계

물론 대전 요소가 들어간다거나 실시간 피드백이 필요한 경우에는 웹 방식으론 안된다.

채팅 요소가 들어가면 여전히 문제다. 클라이언트가 주기적으로 채팅 갱신 내용이 있는지 서버에 요청하는 것도 문제는 있다.

TCP 자체로도 UDP 보다 느리다고 까이는데, TCP 기반에 프로토콜 헤더가 붙고 거기에 접속 때마다 연결을 맺고 끊어버리는게 비효율적이라고 까는 사람들 많다. PC 게임 시절부터 게임 서버를 개발한 사람들은 특히나...

대부분의 웹 개발용 언어들은 인터프리터이거나 Garbage Collection 을 가지고 있기 때문에 C/C++ 보다 느리다고 엄청 깐다. 당연히 서버는 C/C++ 이라고 주장하는 개발자들이 대다수라고 생각해도 무방하다.

 

그러나 개발속도의 이점, 확장의 용이성은 이런 한계를 어느 정도 덮어주고, 특히나 웹 프로그래머들에겐 매우 익숙한 RDBMS 사용 능력은 클라이언트 프로그래머들의 그것과는 완성도 면에서 큰 차이를 보여줄 때가 많다.

물론 RDBMS 도 속도가 빠른 것은 아니기 때문에 NoSQL 을 점차적으로 추가하는 곳이 많지만, 스타트업에서는 RDBMS 만으로도 괜찮은 성능을 보여주는 서버를 만들 수 있고, NoSQL 솔루션들도 그리 어렵진 않다.

 

 

웹 서버 프로그래밍과 게임 서버 프로그래밍에 있어서 가장 먼저 고려해야 할 것은 데이터의 성질이다.

웹은 주로 축적된 데이터를 조회해서 많은 사용자가 이것을 읽고 피드백을 하는 형태의 행위가 많다. 그래서 클러스터링을 하더라도 읽기 전용 RDBMS 을 두는 등의 형태(일반적인 RDBMS 의 클러스터링이 이렇게 구현된다)로 작업을 진행한다. 그리고 모든 응답은 HTML 로 이루어지기 때문에 프리젠테이션 레이어의 개발에 많은 신경을 쏟게 된다.

하지만 게임은 성격이 좀 다르다. 기본적인 데이터(흔히 게임 데이터라고 부른다)는 어떻게든 클라이언트가 항상 보관하고 있기 때문에 요청의 대부분은 사용자의 개인 정보(이것도 갱신되어야 할 때만 보내주면 된다) 조회나 갱신이 주 목적이다. 그래서 읽기에 특화된 것이 아닌 쓰기에 특화된 데이터 저장 방식이 필요하게 된다. 그래서 단순히 읽기 전용 서버를 늘려버리게 되면 변경되어야 할 정보를 각 읽기 서버에 갱신하는 동안 데이터 처리가 멈추는(트랜젝션까지 썼다면 끔찍하다) 일이 주기적으로 발생할 수도 있다. 그래서 단순한 Clustering 이 아닌 Sharding(샤딩, 데이터 분산)을 고려해야 한다. 샤딩은 특정 조건에 따라 데이터를 분산해서 저장하고 처리하기 때문에 사용자의 요청을 서버별로 분산해서 처리하여 부하를 직접적으로 분산하는 효과가 크다. 하지만, 서버 중 하나가 장애가 발생한다면 해당 서버의 정보를 모두 처리할 수 없기 때문에 이에 대한 장애처리가 자동적으로 이루어지는 솔루션을 이용하는 것이 좀 더 편하다. MySQL 도 최근에 MySQL Fabric 을 내놓고 이런 샤딩을 지원해주고 있으나 사용법이 좀 괴랄하고 아직은 구성상 한계가 있어서...NoSQL 쪽을 더 선호하는 편이긴 하다.


데이터 검증 부분도 그렇다.

웹에서 클라이언트가 작성한 문서는 그 자체로 저장만 되면 되기 때문에 서버 측에서는 전송된 데이터 중 비어있는 항목이 있는지, 길이가 부족하거나 넘치지 않는지 등을 주로 신경쓰면 된다.

하지만, 게임에서는 사용자가 보내주는 데이터를 전적으로 신뢰할 수 없다. 자신의 정보를 부풀려서 보내버리면 게임 자체의 밸런스를 무너뜨리기 때문에 웹의 전송 데이터와는 성질이 다르다. 그래서 데이터의 갱신과 관련된 작업에선 꼼꼼하게 데이터에 대한 검증 작업을 거쳐야 한다.

 

그럼 웹 개발자가 게임 서버 개발을 하려면 어떻게 구성하면 될까?

자바 기준으로 설명하겠다. 먼저 기존처럼 프로그래밍 하면 된다. WAS 두고 클라이언트에서 보내줄 정보를 GET/POST 로 받고 이걸 RDBMS 에 저장하거나 조회해서 클라이언트에게 다시 전송해주면 된다. 클라이언트들도 보통 HTTP Client 라이브러리가 기본으로 혹은 매우 저렴한 가격에 구입이 가능하므로(게임 개발에 돈이 엄청 들어가기에 몇 만원 하는 라이브러리 구입은 그냥 공짜라고 생각해도 무방하다) 그냥 클라이언트 개발자에게 몇 가지 예제만 보여주고 데이터 이렇게 보내라고만 말해주면 하루면 손발이 맞는다. 문제는 결과인데, 나의 경우 헤더에 content-type 을 application/json 으로 지정하고 JSON 형태로 값을 전송한다. 이게 가장 편하다. JSON 라이브러리는 거의 모든 언어에서 다양하게 제공되고 있고, Java 에서도 Jackson, Gson 등의 라이브러리가, C# 에서는 Json.NET, Simple JSON 같은 라이브러리가 많이 이용되고 있다. 항상 키가 같이 전송되기 때문에 응답결과가 전통적인 게임 서버의 구분자 혹은 길이 고정 방식보단 길어진다는 단점이 있으나, 요즘 통신회선의 발전과 서버/클라이언트 처리속도의 비약적인 향상, HTTP 압축 기능 때문에 느리다는 느낌은 거의 받지 않을 것이다.

 

이렇게 하면 의외로 쉽게 웹 프로그래머에서 게임서버 프로그래머로 전직(?)할 수 있을 것이다. 거기에 게임서버 프로그래머의 주 임무는 이런 통신 서버만 만드는게 아니라 이를 운영할 서버(클라우드 서버가 유행이다) 구축과 관리, 그리고 게임 운영자들이 고객의 문의에 따라 게임 내 데이터를 바꿔줄 운영툴(이것도 요즘은 대부분 웹으로 개발한다)을 만들어 주는 것이다. 이건 웹 개발자들은 대부분 하던 것들 아니던가??? 그렇다. 의외로 요즘 모바일 게임은 웹 개발자들이 파고들 여지가 많다.

 

다만, 가장 큰 걸림돌은 기존의 웹 개발 회사들과는 다른 게임개발 회사들의 독특한 문화에 익숙해져야 할 필요가 있고, 게임 개발 경력이 전무하다는데서 오는 의문을 어떻게 말빨(?)로 잘 풀어서 입사를 해서 경력을 쌓느냐일 것이다. 이건 개인의 몫으로 돌리는 수 밖에...

13
5
  • 댓글 22

  • zepinos
    18k
    2015-04-30 12:00:37
    그런데 제가 여기 칼럼에 글 적어도 되나요? 부적절하다면 옮겨주세요~
    1
  • kmjyarto
    1k
    2015-04-30 13:05:31
    잘보았습니다.
    0
  • 콩나무
    91
    2015-05-02 01:24:14
    부사수가 참 부럽습니다.
    0
  • kkak10
    285
    2015-05-03 02:10:01
    저도 zepinos님 같은 사수분만 있으시다면 밤새도록 공부할 수 있을것 같습니다 ㅠㅠ.....
    0
  • 크릉릉
    2k
    2015-05-04 09:38:22
    사수없이 독고다이로 10년째 ㅠㅜ 부럽...
    0
  • 믿음
    4k
    2015-05-11 18:34:14

    칼럼은 개발자 여러분들의 논지를 명확히 갖고 그것에 대해 글을 쓰는 공간입니다. 

    그렇다고 논리적인 글을 요구 하는 것이 아니고 말하시고자 하는 부분만 명확 하시면 됩니다.

    앞으로도 많은 글이 올라 왔으면 좋겠습니다.

    좋은 글 잘 읽었습니다  

    1
  • 고고
    130
    2015-05-11 19:51:19

    헛..제 경험담을 보는 듯 하네요.

    모 포털사에서 몇년간 웹 개발(서버 사이드쪽을 많이)을 하다가 변화를 주고 싶어하던차에 기회가되서 게임사로 옮긴지 1년쯤 됩니다.

    그동안 배운것도 많고 재미있었네요.

    말씀하신 게임쪽의 독특한 문화에 대해서 공감이 팍팍되네요^^

    나중에 기회되면 제 경험담도 올려 보겠습니다.


    p.s

    - 저는 rdb는 mysql mmm구성, nosql은 toku엔진의 몽고db(tokumx) 의 replica set 구성으로 fail over처리했습니다.

    - 폰으로 작성한거라 문맥 등이 이상한거는 양해를..

    0
  • zepinos
    18k
    2015-05-12 09:59:53
    고고 님 // 좋은 댓글 감사합니다. 경험담 공유 부탁드립니다. 저도 redis+mongo 조합도 고려했는데, 제 밑에서 couchbase 을 배우고 나간 직원이 요즘 이 조합으로 하는데...그냥 couchbase 계속 쓰라고 말리는 통에 이번 프로젝트도 couchbase 을 그냥 쓰고 있습니다. 물론 운영툴 관련 내용은 mysql 로...
    0
  • visualkhh
    3k
    2015-05-12 11:18:16
    잘읽었습니다.
    0
  • 준우아빠
    9
    2015-05-12 18:49:42
    멋진글 잘 읽었습니다.!
    0
  • 고고
    130
    2015-05-12 19:37:08

    mongo에 대해서만 우선 살짝 코멘트해드리자면...

    생각보다 몽고가 아직 크리티컬한 버그들이 좀 있더군요.

    커넥션풀을 사용하는데 일정 시간이 지나면 일부가 맛이가서 사용시 에러가 납니다.  commons pool 처럼 유효성 체크가 잘 안되더군요 

    그래서 최근 드라이버에서 지원하는 pool life time을 설정해야합니다.  이때 spring data는 아직 이 기능을 지원하지않어서 자바단에서 설정하셔야하고요.

    이후 ngrinder를 이용해서 tps확인해보니 제 서버 사양에서 2만정도 나오길래 서비스에 적용했습니다.

    그리고서 현재까지 잘 동작하고있습니다.


    참, 몽고쓰실때는 꼭 tokumx 쓰시는게 정신건강에 좋으실거에요 ㅡㅡ

    0
  • yowon009
    524
    2015-05-19 13:48:10
    멋진 사수시네요.
    0
  • christias
    2015-10-27 19:40:54

    멋진 글 감사합니다 ^^

    0
  • zepinos
    18k
    2015-12-21 16:24:33

    그냥 웹기술을 통해서 게임"서버" 를 만든 것일 뿐입니다.


    게임 클라이언트(일반적인 게임 만들기)와는 분명 다른 분야이고, 게임 클라이언트는 현재 C/C++ 혹은 C# 을 이용해서 다른 형태의 개발을 배워야 하는 부분입니다.


    오래된 글이라도 댓글을 달면 알림이 오기 때문에 바로 확인은 가능하구요.


    굳이 클라이언트를 해보고 싶으시다면, Unity 라는 게임 클라이언트 개발툴이 있습니다. 물론 게임 말고도 다른 걸 만들 수는 있지만...이 녀석이 입문용으로 추천할만 합니다. 게임 개발사에서(특히 모바일) 많이 이용하고 있기도 하구요. 책은 최신 버전인 5 버전에 맞게 나온 책이 2 권 있는데...그 중에 평이 좋은걸 사서 하시면 괜찮으리라 봅니다.


    0
  • kiss
    448
    2015-12-21 17:21:04

    아.. 댓글을 다셨군요.

    너무 오래된 글이기도 하고, 일면식도 없는데 괜한 부담감을 줄 질문이 아닌가 싶어서.. 

    댓글을 지웠었습니다. 메일을 쓸까 하다가 것두 아닌거 같아서... 쓰다가 들어와보니

    댓글을 남기셨네요. 저 같은 경우는 가끔 들어오니.. 알림이 와도 클릭해보고 끄는경우가

    대부분이라.. ^^

     

    클라쪽은 유니티5와 언리얼4가 대세인거 같더군요.

    그리고 서버쪽은 node.js 쪽과 noSql DB 조합을 눈여겨 보고있었습니다만..

    제피노스님은 전체적인 구성을 어떻게 하시는지 궁금했었구요.

    결정적으로 웹개발자가 게임을 만들려고 했을때 도움되는 서적이나 기타 사이트나

    머 그런게 있을까 싶어서 질문드린거였습니다.

     

    전체적인 파트구성을 짜놓고 구성에 대한 기술부분을 책이나 인터넷 자료로 배워가면서..

    만들어볼려고 했었거든요. 근데 생각해보니 답변이 단순한것도 아니고.. 

    길어질려면 한없이 길어질거 같아서.. 이건 아니구나 싶어서.. 내렸답니다.

     그럼 좋은하루되시구요 답변 감사드립니다..  

     

    0
  • kiss
    448
    2015-12-21 17:21:51
    아참 좋은 성탄절 되시길.. ^^

     

    0
  • zepinos
    18k
    2015-12-21 18:24:01

    새롭게 Q/A 에 올리시면 길어도 답변 가능합니다. ^^;;;


    간단하게, 지금까지 만든 서버 구성만 말씀드리면,


    Spring MVC with Restful / MariaDB with Galera Cluster

    Vert.x 2.5 NetServer(TCP) / Couchbase / Hazelcast

    Vert.x 3.0 HttpServer / Couchbase (퍼블리셔 시연까지만 사용)

    Vert.x 3.0 HttpServer / MySQL 5.6 (퍼블리셔 요청으로 재배발 도중 요구사항이 많아져서 엎음)

    Resteasy with Netty / MySQL 5.6 (현재 개발중)


    대충 이렇습니다.


    p.s 성탄절은 칩거를...-_-;;;

    0
  • 스마일로
    2
    2016-02-12 11:13:41

    안녕하세요. 오래된 글이긴 하지만 혹시나 싶어 질문남겨봅니다.

    현재 Unity와 node.js이용해서 간단한 모바일 게임을 만들고 있는데 unity가 게임에 관련된 로직을 가지고 있습니다. 이 때 정보를 다 믿을 수 없으니 검증작업을 해야하는데 어떤식으로 해야할지 찾아보다가 이곳에 오게 되었습니다.

    게임에서는 사용자가 보내주는 데이터를 전적으로 신뢰할 수 없다. 자신의 정보를 부풀려서 보내버리면 게임 자체의 밸런스를 무너뜨리기 때문에 웹의 전송 데이터와는 성질이 다르다. 그래서 데이터의 갱신과 관련된 작업에선 꼼꼼하게 데이터에 대한 검증 작업을 거쳐야 한다.

    라고 하셨는데 검증 작업은 어떤식으로 하는 건가요?

    0
  • zepinos
    18k
    2016-02-12 13:31:37

    스마일로 님. 제가 오늘 외부라 휴대폰만 사용이 가능하네요. zepinos 골뱅이 네이트 닷 컴으로 연락주세요.

    0
  • donghaeng
    103
    2018-04-15 02:22:54

    좋은 글 감사합니다^^

    0
  • okkyqkreltms
    59
    2018-06-16 23:47:41

    글 잘 읽었습니다!

    0
  • ksj1931
    2
    2018-11-22 13:13:39

    좋은 글 감사합니다 : )

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.