코틀린 안드로이드 앱개발 강좌, 서버에서 보내는 알림 받기

본 강좌에서는 코틀린을 사용하여 안드로이드 앱에서 서버로부터 푸시 알림을 수신하는 방법에 대해 다룰 것입니다. 모바일 애플리케이션은 사용자에게 실시간 정보를 제공하는 경우가 많아, 푸시 알림은 사용자 경험을 향상시키는 데 중요한 역할을 합니다. 이 강좌를 통해 Firebase Cloud Messaging(FCM)을 활용하여 안드로이드 앱에서 푸시 알림을 구현하는 방법을 학습할 것입니다.

1. Firebase Cloud Messaging(FCM) 소개

Firebase Cloud Messaging(FCM)은 구글에서 제공하는 서비스로, 앱 개발자가 실시간으로 사용자에게 메시지를 전송할 수 있도록 돕습니다. 이 서비스는 주로 알림을 전송하는 데 사용되며, 메시지는 텍스트, 이미지, 동영상 등을 포함할 수 있습니다.

FCM의 주요 기능

  • 서버에서 클라이언트로 메시지를 전송할 수 있습니다.
  • 사용자가 앱을 사용 중일 때와 사용하지 않을 때 모두 전송할 수 있습니다.
  • 주제(Topic) 기반의 메시징을 지원합니다.

2. 프로젝트 설정

안드로이드 스튜디오에서 새로운 프로젝트를 생성하고 FCM을 설정하기 위한 과정을 살펴보겠습니다.

2.1 Firebase Console 설정

  1. Firebase Console에 로그인합니다.
  2. 새 프로젝트를 생성하고 프로젝트 이름을 입력합니다.
  3. 앱을 Android로 추가합니다. 패키지 이름을 입력하고 SHA-1 키를 추가합니다.
  4. google-services.json 파일을 다운로드하여 안드로이드 앱의 app 폴더에 추가합니다.

2.2 Gradle 설정

앱의 build.gradle 파일에 필요한 종속성을 추가합니다:

dependencies {
        implementation 'com.google.firebase:firebase-messaging-ktx:23.1.0' // 최신 버전 확인
    }

그리고 프로젝트의 build.gradle 파일에 아래를 추가하여 Google 서비스 플러그인을 적용합니다:

buildscript {
        dependencies {
            classpath 'com.google.gms:google-services:4.3.10'
        }
    }

2.3 Manifest 설정

AndroidManifest.xml 파일에 FCM 서비스를 설정합니다:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <application
        ... >

        <service
            android:name=".MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

    </application>
    </manifest>

3. FCM 메시징 서비스 구현

이제 FCM을 통해 메시지를 수신하기 위해 MyFirebaseMessagingService 클래스를 구현하겠습니다.

3.1 MyFirebaseMessagingService 클래스

푸시 알림을 수신하기 위해, FirebaseMessagingService를 상속받아 MyFirebaseMessagingService 클래스를 생성합니다:

import android.app.NotificationChannel
    import android.app.NotificationManager
    import android.content.Context
    import android.os.Build
    import android.util.Log
    import com.google.firebase.messaging.FirebaseMessagingService
    import com.google.firebase.messaging.RemoteMessage

    class MyFirebaseMessagingService : FirebaseMessagingService() {
        override fun onMessageReceived(remoteMessage: RemoteMessage) {
            // 메시지 수신 로직
            Log.d("FCM", "From: ${remoteMessage.from}")

            remoteMessage.notification?.let {
                sendNotification(it.title, it.body)
            }
        }

        private fun sendNotification(title: String?, messageBody: String?) {
            val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val channelId = "default_channel"
            val builder = NotificationCompat.Builder(this, channelId)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(title)
                .setContentText(messageBody)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val channel = NotificationChannel(channelId, "Channel human-readable title", NotificationManager.IMPORTANCE_DEFAULT)
                notificationManager.createNotificationChannel(channel)
            }

            notificationManager.notify(0, builder.build())
        }
    }

4. 서버에서 메시지 전송하기

이제 서버에서 FCM을 통해 메시지를 전송하는 방법을 살펴보겠습니다. FCM API를 사용하여 POST 요청을 보내 메시지를 전송합니다.

4.1 서버 코드 예제

아래는 Node.js를 사용하여 서버에서 FCM으로 메시지를 보내는 예제입니다:

const express = require('express');
    const admin = require('firebase-admin');

    const app = express();
    admin.initializeApp({
        credential: admin.credential.applicationDefault(),
        databaseURL: 'https://.firebaseio.com'
    });

    app.post('/send', (req, res) => {
        const message = {
            notification: {
                title: 'Hello!',
                body: 'You have received a new message.'
            },
            token: ''
        };

        admin.messaging().send(message)
            .then(response => {
                res.send('Successfully sent message: ' + response);
            })
            .catch(error => {
                console.error('Error sending message:', error);
                res.status(500).send('Error sending message');
            });
    });

    app.listen(3000, () => {
        console.log('Server is running on port 3000');
    });

5. 푸시 알림 수신 테스트

모바일 앱과 서버를 설정한 후, 이제 푸시 알림 수신을 테스트해 보겠습니다. Android Studio에서 앱을 실행하고, 서버에 POST 요청을 보내 푸시 알림을 보냅니다. 사용자가 알림을 수신하면, 앱에서 설정한 NotificationChannel을 통해 해당 알림이 표시되어야 합니다.

6. 최적화 및 주의사항

푸시 알림을 서비스에 통합할 때, 다음과 같은 점을 염두에 두어야 합니다:

  • 사용자가 알림을 수신할 수 있도록 권한을 요청해야 합니다.
  • 푸시 알림의 콘텐츠가 의미 있고, 사용자가 원치 않는 정보를 받지 않도록 신경 써야 합니다.
  • 메시지 전송 시, 토큰 관리(예: 재등록) 등을 유의해야 합니다.

결론

이번 강좌에서는 Firebase Cloud Messaging(FCM)을 통해 서버에서 보내는 푸시 알림을 안드로이드 앱에서 수신하는 방법을 살펴보았습니다. FCM을 활용하면 사용자와 소통을 강화할 수 있으며, 앱 사용성을 높이는 데 큰 도움이 됩니다. 이 강좌를 통해 배운 내용을 기반으로 더욱 발전된 애플리케이션을 개발해 보시기 바랍니다.