2015년 2월 21일 토요일

Google Cloud Messaging (GCM) 구현하기 - 1/4

GCM 살펴보기

개요

GCM은 구글에서 무료로 제공하는 서비스로 안드로이드에 푸쉬 메시지를 보낼 때 사용한다.
이 서비스를 이용해 새로운 메일이 왔다는 알림을 제공할 수도 있고, 앱에 전달할 데이터가 4kb를 넘지 않는다면 카카오톡처럼 메시지를 주고 받는데 사용할 수도 있다.
이번 포스팅에서는 전체적인 구조를 설명한다.

GCM 아키텍처


GCM 구현은 서드 파티 앱 서버(3rd-Party App Server)와 GCM Connection Server, 클라이언트 앱으로 구성된다.
푸쉬 메시지를 보낼 때 서드 파티 앱 서버가 GCM Connection Server에 요청하면, GCM Connection Server는 그 요청을 받아 클라이언트 앱에 푸쉬 메시지를 전달한다.
또한 클라이언트 앱에서 서드 파티 앱 서버로 메시지를 전송할 수도 있는데, 이 때는 역으로 클라이언트 앱이 GCM Connection Server에 요청하면, GCM Connection Server가 서드 파티 앱 서버에 메시지를 전달한다.
서드 파티 앱 서버 -> GCM Connection Server -> Client App 방향으로 메시지를 보내는 것을 다운스트림 메시지(downstream message)라고 하고, 그 반대를 업스트림 메시지(upstream)라고 부른다.
우리가 구현해야하는 부분은 서드 파티 앱 서버와 클라이언트 앱이다.

전체 흐름


이 그림은 다운스트림 메시지의 흐름을 보여준다. 
1. 클라이언트 앱 등록
    - 클라이언트 앱은 GCM Connection Server에 메시지를 받고 싶다고 요청을 한다.
2. 등록 아이디 발급 (registration ID)
    - CGM Connection Server는 등록 아이디를 발급하는데 등록 아이디는 디바이스마다 다르다.
3. 등록 아이디 전달
    - 클라이언트 앱은 서드 파티 서버에 발급받은 등록 아이디를 전달해야하는데, 이는 서버에서
      GCM Connection Server에 푸쉬 메시지를 요청할 때 누구에게 보낼 것인지를 지정하는데 
      사용된다. 클라이언트 앱은 GCM Connection Server에 등록할 때만 서드 파티 서버에 등록
      아이디를 보내면 되고 서드 파티 서버는 푸쉬 메시지를 보낼 때마다 사용할 수 있도록 이를
      저장해 두어야 한다.
4. 푸쉬 메시지 이벤트 발생
    - 푸쉬 메시지를 보내야할 일이 생기면, 서드 파티 서버에 푸쉬 메시지를 보내라고 요청을 한다.
       ex. "관리자가 사용자에게 메시지 전송"
5. GCM Connection Server에 요청
     - 서드 파티 앱 서버는 메시지를 보내고 싶은 사용자의 등록 아이디 + 데이터를 
       GCM Connection Server에 전달한다.
6. GCM Connection Server가 앱에 푸쉬 메시지를 보낸다.

등록 상태 동기화

클라이언트 앱이 서드 파티 서버에 등록 아이디를 전달하면 서버는 이를 저장두어야 한다고 설명 했다. 하지만 클라이언트 앱이 한 번 등록했다고 해서 등록 상태가 계속 지속되는 것은 아니다. 이제부터는 등록 아이디를 갱신하고 해제해야하는 케이스를 다룬다.

등록 아이디를 갱신해야하는 케이스는 다음 2가지 이다.
- 클라이언트 앱 업데이트
- 백업 & 복구

클라이언트 앱 업데이트
클라이언트 앱의 버전이 업데이트 되면 새로운 버전에서도 제대로 동작한다고 보장할 수 없다. 따라서 앱 버전이 업데이트되면 다시 CGM Connection Server에서 새로 등록 아이디를 발급받아야 한다. (이는 "Google Cloud Messaging (GCM) 구현하기 - 3/4"에서 설명한다.)

백업 & 복구
앱이 백업될 때 등록 아이디는 저장하면 안된다. 앱이 복구될 때에는 등록 아이디가 유효하지 않을 수도 있기 때문이다. 그렇게 되면 영영 푸쉬 메시지를 받을 수 없게 된다.
즉, 저장해두지 않고 앱이 복구 될 때 다시 GCM Connection Server에 등록 절차를 밟게 해야한다.

그 다음으로 다룰 내용은 등록 해제이다.
등록 해제는 코드 상에서 명시적으로 수행할 수도 있고, 아니면 사용자가 앱을 삭제하면 자동으로 등록 해제 된다.

하지만, 명시적으로 등록을 해제할 일은 거의 없다고 보면 된다.
- 등록을 해제하고 다시 등록하면, 100%는 아니지만 대게 같은 등록 아이디를 발급받게 된다.
- 등록 해제하는데 5분 정도 걸린다.
- 등록이 해제 된 후에, 다시 등록하려면 5분 정도 걸린다.

따라서 등록을 해제하기 보다는 사용자에게 정확하게 메시지를 보내도록 해야한다.

사용자가 앱을 삭제하면 등록이 해제되는데 다음은 그 과정을 설명한다.
1. 사용자가 앱을 삭제한다.
2. 서드 파티 서버가 GCM 서버에 메시지를 전송한다.
3. GCM 서버는 해당 디바이스의 GCM 클라이언트에게 메시지를 전송한다.
4. GCM 클라이언트는 메시지를 받고 앱이 삭제되었음을 확인한다.
5. GCM 클라이언트는 서버에 앱이 삭제되었다고 알린다.
6. GCM 서버는 해당 등록 아이디가 삭제되었다고 표시한다.
7. 서드 파티 서버가 GCM 서버에 메시지를 전송한다.
8. GCM 서버는 NotRegistered 에러 메시지를 서드 파티 서버에 반환한다.
9. 서드 파티 서버는 등록 아이디를 삭제한다.

GCM 서버에서 등록 아이디가 삭제되는데 5분정도 걸릴 수 있어 7번 과정에서 메시지가 정상적으로 전달되었다고 반환될 수도 있다.

다음 포스팅에서는 Google API Console에서 GCM 서비스를 활성화하고 API 키를 발급받는 방법에 대해 다룬다.

참고 자료


댓글 없음: