[Lumen 체험기?] 기존에 Laravel 로 개발 중인 api 서비스를 Lumen 으로 바꿔보았습니다.

  • Laravel -> Lumen Migration 해봤습니다. 하루동안 삽질한 양이 어마어마합니다. Routing 와 패키지 적용, 설정 등을 하는데 시간이 오래걸렸네요. 물론 내공이 있으신 분들은 뚝딱하시리라 생각됩니다. 이것저것 체험 기록을 남겨봅니다.(영양가는 없습니다.)

  • routes.php에 기본으로 Route::대신에 $app->get(), post, put, delete 등을 사용해야되고 Route::resources 가 되지 않습니다.
    성능 최적화를 목적으로 만들어서 그런지 routes 설정에 불편한 점이 꽤 있었습니다.

  • routes.php에 group을 여러번 쓰기 때문에 아래와 같이 형태로 만들어두었습니다. Controller namespace를 App\Http\부터 입력을 해야 하더군요. 속도에 지장이 없는 한도에서 변수나 함수를 만들어서 쓰면 어느정도 불편함은 해소가 될것 같습니다.

function controller_namespace(){
    return 'App\Http\Controllers\\';
}
$app->group(['prefix' => 'v1/auth', 'namespace' => controller_namespace().'Api\V1'], function() use ($app){
    $app->get('create', 'TokenController@create');
});
  • 프로젝트에 Sentry(Sentinel), hisorange/browser-detect 패키지를 사용하고 있는데 패키지가 제대로 작동하지 않아 직접 필요한 프로바이더를 만들어주거나 패키지 소스를 고쳐야하는 번거로움이 있었습니다. 현재로서는 Lumen에 안정화된 패키지는 찾기 어려울 것 같습니다. 앞으로 차차 Lumen용 패키지들이 나오겠죠.

  • Controller 에서 Request를 Contructor Injection 해서 보면 parameters 항목이 없습니다. 쿼리스트링이나 form,input data는 기존처럼 dynamic하게 쓸 수 있습니다.

// /v1/event/{phase}/{id}
// Laravel
  public function show(Request $request, EventService $eventService)
  {
    $eventService->initWithPhase($request->phase); // parameters의 phase와 id를 dynamic하게 쓸수 있습니다.
    if($event = $eventService->find($request->id)){
    //...
  }
// Lumen
  public function show(Request $request, EventService $eventService, $phase, $id)
  {
    $eventService->initWithPhase($phase); // Request에 parameters가 비어있으므로 phase나 id등 은 받아서 써야합니다.
    if($event = $eventService->find($id)){
    //...
  }
  • 외부 패키지의 config 파일은 bootstrap/app.php 파일에서 상단에 되도록 상단 부분에
$app->configure('sentry');
$app->configure('sentinel');

이렇게 지정해두고 config('sentry.hasher'); 이렇게 설정 값을 불러올 수 있습니다. config와 configure가 같은 건지 알고 이게 뭔가 갸우뚱했었네요.

  • 옮기다 보면 laravel에 illuminate 일부분이 필요하게 되는 경우도 있는데 저는 redis와 외부 패키지에서 필요하게 되서 illuminate/routing을 composer 로 require해두었습니다.
    "illuminate/redis": "5.0.",
    "illuminate/routing": "5.0.
    ",

  • 제 기준에서는 좀 고생을 했지만 한번만 익히면 Lumen 이나 Laravel이나 거의 차이가 없을 것 같네요.

  • Request 중에 가장 오래 걸렸던 것을 체크해보았는데 700ms 걸리던 응답이 200ms~300ms 나오네요 속도면에서 약 2배 정도 빨라졌습니다. 이것저것 손보면 3배 이상은 빨라질 것 같네요. API에 쓸 대 없는 View, Session 이 포함되어있는 Sentry를 쓰고 있는 데도 속도가 빨라졌네요. 로컬 아파치에 hosts로 변경해서 개발하고 있어서 실서버가 오히려 응답시간이 더 빠를 것으로 예상됩니다;

  • 속도는 만족스럽습니다.

comments powered by Disqus