PHP 프로젝트에 Swagger 적용 #1

today 2017-12-24 face Posted by appkr turned_in Work & Play , Learn & Think forum 0

PHP 기반 API 서버 프로젝트에 스웨거(Swagger)를 적용할 수 있을까?

예, 적용할 수 있습니다. 예제를 짜서 검증했습니다.

• • •

이 포스트를 쓰기 위한 예제를 진행하면서 스웨거가 해결하고자 했던 문제점을 좀 더 깊이 있게 생각해보는 계기가 되었습니다. 이 시리즈에서는 다음 내용을 다루려고 합니다.

  1. 스웨거란 무엇이며, 왜, 언제 쓰는가?
  2. PHP 기반 API 서버 프로젝트에 스웨거를 어떻게 적용해야 하는가?
• • •

네이버 국어사전에 따르면 찍새딱새를 이렇게 정의하고 있습니다.

  • 찍새 닦을 구두를 모아서 구두닦이에게 가져다주는 일만 하는 사람을 속되게 이르는 말.
  • 딱새 은어로, ‘구두닦이’를 이르는 말.

예~ 구두닦이 서비스를 말하는 겁니다. 주제와 전혀 다른 구두닦이 서비스를 언급한 이유는, 제가 속한 회사의 서비스가 이런 식으로 역할 분담이 되어 있기 때문입니다. 상점으로부터 배송 대행 요청을 접수 받는 서비스와(이하 프라임), 기사님들에게 배송 대행 업무를 나누어 주고, 배정 받은 기사님이 물건을 보내고자하는 상점으로 가서 물건을 픽업하고 목적지까지 배송하고 상품가액과 수수료를 결재 받는 서비스(이하 부릉)로 구성되어 있습니다. 아무리 구두닦이 장인들이 모여 있더라도 구두를 찍어 오지 못하면 서비스는 쪼그라들겁니다. 반면에, 영업의 신들이 구두를 아무리 잘 찍어와도 구두를 깨끗이 닦지 못하면 손님은 다시 찾아오지 않을 겁니다. 결국 둘 간에 강한 결합이 존재하며, 서로 선순환을 일으켜야 한다는 사실을 알 수 있습니다.

참고로 프라임 서비스는 라라벨 서버, 닷넷 및 Android 클라이언트로 구성되어 있습니다. 부릉 서비스는 스프링 서버, 닷넷 및 Android 클라이언트로 구성되어 있습니다. 두 서비스를 전부 관리하는 관리도구는 자바스크립트 SPA SINGLE PAGE APPLICATION로 구성되어 있습니다.

이 포스트와 관련해서 중요한 사실은 프라임도 부릉에게는 일개 클라이언트라는 점입니다. 부릉은 멀티 클라이언트 플랫폼에 대응하기 위해 스웨거 API 스펙을 관리하고 있고, 프라임은 부릉이 노출하고 있는 API를 사용하기 위해서 스웨거 스펙으로 자동 생성한 PHP 클라이언트 라이브러리를 컴포저로 땡겨서 vendor에 꽂아서 사용합니다. 저는 프라임 서버 개발자입니다. 지난 일년간을 스웨거 스펙의 소비자이기만 하다가, 최근에 갑자기 ‘PHP로 짠 서버 프로젝트가 스웨거 API의 생산자가 될 수 있을까?’라는 생각이 들기 시작했습니다.

클린코드와 리팩토링

today 2017-12-06 face Posted by appkr turned_in Work & Play forum 0

MVPMinimum Viable Product로 개발한 서비스는 시장성 및 사업성이 검증되면 버리고 다시 짜야 합니다. MVP는 “더럽지만, 신속하게, 작동하는 서비스를 확보한다”는게 가치이기 때문입니다. 사업 모델이 검증되면, 투자를 받고 사람을 뽑아서 오랫동안 유지할 코드 베이스, 성장을 이끌어 낼 수 있는 코드 베이스를 확보해야 합니다. 대부분의 스타트업들이 이 타이밍을 놓치고 있고, 제가 속한 회사도 예외는 아닙니다.

본문의 예제를 보기전에 예제 코드가 쓰이는 사업 이해를 위해 간단히 설명을 드립니다.

(회사의 공식 입장이 아닌, 직원으로서 나름의 생각입니다) 우리 회사는 현재 “이륜차 네트워크를 이용한 근거리 배송 대행 서비스”를 업으로 하고 있으며, 사업 모델(= 서비스 모델 + 비즈니스 모델)은 다음과 같습니다.

서비스 모델

  • 출발지 A 지점에서 도착지 B 지점으로 소형 화물을 이동시킨다.
  • A ~ B간의 거리는 일반적으로 3Km 이내이며,
  • 이동 수단으로 이륜차를 이용하고,
  • 서비스를 위해 IT 기술을 이용한다.
  • 화물 운송은 대체로 40분 이내에 끝난다.

비즈니스 모델

  • 화물 운송 니즈가 있는 S 화주에게 배송 대행 수수료를 받아, 실제로 물건을 이동시키는 K 기사에게 비용을 지불하고 마진을 챙긴다.
  • 배송 건수에 따라 S 화주로 부터 월 단위 시스템 사용료도 받는다.

본문에 사용한 예제는 화주 S로 부터 배송 대행 요청을 받아, K 기사 네트워크를 보유하고 배송을 수행하는 시스템에 위임하는 코드입니다. 공개를 위해 이름을 약간 바꾸긴 했지만, 실제 상용 서비스에 사용하는 코드입니다. 하나의 배송 대행 요청에 대해 웹/앱 인스턴스에서 큐 메시지로 전송하기 위해 한 번, 큐 워커 인스턴스에서 메시지를 핸들링 하기 위해 한번, 총 두 번 사용됩니다(= 비동기 처리). 현재 우리 회사의 사업 규모로 볼 때 컴퓨터(서버)가 이 코드를 하루에 10만번 정도 읽고 실행합니다.

• • •

여기서 질문!

그렇다면 개발자는 이 코드를 몇 번이나 읽을까요? 성공적인 서비스에서 유지보수가 되어야 하는 코드는 개발자와 개발자를 거치면서 만 번 정도 읽힌다고 합니다. 컴퓨터가 이해할 수 있는 코드는 작동하기만 한다면 아무렇게나 짜도 됩니다. 그런데, 사람이 읽어야 하는 코드는, 그것도 서비스 유지보수를 위해 수 천번 이상을 읽어야 하는 코드는 어떻게 짜야 할까요?

클린코드(엉클밥), 리팩토링(마틴파울러)의 책을 완벽히 이해하지도 못했고, 이해했다고 해도 모든 내용을 실천하지는 못합니다. 지금 MVP를 짜고 있나요? 그렇지 않다면, 몇 달 뒤의 자기 자신과 이 코드를 읽게 될 동료/후배 개발자들을 위해 좀 더 깔끔한 코드를 짜면 좋겠습니다. 디자인 원칙과 모범 사례를 지킨 코드는 버그와 사이드 이펙트를 현저히 줄여주고, 생산성을 월등히 끌어올려줍니다.

이 글을 읽는 분 중에 Before 코드를 쓰신 선배님이 있을 수 있습니다. 비록 유지보수가 편리한 코드로 바꾸는 타이밍을 놓치긴했지만(이건 경영진과 매니저의 잘못), MVP를 만들어 주셔서 제가 월급을 받으며 일할 수 있기에 존경과 감사의 마음을 글로나마 전달합니다. 해서 Before 코드에 대한 설명은 달지 않겠습니다.

이제 예제를 볼까요?

라라벨 엘로퀀트 모델 이벤트 고찰

today 2017-10-22 face Posted by appkr turned_in Work & Play forum 0

라라벨 엘로퀀트에서 발생하는 모델 이벤트를 실험한 결과 입니다. 선점 잠금과 비선점 잠금 실험을 위한 프로젝트에 이벤트 리스너를 등록하고 엘로퀀트 모델을 DB에 저장하고, 변경한 후 DB에 저장하고, 삭제할 때 어떤 이벤트가 발생하는지 살펴 봤습니다.

이벤트를 잡기 위한 리스너 클로저는 아래와 같습니다.

<?php // https://github.com/appkr/db-lock-poc/blob/master/app/Providers/EventServiceProvider.php

class EventServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Event::listen('eloquent.*', function ($event) {
            Log::info($event);
        });
    }
}

관찰자(Observer) 패턴은 관찰의 대상이 되는 타입에, 대상을 관찰하려는 타입을 등록해두고, 특정 사건(Event)이 발생하면 등록된 관찰자의 함수를 호출하는 겁니다. 쉽게 말하면, “밥 다되면 불러줘~”라고 미리 말해두고, 밥이 다 되면 알려주는 거죠.

“관찰자를 등록하고 사건이 발생하면 등록된 관찰자들에게 알려준다”는 큰 개념은 같지만, 라라벨의 엘로퀀트 모델은 $observables 변수에 객체가 아닌 문자열로 관찰자를 등록합니다. 그리고 엘로퀀트에서는 save()와 같은 퍼블릭 함수가 작동할 때, 자신의 fireModelEvent('created') 함수를 호출하고, 이 함수가 다시 관찰자에서 이벤트와 같은 이름을 가진 함수, 예를 들어 created($this)를 호출하는 식으로 작동합니다.

소프트웨어 장인 by 산드로 만쿠소

today 2017-09-23 face Posted by appkr turned_in Learn & Think forum 0

[p.316] 나는 일을 선택하기 전에 아래와 같은 질문들을 스스로에게 던졌다.

  • 나의 커리어로부터 나는 무엇을 원하는가?
  • 그것을 성취하기 위한 다음 단계는 무엇인가?
  • 이 일은 나의 커리어 방향과 합치하는가?
  • 내가 이 회사에 줄 수 있는 가치의 양은 얼마나 되는가?
  • 그러한 투자에 대한 이익은 무엇인가?
  • 그러한 투자는 대략적으로 얼마 동안 지속되어야 하는가?
  • 내가 되고자 하는 프로페셔널에 이르는 데 이 일은 어떻게 도움이 되는가?
  • 이 일에서 나는 자율성, 통달, 목적의식을 가질 수 있나?
  • 나의 고용주와 생산적인 동반자 관계를 맺을 수 있나? 양측 모두 가치를 얻고 행복할 수 있나?
keyboard_arrow_up