아이펀 엔진 초기화¶
아이펀 엔진 을 사용해서 개발한 서버의 초기화 과정이 궁금하실 것입니다.
이번 장에서는 아이펀 엔진 이 기동할 때 초기화하는 과정을 살펴보면서 초기화 과정에서 사용자 코드의 특성에 따라서 어떤 함수를 사용하면 좋을지 설명하도록 하겠습니다.
예를들어, 서버가 본격적으로 동작하기 전 데이터를 초기화하고 싶다던지, 서버 시작 직후 필요한 타이머들을 실행하고 싶은 경우에 어디에 코드를 추가하면 좋을지 궁금하실 것입니다.
아이펀 엔진 은 콤포넌트 구조와 설정 방법 에서 설명한 것처럼 콤포넌트 기반으로 동작하는 구조이기 때문에 서버를 초기화 하는 과정도 콤포넌트 단위로 진행됩니다.
정해진 순서에 따라 각 콤포넌트를 초기화하는데요, 여러분이 구현하는 서버 역시 콤포넌트이기 때문에 프로젝트의 Server 클래스에 정의된 다음 함수들을 실행하는 것으로 서버를 초기화 합니다.
Install() 함수: 아이펀 엔진 이 서버 콤포넌트를 초기화하는 시점에 실행하는 함수입니다. 아이펀 엔진 콤포넌트들도
Install()
함수가 있으며, 엔진 콤포넌트들이 모두 초기화된 다음에 사용자 서버 콤포넌트의Install()
함수가 실행됩니다.이 함수에서는 Event 를 실행할 수 없으며, 다른 콤포넌트의 기능을 사용하지 못할 수 있습니다. 예를 들면 네트워크 관련 기능은 아직 동작하지 않습니다.
Start() 함수: 사용자 서버의 실제 동작을 정의하기 위한 함수로 이 함수가 실행되는 시점에는 의존하는 모든 엔진 콤포넌트들의
Start()
함수가 실행된 상태입니다.다른 콤포넌트의 기능을 사용할 수 있고, Event 를 실행할 수 있습니다. 예를 들어 네트워크 관련된 기능을 사용할 수 있습니다.
Uninstall() 함수: 서버가 종료될 때 실행되는 함수로
Install()
함수가 실행된 순서의 역순으로 실행됩니다. 다시 말해, 사용자 콤포넌트의Uninstall()
함수가 가장 먼저 실행되고나서 엔진 콤포넌트들의Uninstall()
할수가 실행됩니다.
Note
정리하면 위 함수들의 실행 순서는 다음과 같습니다.
서버 실행 시:
엔진 콤포넌트들의 Install() 함수 실행.
사용자 콤포넌트의 Install() 함수 실행.
엔진 콤포넌트들의 Start() 함수 실행.
사용자 콤포넌트의 Start() 함수 실행.
서버 종료 시:
사용자 콤포넌트의 Uninstall() 함수 실행.
엔진 콤포넌트들의 Uninstall() 함수 실행.
실제로 생성된 프로젝트의 Server 클래스는 다음과 같습니다.
class MyProjectServer : public Component {
public:
static bool Install(const ArgumentMap &arguments) {
LOG(INFO) << "Built using Engine version: " << FUNAPI_BUILD_IDENTIFIER;
/*
* 엔진의 ORM 기능을 초기화합니다.
* ORM 기능에 대해서 숙지하기 전까지는 임의로 수정하지 말아주세요.
*/
my_project::ObjectModelInit();
/*
* MANIFEST.json 파일의 "arguments" 에 정의한 파라미터는 서버 코드의
* arguments 객체를 통해서 접근할 수 있습니다.
*
* Example:
*
* 기본 생성되는 프로젝트의 MANIFEST.json 파일에는 "example_arg1" 과
* "example_arg2" 설정이 각각 문자열과 정수형으로 정의되어 있습니다.
* 아래와 같은 코드를 통해서 각 설정을 불러올 수 있습니다.
*/
string arg1 = arguments.FindStringArgument("example_arg1");
LOG(INFO) << "example_arg1: " << arg1;
int64_t arg2 = arguments.FindIntegerArgument("example_arg2");
LOG(INFO) << "example_arg2: " << arg2;
/*
* 서버를 실행할 때 옵션을 지정해서 값을 덮어 쓸수 있습니다.
* $ ./my_project-local --example_arg3=hahaha
*/
LOG(INFO) << "example_arg3: " << FLAGS_example_arg3;
/*
* 여러가지 핸들러들을 등록합니다.
* 다음과 같이 함수로 만들어서 비슷한 핸들러끼리 호출해도 되고,
* 핸들러를 등록하는 함수를 직접 호출해도 됩니다.
*
* 단, 아직 핸들러를 등록하는 시점이기 때문에 "Event" 는 실행할 수
* 없습니다.
*/
my_project::RegisterEventHandlers();
return true;
}
static bool Start() {
LOG(INFO) << "Hello, MyProject server is started!";
/*
* 여기까지 오면 아이펀 엔진 콤포넌트들이 모두 실행된 상태입니다.
* 서버가 실행되어 해야할 일이 있다면 여기에 추가해 주세요.
* 물론, "Event" 도 생성할 수 있습니다.
*
* 샘플에서는 아무 것도 하지않는 "OnTick" 함수를 주기적으로 실행하는
* 타이머를 등록합니다.
*/
Timer::ExpireRepeatedly(boost::posix_time::seconds(10),
my_project::OnTick);
return true;
}
static bool Uninstall() {
return true;
}
};
public class Server
{
public static bool Install(ArgumentMap arguments)
{
/*
* MANIFEST.json 파일의 "arguments" 에 정의한 파라미터는 서버 코드의
* arguments 객체를 통해서 접근할 수 있습니다.
*
* Example:
*
* 기본 생성되는 프로젝트의 MANIFEST.json 파일에는 "example_arg1" 과
* "example_arg2" 설정이 각각 문자열과 정수형으로 정의되어 있습니다.
* 아래와 같은 코드를 통해서 각 설정을 불러올 수 있습니다.
*/
string arg1 = arguments.FindString ("example_arg1");
Log.Info ("example_arg1: {0}", arg1);
Int64 arg2 = arguments.FindInteger ("example_arg2");
Log.Info ("example_arg2: {0}", arg2);
/*
* 서버를 실행할 때 옵션을 지정해서 값을 덮어 쓸수 있습니다.
* $ ./my_project-local --example_arg3=hahaha
*/
Log.Info("example_arg3: {0}", Flags.GetString ("example_arg3"));
/*
* 세션 "Open", "Close" 핸들러를 등록합니다.
*/
NetworkHandlerRegistry.RegisterSessionHandler (
new NetworkHandlerRegistry.SessionOpenedHandler (OnSessionOpened),
new NetworkHandlerRegistry.SessionClosedHandler (OnSessionClosed));
/*
* "echo" 타입의 JSON 메시지를 수신했을 때 실행하는 메시지 핸들러입니다.
*/
NetworkHandlerRegistry.RegisterMessageHandler ("echo", new NetworkHandlerRegistry.JsonMessageHandler (OnEcho));
/*
* "echo_pbuf" 타입의 Protocol Buffers 메시지를 수신했을 때
* 실행되는 메시지 핸들러를 등록합니다.
*/
NetworkHandlerRegistry.RegisterMessageHandler ("pbuf_echo", new NetworkHandlerRegistry.ProtobufMessageHandler (OnPbufEcho));
return true;
}
putatic bool Start()
{
Log.Info ("Hello, {0} server is started!", "MyProject");
/*
* 여기까지 오면 아이펀 엔진 콤포넌트들이 모두 실행된 상태입니다.
* 서버가 실행되어 해야할 일이 있다면 여기에 추가해 주세요.
* 물론, "Event" 도 생성할 수 있습니다.
*
* 샘플에서는 아무 것도 하지않는 "OnTick" 함수를 주기적으로 실행하는
* 타이머를 등록합니다.
*/
Timer.ExpireRepeatedly(WallClock.FromSec(1), OnTick);
return true;
}
putatic bool Uninstall()
{
return true;
}