2. 프로젝트 생성하고 빌드하기

이 장에서는 hello world 프로젝트를 만들고 빌드하고 실행해 보도록 하겠습니다.

참고

여기서는 터미널에서 리눅스 커맨드라인을 사용하는 것을 기준으로 설명하겠습니다.

다른 개발 환경을 설정하는 방법에 대해서는 아이펀 엔진이 지원하는 개발 환경 을 참고해주세요.

또한 파일 목록을 구조화해서 표현하기 위해 기본 내장되지 않는 tree 명령을 사용했습니다.

여러분은 ls 명령을 사용해서 파일 목록을 확인하시거나, $ sudo apt install tree 명령으로 설치해서 사용하실 수 있습니다.

2.1. 프로젝트 생성하기

먼저, 새 프로젝트를 만들어 보겠습니다.

프로젝트를 생성하고자 하는 디렉터리 경로에서 다음 명령어를 실행해 주세요.

$ funapi_initiator hello_world

위 명령을 실행해 보면 현재 디렉터리에 hello_world-source 라는 디렉터리가 생성됩니다. 이 디렉터리가 프로젝트 소스 디렉터리이며 아래와 같은 구조로 이루어집니다.

hello_world 디렉터리 안에 프로젝트를 생성했습니다.

$ tree hello_world -L 2
hello_world
└── hello_world-source
    ├── client_data
    ├── CMakeLists.txt
    ├── etc
    ├── game_data
    ├── LICENSE
    ├── misc_data
    ├── README
    ├── setup_build_environment -> /usr/bin/funapi_setup_build_environment
    ├── src
    └── VERSION

만일 GIT 이나 SVN 과 같은 버전 관리 시스템(SCM) 을 사용하실거라면 위에서 생성한 XXX-source 디렉터리를 저장소에 넣으시면 됩니다.

이후 빌드 과정에서 생성되는 XXX-build 디렉터리는 넣지 마시기 바랍니다.

2.2. 빌드 환경 준비하기

여러 개발자가 함께 공동 작업을 할 경우에 소스코드 디렉터리로부터 각자의 개발 환경을 구축할 필요가 있습니다.

이 챕터에서는 소스코드 디렉터리로부터 리눅스 쉘과 Make 툴을 사용하는 개발환경을 생성해 보겠습니다.

hello_world-source 디렉터리가 있는 경로에서 다음 명령을 실행합니다. 본 튜토리얼에서는 hello_world 디렉터리입니다.

$ hello_world-source/setup_build_environment --type=makefile

그러면 현재 디렉터리에 hello_world-build 라는 디렉터리가 추가로 만들어집니다. 그리고, 이 안에 debugrelease 라는 하위 디렉터리가 생성됩니다.

각각 Debug 타겟 또는 Release 타겟을 빌드하기 위한 디렉터리입니다.

$ tree -L 2 hello_world
hello_world
└── hello_world-build
    ├── debug
    └── release

참고

Release 빌드는 컴파일러의 -DNDEBUG 전처리 옵션이 설정되고, 성능 최적화 수준이 -O3 로 설정되어 빌드됩니다. 컴파일 옵션을 제외한 그 밖의 내용은 동일합니다.

중요

빌드 디렉터리를 SVN 이나 GIT 에 넣지 마세요. 빌드 결과물은 사용자마다 달라지기 때문에 같이 작업하는 다른 사람들에게는 불필요한 내용이며 빌드에 실패하는 원인이 될 수 있습니다.

2.3. 게임 서버 빌드하기

그럼, Debug 타겟으로 빌드를 해보겠습니다.

hello_world-build/debug 디렉터리로 이동해 make 명령을 입력합니다.

$ cd hell_world-build/debug
$ make

...

[100%] Building CXX object src/CMakeFiles/hello_world.dir/hello_world_server.cc.o
Linking CXX shared module libhello_world.so
[100%] Built target hello_world

자, 컴파일 과정의 메시지들이 출력되고 빌드가 성공했습니다.

빌드가 성공적으로 진행되면 빌드 디렉터리에 hello_world-local 파일과 hello_world-launcher 파일이 새로 생성됩니다.

$ tree -L 1 hello_world-build/debug/
hello_world-build/debug/
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── CPackConfig.cmake
├── CPack.DEBIAN
├── CPack.RPM
├── CPackSourceConfig.cmake
├── hello_world-launcher
├── hello_world-local
├── Makefile
├── manifests
├── resources
├── src
├── symbols
└── VERSION.ignoreme

2.4. 게임 서버 실행하기

앞서 빌드에 성공해서 나온 결과물을 가지고 서버를 띄워 보겠습니다.

앞서 확인 하신 것처럼 빌드에 성공하면 hello_world-local 스크립트와 hello_world-launcher 스크립트를 생성합니다.

XXX-local 파일은 빌드 결과물이 있는 디렉터리에서 바로 실행해 볼 수 있도록 환경이 설정돼 있기 때문에 개발 중간중간에 빠르게 서버를 실행시켜 볼 수 있습니다.

XXX-launcher 파일은 게임 서버를 패키징해서 설치하고, upstartsystemd 같은 서비스 관리자를 통해서 실행할 때 사용됩니다.

이렇게 두 개의 파일로 구분하는 이유는 서버 실행파일을 패키징하고 설치해서 실행할 때 참조하는 파일이나 로그 파일 등의 환경 설정들이 달리지기 때문입니다.

참고

패키징에 대한 자세한 내용은 게임 서버 패키징하기 에서 다시 설명하겠습니다.

저희는 개발 중이니 hello_world-local 을 실행해야겠죠?

$ ./hello_world-local

위 명령을 실행하면 서버가 기동하기 시작하고, 아래와 같은 메시지와 함께 서버가 동작합니다.

여러분이 만든 기본 프로젝트에서 사용하는 통신 프로토콜과 메시지 인코딩 설정은 다음과 같습니다.

  • 8012 포트 & TCP 프로토콜 & JSON 메시지 인코딩

  • 8018 포트 & HTTP 프로토콜 & JSON 메시지 인코딩

I0413 15:42:45.791488 21126 manifest_handler.cc:851] Initializing HelloWorldServer
I0413 15:42:45.791503 21126 hello_world_server.cc:25] Built using Engine version: 1.0.0gerrit-5189bionic
I0413 15:42:45.791541 21126 object.cc:1014] Checking database. You may see SQL error statements. Don't be alarmed.
I0413 15:42:45.791607 21126 object_model.cc:306] The object model fingerprint: ce8072cc8204030dbf1588eb7edddb6d
I0413 15:42:45.791620 21126 object.cc:1018] Finished database checking.
I0413 15:42:45.791630 21126 hello_world_server.cc:43] example_arg1: val1
I0413 15:42:45.791649 21126 hello_world_server.cc:46] example_arg2: 100
I0413 15:42:45.791659 21126 hello_world_server.cc:49] example_arg3: default_val
I0413 15:42:45.791738 21126 manifest_handler.cc:881] Starting Framework
I0413 15:42:45.791759 21126 manifest_handler.cc:881] Starting IoService
I0413 15:42:45.791782 21126 manifest_handler.cc:881] Starting ZookeeperClient
I0413 15:42:45.791800 21126 manifest_handler.cc:881] Starting RpcService
I0413 15:42:45.791810 21126 rpc_service.cc:1767] Started RPC 860a3817-0aa8-4f1f-0000-000000000000, 10.10.2.115:8015(single server mode)
I0413 15:42:45.791826 21126 rpc_service.cc:1771] RPC server handshaking completed: peer=860a3817-0aa8-4f1f-0000-000000000000(self)
I0413 15:42:45.791836 21126 manifest_handler.cc:881] Starting ObjectDirectoryService
I0413 15:42:45.791859 21126 manifest_handler.cc:881] Starting Object
I0413 15:42:45.792724 21126 manifest_handler.cc:881] Starting EventDispatcher
I0413 15:42:45.793350 21161 event_queue.cc:401] The event thread has been started.
I0413 15:42:45.793371 21158 event_queue.cc:401] The event thread has been started.
I0413 15:42:45.793359 21126 manifest_handler.cc:881] Starting ClientResourceService
I0413 15:42:45.793355 21159 event_queue.cc:401] The event thread has been started.
I0413 15:42:45.793401 21126 manifest_handler.cc:881] Starting AccountManager
I0413 15:42:45.793431 21126 manifest_handler.cc:881] Starting ApiService
I0413 15:42:45.793553 21126 manifest_handler.cc:881] Starting SessionService
I0413 15:42:45.793670 21126 session_service.cc:817] The server started(TCP with JSON): 0.0.0.0:8012
I0413 15:42:45.793715 21126 session_service.cc:817] The server started(HTTP with JSON): 0.0.0.0:8018
I0413 15:42:45.793771 21126 manifest_handler.cc:881] Starting WorldManager
I0413 15:42:45.793819 21126 manifest_handler.cc:881] Starting HttpClientPool
I0413 15:42:45.793843 21126 manifest_handler.cc:881] Starting DedicatedServerRpcService
I0413 15:42:45.793865 21126 manifest_handler.cc:881] Starting HelloWorldServer
I0413 15:42:45.793412 21160 event_queue.cc:401] The event thread has been started.

실행이 되었나요? 축하드립니다. 짝짝짝.

어떤가요? 기본 프로젝트를 생성하고 빌드하고, 실행하는 과정이 정말 쉽죠?

이제 다음 챕터에서 네트워킹 부분을 설명하고 직접 클라이언트-서버 패킷 타입을 추가해 보겠습니다.