모바일 푸쉬 메시지(FCM)를 위한 PHP 서버 구현 1부

today 2016-12-18 face Posted by appkr turned_in Work & Play forum 0

FCM(Firebase Cloud Message)은 Android, iOS, Web 등의 클라이언트에 푸쉬 메시지를 보내기 위한 서비스다. 과거 GCM(Google Cloud Message)이 진화한 것이다.

Firebase Logo

PubNub, Pusher 등의 메시징 서비스와 FCM이 다른 점은 단말기가 꺼져 있거나, 잠김 모드에 있거나, 메시지를 받을 애플리케이션이 실행 중이지 않을 때도 메시지를 보낼 수 있다는 점이다.

FCM을 이용한 푸쉬 메시징 시스템을 구성하라면 다음 두 가지가 필요하다.

  • 푸쉬 메시지를 받을 모바일 단말용 애플리케이션
  • 푸쉬 메시지를 전송할 모바일 단말을 선별하고, 원하는 메시지와 함께 구글 FCM 서버에 메시지 전송 요청을 부탁할 애플리케이션 서버(구글 공식 문서에서는 “앱 서버”라고 칭하기도 한다).

이 포스트에서는 애플리케이션 서버를 구현하는 과정을 기술해본다. 모바일 단말용 애플리케이션은 이 포스트에서 다루지 않는다.

RPC - Apache Thrift 입문 2부

today 2016-12-10 face Posted by appkr turned_in Work & Play forum 0

앞서 1부에서는 다음 내용을 다루었다.

  • RPC 시스템에 대한 이해와 여러 가지 RPC 프레임워크의 특징
  • Thrift IDL(Interface Definition Language)를 이용해서 API 규격 만드는 방법
  • API 규격을 다양한 언어로 컴파일하고 라이브러리화 하는 방법
  • API 서버 프로젝트에 라이브러리를 플러그인하고 API 규격에 맞춘 서비스를 개발하는 방법
  • API 클라이언트가 서버에 접속하여 Thrift 프로토콜로 통신하는 방법

1부에서 언급했다시피, Thrift 요청과 응답은 Thrift 프로토콜 안쪽에서 (역)직렬화 된다. 1부의 내용만으로는 디버깅이 어려워 서비스를 개발하기가 수월치 않다. 그래서 2부에서는 다음 내용을 다룬다.

  • Thrift 프로토콜 안쪽에서 작동하는 미들웨어를 만들어서 Thrift 요청을 핸들링하고 그 과정에서 발생한 예외를 잡고 소비하는 방법
  • 책임 연쇄(Chain of Responsibility) 패턴의 이해
  • 통합 테스트(Integration Test) 구현

Private(or Protected) 메서드 테스트 하기

today 2016-12-04 face Posted by appkr turned_in Work & Play forum 0

최근에 회사 일로 검색 서비스를 개발했다. 검색 엔진으로는 Elastic Search를 사용했고, 매일 최한시(off-peak time)에 한 번씩 운영 데이터베이스에서 검색, 필터링, 정렬, Aggregation 등에 필요한 컬럼만 골라 인덱싱하도록 설계했다. 그리고, 재고 수량과 같이 실시간 업데이트가 필요한 값 들은 다른 서비스에서 SNS 메시지 또는 메시지 큐를 이용해서 전달하고, 전달 받은 값을 인덱싱에 반영하도록 구현했다.

Elastic Search는 사용법이 복잡하긴 하지만, 인덱싱된 필드 값에 따라 내림차순, 오름차순으로 미리 정렬된 결과를 받을 수 있다. 그런데, 아무리 실시간 업데이트를 한다고 해도, 인덱싱된 값만으로 정렬이 불가능한 경우가 있고, 이 경우에는 검색 결과를 받아서 후 처리로 배열을 순회하면서 다시 정렬을 해야 한다. 같은 클래스의 Public 메서드가 정렬 요청을 하므로, 당연히 Protected 메서드로 구현했다.

일반적으로 알려진 테스트 모범 사례는 다음과 같다.

  • 내가 짠 코드만 테스트한다. 외부에서 가져온 라이브러리를 테스트할 이유는 없다.
  • Public 메서드만 테스트한다. Private나 Protected 메서드는 Public 메서드가 작동하는데 도움을 주는 메서드들이므로, Public 메서드를 테스트함으로써 자동으로 테스트된다.

후처리 정렬의 정상 작동을 확인해야 할 필요성이 생긴 것이다. 물론 구현한 Protected 메서드의 가시성을 Public으로 변경하면 쉽다. 그런데, 다른 클래스에서 호출하지도 않을 메서드를 Public으로 선언하는 것은 기분이 찜찜하다. 이 포스트에서는 Private나 Protected로 선언된 메서드를 유닛 테스트하는 방법을 설명한다. 결론부터 말하면, PHP의 Reflection API를 이용하는 것이다.

Monolog를 이용한 애플리케이션 로깅

today 2016-12-03 face Posted by appkr turned_in Work & Play forum 0

이 포스트에서는 PHP 커뮤니티에서 De facto(사실상) 표준으로 인식되는 로깅 라이브러리인 Monolog의 사용법을 소개한다. Monolog는 PSR-3 LoggerInterface를 구현한 구현체이며, RFC-5424에서 정의한 심각도 규격(e.g. DEBUG, INFO, ..)에 따라 로그를 핸들링한다. 컴포저를 만든 조르디 보기아노(Jordi Boggiano)가 구현했으며, 파일 뿐만 아니라 데이터베이스, 메일, SaaS 서비스등 다양한 방법으로 로그를 처리할 수 있다.

이 포스트에서는 라라벨 프로젝트에서 기본 로그 저장소인 파일(storage/logs/laravel.log)에 더해서 Elastic Search에도 로그를 적재하는 방법을 다룬다. 다음 도구 또는 서비스를 사용한다.

  • 라라벨: PHP 프로그래밍 언어로 작성된 풀 스택 웹 프레임워크1
  • Elastic Search: 검색에 특화된 데이터베이스. CRUD 및 설정을 위한 REST API를 제공한다.2
  • Docker: 컨테이너화된 애플리케이션 운영 환경을 관리하는 도구3

이 포스트의 소스 코드는 https://github.com/appkr/monolog-scratchpad에서 받을 수 있다.

제가 집필한 책이 어제 출간되었습니다. 웹 프로그래밍을 다룹니다. 웹 프로그래밍을 위한 도구로는 PHP 언어로 작성된 라라벨 프레임워크를 사용합니다.

2016년 초에 완성하고 깃허브에 공개한 무료 온라인 강의를 토대로 제이펍 출판사에 계신 프로페셔널들의 도움을 받아 비문을 고치고 부족한 설명을 보충하였습니다. 게다가 생활 코딩 오프라인 수업에 조교로 자원 봉사(5회?), 8시간 또는 14시간 짜리 라라벨 입문 강의(각 4회씩 총 8회) 등을 통해 입문자와 예비 독자들을 만나며, 여러분들이 어려워하거나 실수하기 쉬운 내용을 캐치하고 책의 내용과 구성에 반영했습니다.

라라벨로 배우는 실전 PHP 웹 프로그래밍

프로그래밍을 생짜 처음 하신다고요?

생활코딩의 웹 애플리케이션 만들기 정도만 공부하신 수준이면 이 책을 시작하는데 무리가 없습니다.

임베디드, 응용, 시스템 프로그래밍을 하시거나/하셨는데, 필요에 의해 웹 프로그래밍을 하셔야 한다고요?

이 책으로 시작하시는 당신은 행운아입니다.

이 곳에서 구매할 수 있습니다. 교보문고, 반디앤루니스, 알라딘, yes24, 인터파크

개발자들은 코드를 보면 코드를 짠 사람의 실력과 성격을 어느 정도 가늠할 수 있다는 얘기를 들었습니다. 마찬가지로, 저희들은 원고를 보고 지은이의 내공과 성격을 어느 정도 유추하곤 합니다. 김주원 님의 원고를 처음 받았을 때의 느낌은 ‘참 꼼꼼하면서 정갈한 분이시겠구나’였습니다. 책 전체의 뼈대와 같은 차례도 탄탄하고, 글을 풀어가는 느낌도 군더더기가 없어서 좋았습니다. 물론, 원고를 받고 책이 나오기까지 많은 분의 도움으로 수정 및 보완 작업을 거치긴 했지만요.

제이펍 블로그 포스트 중에서 (http://jpub.tistory.com/622)

안내 매월 첫째 주 수요일에 열리는 모던퍼그 정기 모임에 책을 들고 참여하시면 저자 싸인해 드리겠습니다.

keyboard_arrow_up