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

안드로이드 앱 개발에서 서버와의 통신은 매우 중요한 요소이며, 특히 서버에서 클라이언트에게 정보를 전달하는 기능은 사용자 경험을 크게 향상시킬 수 있습니다. 이번 강좌에서는 자바를 활용하여 안드로이드 앱에서 서버에서 보내는 알림을 받는 방법에 대해 자세히 설명하겠습니다. 이 과정에서는 FCM(Firebase Cloud Messaging)을 이용한 푸시 알림 기능을 구현할 것입니다.

1. FCM(Firebase Cloud Messaging) 소개

FCM은 Google에서 제공하는 서비스로, 안드로이드, iOS 및 웹 애플리케이션에 푸시 알림을 전달하는 데 사용됩니다. 이 서비스를 통해 개발자는 사용자가 앱을 실행 중이 아닐 때도 정보를 전송할 수 있습니다. FCM은 사용하기 간편하고 다양한 기능을 제공하기 때문에 많은 앱에서 사용되고 있습니다.

2. FCM 설정하기

2.1. Firebase 프로젝트 생성

FCM을 사용하기 위해 먼저 Firebase 프로젝트를 생성해야 합니다.

  1. Firebase 콘솔(https://console.firebase.google.com/)에 로그인합니다.
  2. 새 프로젝트를 만들고, 프로젝트 이름을 입력합니다.
  3. Google 애널리틱스 등의 추가 옵션을 설정한 후 프로젝트를 생성합니다.

2.2. 안드로이드 앱 등록

프로젝트가 생성되면, 안드로이드 앱을 Firebase 프로젝트에 등록합니다.

  1. Firebase 콘솔의 프로젝트 설정으로 이동합니다.
  2. 안드로이드 아이콘을 클릭하여 앱을 등록합니다.
  3. 앱의 패키지 이름을 입력하고, SHA-1 인증서 지문도 추가합니다. (디버그 및 릴리즈 인증서 모두)
  4. google-services.json 파일을 다운로드하여 안드로이드 프로젝트의 app 폴더에 배치합니다.

2.3. Gradle 설정

기본적인 의존성 설정을 위해 build.gradle 파일을 수정합니다.

dependencies {
    implementation 'com.google.firebase:firebase-messaging:23.0.0'
}

프로젝트 수준 build.gradle 파일에 Google 서비스 플러그인을 추가합니다.

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

2.4. AndroidManifest.xml 설정

Firebase에 필요한 권한을 AndroidManifest.xml 파일에 추가합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pushnotification">
    
    <application 
        ... >
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="default_channel">
        </meta-data>

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

3. 서버 코드 구현

서버에서 FCM을 사용하여 알림을 전송하기 위해, Firebase Admin SDK를 사용하는 Node.js 서버의 예제를 소개합니다.

3.1. Node.js 환경 설정

Node.js를 설치한 후, Firebase Admin SDK를 설치합니다.

npm install firebase-admin

3.2. 서버 코드 작성

const admin = require("firebase-admin");

// Firebase 서비스 계정 키 JSON 파일 경로
const serviceAccount = require("./path/to/serviceAccountKey.json");

// Firebase 초기화
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

// 알림 전송 함수
function sendNotification(token, message) {
    const payload = {
        notification: {
            title: message.title,
            body: message.body,
        },
    };

    admin
        .messaging()
        .sendToDevice(token, payload)
        .then((response) => {
            console.log("Successfully sent message:", response);
        })
        .catch((error) => {
            console.log("Error sending message:", error);
        });
}

// 클라이언트 디바이스의 토큰과 메시지 내용
const registrationToken = "디바이스의 등록 토큰";
const message = {
    title: "푸시 알림 제목",
    body: "푸시 알림 본문 내용입니다.",
};

// 알림 전송
sendNotification(registrationToken, message);

4. 안드로이드 클라이언트 구현

4.1. FirebaseMessagingService 확장

푸시 알림을 수신하기 위해 FirebaseMessagingService를 확장하는 클래스를 생성합니다.

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import android.util.Log;

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MyFirebaseMsgService";

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // 알림 수신 시 처리
        Log.d(TAG, "From: " + remoteMessage.getFrom());

        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
            // 알림을 표시하는 메서드 호출
            showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
        }
    }

    private void showNotification(String title, String messageBody) {
        // NotificationCompat.Builder를 사용하여 알림 표시
        // Notification 생성 및 표시 코드 구현
    }

    @Override
    public void onNewToken(String token) {
        Log.d(TAG, "Refreshed token: " + token);
        // 서버에 새로운 토큰을 전송하는 코드 구현
    }
}

4.2. Notification 표시

알림을 표시하기 위해 NotificationCompat.Builder를 사용하여 알림을 생성하고 표시하는 메서드를 구현합니다.

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;

private void showNotification(String title, String messageBody) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    String channelId = "default_channel";

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

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId)
            .setAutoCancel(true)
            .setContentTitle(title)
            .setContentText(messageBody)
            .setSmallIcon(R.drawable.ic_stat_ic_notification);

    notificationManager.notify(0, notificationBuilder.build());
}

5. 테스트 및 디버깅

모든 설정과 코드를 완료했다면 이제 실제 테스트를 진행해 볼 차례입니다. 서버를 실행하고, 등록 토큰을 이용하여 알림을 전송해 보세요. 클라이언트 앱에서 알림이 잘 수신되는지 확인합니다.

5.1. 알림 수신 확인

알림이 수신될 경우, 앱 상단에 푸시 알림이 나타나고, 알림을 클릭했을 때 특정 액티비티가 실행되는지 확인합니다.

5.2. 문제 해결

알림이 수신되지 않는 경우, 다음 사항을 점검해 보세요.

  • FCM 등록 토큰이 유효한지 확인합니다.
  • Firebase 프로젝트 설정이 올바르게 되어 있는지 점검합니다.
  • AndroidManifest.xml에 필요한 권한과 서비스가 추가되어 있는지 확인합니다.

6. 결론

이 강좌에서는 자바를 활용하여 안드로이드 앱에서 서버에서 보내는 알림을 받는 방법을 배웠습니다. Firebase Cloud Messaging을 활용하여 간편하게 푸시 알림을 구현할 수 있음을 확인했습니다. 실제 어플리케이션에 필요한 다양한 기능을 추가하여 확장할 수 있는 가능성에 대해 고민해 보시기 바랍니다.

향후에는 알림의 커스터마이징, 그룹화, 지연 전송 등 다양한 FCM의 기능을 다룰 예정이니 많은 관심 부탁드립니다. 감사합니다!