아이펀 엔진 초기화

아이펀 엔진 을 사용해서 개발한 서버의 초기화 과정이 궁금하실 것입니다.

이번 장에서는 아이펀 엔진 이 기동할 때 초기화하는 과정을 살펴보면서 초기화 과정에서 사용자 코드의 특성에 따라서 어떤 함수를 사용하면 좋을지 설명하도록 하겠습니다.

예를들어, 서버가 본격적으로 동작하기 전 데이터를 초기화하고 싶다던지, 서버 시작 직후 필요한 타이머들을 실행하고 싶은 경우에 어디에 코드를 추가하면 좋을지 궁금하실 것입니다.

아이펀 엔진콤포넌트 구조와 설정 방법 에서 설명한 것처럼 콤포넌트 기반으로 동작하는 구조이기 때문에 서버를 초기화 하는 과정도 콤포넌트 단위로 진행됩니다.

정해진 순서에 따라 각 콤포넌트를 초기화하는데요, 여러분이 구현하는 서버 역시 콤포넌트이기 때문에 프로젝트의 Server 클래스에 정의된 다음 함수들을 실행하는 것으로 서버를 초기화 합니다.

  • Install() 함수: 아이펀 엔진 이 서버 콤포넌트를 초기화하는 시점에 실행하는 함수입니다. 아이펀 엔진 콤포넌트들도 Install() 함수가 있으며, 엔진 콤포넌트들이 모두 초기화된 다음에 사용자 서버 콤포넌트의 Install() 함수가 실행됩니다.

    이 함수에서는 Event 를 실행할 수 없으며, 다른 콤포넌트의 기능을 사용하지 못할 수 있습니다. 예를 들면 네트워크 관련 기능은 아직 동작하지 않습니다.

  • Start() 함수: 사용자 서버의 실제 동작을 정의하기 위한 함수로 이 함수가 실행되는 시점에는 의존하는 모든 엔진 콤포넌트들의 Start() 함수가 실행된 상태입니다.

    다른 콤포넌트의 기능을 사용할 수 있고, Event 를 실행할 수 있습니다. 예를 들어 네트워크 관련된 기능을 사용할 수 있습니다.

  • Uninstall() 함수: 서버가 종료될 때 실행되는 함수로 Install() 함수가 실행된 순서의 역순으로 실행됩니다. 다시 말해, 사용자 콤포넌트의 Uninstall() 함수가 가장 먼저 실행되고나서 엔진 콤포넌트들의 Uninstall() 할수가 실행됩니다.

Note

정리하면 위 함수들의 실행 순서는 다음과 같습니다.

서버 실행 시:

  1. 엔진 콤포넌트들의 Install() 함수 실행.

  2. 사용자 콤포넌트의 Install() 함수 실행.

  3. 엔진 콤포넌트들의 Start() 함수 실행.

  4. 사용자 콤포넌트의 Start() 함수 실행.

서버 종료 시:

  1. 사용자 콤포넌트의 Uninstall() 함수 실행.

  2. 엔진 콤포넌트들의 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;
  }