본문 바로가기
Django/Django REST framework

Django FCM 개발(DRF)

by hyun-am 2022. 3. 1.

FCM이란

FCM은 무료로 메시지를 안정적으로 전송할 수 있는 교차 플랫폼 메시징 솔루션입니다.

FCM을 사용하면 새 이메일이나 기타 데이터를 동기화할 수 있음을 클라이언트 앱에 알릴 수 있습니다. 이렇게 알림 메시지를 전송하여 사용자를 유지하고 재참여를 유도할 수 있습니다. 채팅 메시지와 같은 사용 사례에서는 메시지로 최대 4,000바이트의 페이로드를 클라이언트 앱에 전송할 수 있습니다.

FCM :https://firebase.google.com/docs/cloud-messaging?hl=ko

Django에서 FCM이용하기

FCM 세팅하기

fcm-django, pyfcm, django-fcm등 많은 라이브러리들이 있었는데 저는 firebase-admin을 사용했습니다.

firebase-admin을 먼저 설치하겠습니다.

pip install firebase-admin

그 후 파이어베이스 콘솔창에 들어간 후 설정 > 서비스 계정에 들어가서 비공개 키를 설정하겠습니다.

 

그러면 serviceAccountKey.json이라는 파일이 생성된 것을 확인할 수 있습니다. 이제 이것을 등록해줄텐데 저는 docker를 사용해서 배포하고 있어서.. 다음과 같이 env를 이용해서 serviceAccountKey안에 있는 내용을 불러 와서 등록했습니다.

Settings.py

 

service_account_key = {
    "type": env("TYPE"),
    "project_id": env("PROJECT_ID"),
    "private_key_id": env("PRIVATE_KEY_ID"),
    "private_key": env("PRIVATE_KEY").replace("\\\\n", "\\n"),
    "client_email": env("CLIENT_EMAIL"),
    "client_id": env("CLIENT_ID"),
    "auth_uri": env("AUTH_URI"),
    "token_uri": env("TOKEN_URI"),
    "auth_provider_x509_cert_url": env("AUTH_PROVIDER_X509_CERT_URL"),
    "client_x509_cert_url": env("CLIENT_X_509_CERT_URL"),
}

cred = credentials.Certificate(service_account_key)
firebase_admin.initialize_app(cred)

docker-compose.yml

services:
  django:
  ...
  ...
  ...
    env_file:
      - ./.serviceAccountKey
	...
	...

알림 기능 적용하기

먼저 알림 기능을 적용하려면 유저마다 새로운 FCM토큰을 받아야하는데 처음에는 아 그냥 유저 테이블에 fcm만 받으면 되는거 아닌가? 라는 생각을 해서 user테이블에 fcm컬럼을 추가해서 진행했습니다. 하지만 개발하면서 사용자가 기기를 한개만 쓰는것도 아니고 여러개 쓸 수도 있고 또한 두 기기를 동시에 사용하고 있으면 두 기기에 알림을 가게 구현하기 위해 새로 테이블을 만든 후 연결해서 진행했습니다.

유저 - 디바이스

class Device(models.Model):
		user = models.ForeignKey(
        to="users.User", on_delete=models.CASCADE, verbose_name="유저", null=True
    )
		fcmToken = models.CharField("FCM Token", blank=True, max_length=500, null=True)
		'''
		나머지 다양한 내용들
		'''

이런식으로 유저에 연결해서 사용했습니다.

그 후 알림을 보내기 위한 메서드를 구현했는데 메서드는 아래와 같습니다

from firebase_admin import messaging, auth

def send_to_firebase_cloud_messaging(token, title, body, deep_link):
    registration_token = token
    message = messaging.Message(
        notification=messaging.Notification(
            title=title,
            body=body,
        ),
        token=registration_token,
        data={
            "url": deep_link,
        },
    )
    try:
        response = messaging.send(message)
        print(f"Successfully sent message: {response}")
    except Exception as e:
        print("예외가 발생했습니다.", e)

title과 body를 받는 이유는 알림에 들어갈 상단 타이틀과 그 안에 들어갈 내용들을 받기위해 사용했고 deep_link를 정한 이유는 이 알림을 누를때 원하는 곳에 자연스럽게 들어가기 위해 추가했습니다.

또한 token을 받기위한 메서드는 다음과 같습니다. 서비스코드와 100퍼센트 일치하지는 않지만 참고 하시길 바랍니다.

def get_group_user_token(그룹에 참가한 유저):
    user_list = [그룹에 참가한 유저.user.key for 그룹참가 유저들 in 그룹 참가 유저 리스트(활동중,알림허용)]
		device_list = [device for device in Device.objects.filter(유저아이디__in = user_list)]
    return device_list

이런식으로 유저들의 디바이스정보를 받아오고 그다음 fcm toekn을 받기위해 다음과 같이 값을 넘겨줄 수 있습니다.

title = "test title"
body = "test body"
deep_link = "/링크"

for device in device_info_list:
    send_to_firebase_cloud_messaging(device.fcmToken,title,body,deep_link)

print(f"{len(device_info_list)}개의 디바이스에 알림 전송 완료")

이렇게 작성하면 그룹안에 있는 모든 유저들의 디바이스 정보를 받아서 그 디바이스들한테 알림이 보내지는 것을 확인할 수 있습니다.

참고한 링크

fcm 공식 문서 :

참고 블로그 :

'Django > Django REST framework' 카테고리의 다른 글

15. Throttling  (0) 2022.08.25
Sendbird를 이용한 DRF 채팅서버 구현  (0) 2022.06.24
DRF 테스트코드 개발 도전기  (0) 2021.12.17
14-Authentication  (0) 2021.09.26
13-Testing  (0) 2021.08.24

댓글