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 공식 문서 :
- https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko
- https://github.com/firebase/firebase-admin-python
참고 블로그 :
'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 |
댓글