안드로이드 앱 개발에서 서버와의 통신은 매우 중요한 요소이며, 특히 서버에서 클라이언트에게 정보를 전달하는 기능은 사용자 경험을 크게 향상시킬 수 있습니다. 이번 강좌에서는 자바를 활용하여 안드로이드 앱에서 서버에서 보내는 알림을 받는 방법에 대해 자세히 설명하겠습니다. 이 과정에서는 FCM(Firebase Cloud Messaging)을 이용한 푸시 알림 기능을 구현할 것입니다.
1. FCM(Firebase Cloud Messaging) 소개
FCM은 Google에서 제공하는 서비스로, 안드로이드, iOS 및 웹 애플리케이션에 푸시 알림을 전달하는 데 사용됩니다. 이 서비스를 통해 개발자는 사용자가 앱을 실행 중이 아닐 때도 정보를 전송할 수 있습니다. FCM은 사용하기 간편하고 다양한 기능을 제공하기 때문에 많은 앱에서 사용되고 있습니다.
2. FCM 설정하기
2.1. Firebase 프로젝트 생성
FCM을 사용하기 위해 먼저 Firebase 프로젝트를 생성해야 합니다.
- Firebase 콘솔(https://console.firebase.google.com/)에 로그인합니다.
- 새 프로젝트를 만들고, 프로젝트 이름을 입력합니다.
- Google 애널리틱스 등의 추가 옵션을 설정한 후 프로젝트를 생성합니다.
2.2. 안드로이드 앱 등록
프로젝트가 생성되면, 안드로이드 앱을 Firebase 프로젝트에 등록합니다.
- Firebase 콘솔의 프로젝트 설정으로 이동합니다.
- 안드로이드 아이콘을 클릭하여 앱을 등록합니다.
- 앱의 패키지 이름을 입력하고, SHA-1 인증서 지문도 추가합니다. (디버그 및 릴리즈 인증서 모두)
- 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의 기능을 다룰 예정이니 많은 관심 부탁드립니다. 감사합니다!