내부 개발툴 자동 업데이트 기능 구현하기

게임 개발이란 굉장히 소모적인 작업이다. 일단 게임 어플리케이션을 만들어야 하고, 또 그 위에 컨텐츠까지 생산해내야 하기 때문이다.

일반적인 응용 어플리케이션 개발은 프로그램을 만들어서 사용자들이 컨텐츠를 생산해내는데 도움을 주는 것이 목적인 반면, 게임과 같은 엔터테인먼트 관련 개발은 프로그램은 물론 컨텐츠 생산까지 개발자가 다 하고 사용자는 오로지 그것들을 소비하기만 하기 때문이다.1

게임을 만드는 일에서 프로그래머가 해야 하는 일은 크게 두가지로 분류할 수 있다.

우선 첫번째로 외부 고객, 즉 유저들을 상대로 하는 부분들을 제작하는 일이다. 보통 바깥에서 보면 개발의 전부라고 생각할 수 있는 부분이다. 예를 들면 프로그램의 UI 작성, 내부 로직 작성 등이다.

그리고 앞서 이야기했던 게임 제작의 특성상 두번째 일이 추가된다. 즉, 내부의 고객(기획파트와 그 외 파트들)을 상대로 하는 부분들을 만드는 일이다. 예를 들면 새 캐릭터를 추가하는 캐릭터 에디터, 맵을 만드는 맵 에디터, 퀘스트를 작성하는 퀘스트 에디터, 몬스터를 추가하는 몹 에디터 등이 있을 것이다.

이러한 내부 고객용 프로그램의 경우 비 프로그래머가 사용하는 프로그램이긴 하지만, 굉장히 특정한 소수의 사람들만 사용하기 때문에 불특정 다수가 사용하는 게임처럼 자동 업데이트를 공들여 만드는 것은 약간 비효율적이다. 하지만 그렇다고 매 변경시마다 바이너리를 수동으로 배포하는 방식은 문제가 많다.

  1. 소스 변경시 개발자가 빌드해서 새 바이너리를 만든다.
  2. 이 바이너리를 사용자들이 접근할 수 있는 공간에 업로드 한다.
  3. 바이너리가 변경되었음을 사용자들에게 알린다.
  4. 사용자들은 새 바이너리가 릴리즈 된 것을 확인하고 다시 다운로드를 한다.

보다시피 이런 일련의 과정은 자동화가 되어 있지 않아서 위 과정 중 한 군데에서만 문제가 발생해도 제대로 작동하지 않는다. 그리고 바이너리의 버전 관리가 되지 않으므로 문제가 발생하면 원인을 파악하기 어렵다.

원활하고 신속한 게임 개발을 위해서는 내부툴들의 자동 업데이트 기능이 필수적이다. 하지만 앞서 이야기했듯이 이 자동 업데이트 기능은 게임 어플리케이션의 그것과는 달리 특정 소수의 인원만 사용하므로 게임 패처처럼 잘 만들 필요는 없다.

따라서 이 포스트의 초점은 쓸만한 자동 업데이트 기능을 간단하게 구현하는 것에 있다.

자동 업데이트 구현

이 방법의 핵심은 기존에 사용중인 SCM 을 활용하는 것이다.

이 포스트에서는 Subversion 을 사용한다.

우선 내부툴들의 바이너리를 올릴 소스 리파지터리 내의 디렉토리를 선택한다. 이왕이면 툴 소스를 컴파일 시 Release 버전 바이너리가 생성되는 디렉토리가 좋다. 그러면 개발자가 소스 변경 후 릴리즈 버전으로 빌드하면 파일 변경을 SVN 이 자동으로 감지하기 때문이다. 따라서 소스를 커밋할 때 바이너리도 잊지 않고 커밋하게 해준다.

위와 같은 폴더 구조를 만들고 proj/bin/tool 폴더는 기획 파트원들도 접근할 수 있게 권한을 주도록 한다. 섭버전의 경우 Path-Based Authorization 이 가능하기 때문에 소스 디렉토리는 보호할 수 있다.

그리고 아래와 같은 배치파일을 proj/bin/tool 폴더에 만들어 주도록 한다.

update.bat

@echo off
TortoiseProc /command:update /path:"%~dp0" /closeonend:1
start %~n1

그리고 아래와 같은 내용으로 각 툴들과 같은 이름의 배치파일들을 생성해 준다. 파일 이름만 다르고 내용들은 전부 동일하다.

map_editor.bat, quest_editor.bat, …

@echo off
call update.bat %0

그러면 아래와 같은 파일 구성이 된다.

map_editor.bat 와 quest_editor.bat 는 둘 다 동일한 내용의 배치 파일이다. 그리고 새 툴이 추가되면 기존의 *_editor.bat 를 복사해서 파일 이름만 새 툴 이름으로 변경해주면 된다.

그리고 위 파일들을 전부 섭버전에 커밋한다.

위 과정이 다 끝나면 툴을 사용하는 모든 사용자들의 컴퓨터에 TortoiseSVN 을 설치하고 proj/bin/tool 경로를 체크아웃 한다.

그리고 앞으로는 맵 에디터를 실행할 때, map_editor.exe 를 실행하지 말고 map_editor.bat 를 실행해서 툴을 실행하도록 한다. 쉽게는 툴 바로가기를 map_editor.bat 로 바꾸면 된다.

그러면 모든 과정이 끝나게 된다.

앞으로 변경된 바이너리를 프로그래머가 섭버전에 커밋하게 되면 그 이후에 툴을 map_editor.bat 등으로 실행하는 사용자들은 자동으로 TortoiseSVN 을 실행해서 바이너리를 업데이트 하고 나서 실행하게 된다.

따라서 앞으로 툴 수정시 개발자가 할 일은

  1. 소스 변경시 빌드를 해서 소스와 바이너리를 같이 커밋한다.

로 한가지 단계로 줄어들게 된다.

우리 개발툴이 달라졌어요!

적용해보시고 개선해야 할 점이나 피드백이 있으시면 리플 달아주시면 감사하겠습니다. :)

Bookmark and Share

  1. 그래서 현실 세계에서는 UCC 나 MOD 같은 개념들이 등장하고 있다. []
Creative Commons License
This work, unless otherwise expressly stated, is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.0 Korea License.

관련된 포스트들

Tags: , ,

  1. rein’s avatar

    소스 변경시 빌드를 해서 소스와 바이너리를 같이 커밋한다. <<- 이건 그냥 빌드서버가 빌드해서 deploy할 수 있는 형태로 만드는게 나아뵘;
    특히나 SVN이 바이너리 파일 다루는 속도는 좀 악몽;

    Reply

  2. J.Strane’s avatar

    rein// 우선 이 글의 초점은 파일 몇개를 커밋하는 수준으로 자동 업데이트 기능을 구현하는 것입니다. 구현이 더 복잡해진다면 그 노력에 비해 효용이 크지 않다고 판단했습니다.

    그리고 제 경험을 덧붙인다면 툴의 경우 파일 개수가 적고 크기도 10MB 이하인 경우가 대부분이라서 SVN 이라도 속도는 크게 문제가 되지 않았습니다. 더구나 라이브 모드라면 툴의 변경 빈도도 적습니다.

    크기가 기가바이트 단위인 테스트 클라이언트는 말씀하신대로 빌드 서버에서 빌드 후 P2P 프로토콜을 사용하여 deploy 합니다. :)

    Reply

  3. J.Strane’s avatar

    오천원// 태연에 집중하기는 … ㅎㅎ

    Reply