앱에서 PUSH 알림을 보내는 핵심 기술 이해하기
앱을 만들다 보면 사용자에게 알림을 보내야 하는 경우가 많습니다.
예를 들어 다음과 같은 상황입니다.
- 새로운 메시지가 도착했을 때
- 주문 상태가 변경되었을 때
- 가족이나 지인이 현재 위치를 보냈을 때
- 서버에서 중요한 공지를 보내야 할 때
- 앱을 실행하지 않아도 알림을 받아야 할 때
이런 기능을 구현할 때 많이 사용하는 기술이 바로 FCM입니다.
FCM은 Firebase Cloud Messaging의 약자입니다.
Google Firebase에서 제공하는 메시지 전송 서비스이며, Android, iOS, Web 앱에 PUSH 알림이나 데이터 메시지를 보낼 수 있습니다.

1. FCM을 쉽게 설명하면?
FCM은 서버와 앱 사이에서 알림 메시지를 전달해 주는 중간 전달자 역할을 합니다.
일반적으로 앱이 꺼져 있거나 백그라운드 상태일 때 서버가 직접 앱으로 메시지를 보내기는 어렵습니다.
이때 서버는 FCM에 메시지를 전달하고, FCM은 해당 사용자의 휴대폰으로 PUSH 알림을 전달합니다.
구조를 간단히 표현하면 다음과 같습니다.
앱 사용자 → 앱 설치 및 FCM 토큰 생성
앱 → 서버에 FCM 토큰 등록
서버 → FCM으로 메시지 발송 요청
FCM → 대상 휴대폰으로 PUSH 전달
휴대폰 → 알림 표시 또는 앱 내부 처리
즉, FCM은 서버가 특정 앱 사용자에게 알림을 보낼 수 있도록 연결해 주는 Google의 메시징 서비스라고 보면 됩니다.
2. 왜 FCM이 필요한가?
모바일 앱은 항상 실행 중인 것이 아닙니다.
사용자가 앱을 닫았거나, 화면이 꺼져 있거나, 백그라운드 상태일 수 있습니다.
이런 상태에서도 중요한 정보를 전달하려면 PUSH 알림 기술이 필요합니다.
FCM을 사용하면 다음과 같은 기능을 구현할 수 있습니다.
- 앱이 꺼져 있어도 알림 수신
- 특정 사용자에게만 알림 전송
- 여러 사용자에게 동시에 알림 전송
- 공지사항 일괄 발송
- 앱 내부 데이터 전달
- 메시지 우선순위 설정
- 알림 제목, 내용, 소리, 만료 시간 설정
Firebase 공식 설명에서도 FCM은 알림 메시지를 즉시 또는 예약해서 전달하고, 커스텀 데이터와 우선순위, 소리, 만료 시간 등을 설정할 수 있는 메시징 기능을 제공합니다.
3. FCM의 핵심 개념
FCM을 이해하려면 몇 가지 핵심 개념을 알아야 합니다.
4. FCM 토큰이란?
FCM에서 가장 중요한 개념 중 하나가 Registration Token, 즉 FCM 등록 토큰입니다.
앱이 설치되고 처음 실행되면 FCM SDK가 해당 앱 인스턴스에 대한 등록 토큰을 생성합니다. 이 토큰은 특정 휴대폰의 특정 앱 설치본을 식별하는 값입니다.
쉽게 말하면 다음과 같습니다.
FCM 토큰 = 이 휴대폰의 이 앱으로 알림을 보내기 위한 주소
서버는 이 토큰을 저장해 두었다가 알림을 보낼 때 사용합니다.
예를 들어 나여기있어 앱에서 A 사용자가 B 사용자에게 상태와 위치를 보내는 경우를 생각해 보면 다음과 같습니다.
1. B 사용자의 앱이 FCM 토큰을 서버에 등록
2. A 사용자가 상태와 위치 전송
3. 서버가 B 사용자의 FCM 토큰 조회
4. 서버가 FCM에 PUSH 발송 요청
5. B 사용자의 휴대폰에 알림 도착
5. FCM 토큰은 변할 수 있다
FCM 토큰은 한 번 생성되면 영원히 고정되는 값이 아닙니다.
Firebase 공식 문서에서는 앱을 특정 인스턴스에 보내려면 FirebaseMessagingService에서 onNewToken을 처리하고, 토큰은 변경될 수 있으므로 최신 토큰을 가져오는 것을 권장합니다.
토큰이 바뀔 수 있는 대표적인 경우는 다음과 같습니다.
- 앱을 새로 설치한 경우
- 앱 데이터를 삭제한 경우
- 새 기기로 변경한 경우
- Firebase 내부 정책에 따라 토큰이 갱신된 경우
- 보안 또는 환경 변경으로 토큰이 재발급된 경우
따라서 앱에서는 토큰을 한 번만 저장하는 것이 아니라, 최신 토큰이 발급될 때마다 서버에 다시 등록하는 구조가 필요합니다.
6. Notification Message와 Data Message
FCM 메시지는 크게 두 가지로 구분할 수 있습니다.
Firebase 공식 문서에서는 FCM 메시지를 Notification Message와 Data Message로 나눕니다. Notification Message는 FCM SDK가 자동으로 처리하는 표시용 메시지이고, Data Message는 클라이언트 앱이 직접 처리하는 메시지입니다.
7. Notification Message
Notification Message는 제목과 내용을 포함한 일반적인 알림 메시지입니다.
예를 들어 다음과 같은 형태입니다.
{
"title": "나여기있어",
"body": "상대방이 현재 위치를 보냈습니다."
}
앱이 백그라운드에 있을 때는 Android 시스템이 자동으로 알림을 표시할 수 있습니다.
장점은 구현이 비교적 간단하다는 것입니다.
하지만 앱 내부에서 세밀하게 처리해야 하는 경우에는 한계가 있을 수 있습니다.
8. Data Message
Data Message는 앱이 직접 처리할 데이터를 담아 보내는 방식입니다.
예를 들면 다음과 같은 데이터가 포함될 수 있습니다.
{
"status": "좋음",
"message": "나 여기있어",
"latitude": "35.2271",
"longitude": "128.6811",
"senderName": "가족"
}
이 방식은 앱에서 직접 데이터를 읽고 처리할 수 있습니다.
예를 들어 나여기있어 앱에서는 PUSH 수신 시 다음과 같은 처리를 할 수 있습니다.
- 수신 목록에 저장
- 상태값 표시
- 메시지 표시
- 위도/경도 저장
- 지도 화면에서 위치 표시
- 중복 메시지 여부 확인
따라서 단순 알림만 필요한 경우에는 Notification Message가 적합하고, 앱 내부 로직과 연동해야 하는 경우에는 Data Message가 더 적합합니다.
9. FCM 동작 흐름
FCM의 전체 동작 흐름을 조금 더 자세히 보면 다음과 같습니다.
1. 사용자가 앱 설치
2. 앱 실행 시 FCM SDK 초기화
3. FCM 등록 토큰 생성
4. 앱이 토큰을 서버에 전달
5. 서버가 사용자 정보와 토큰 저장
6. 특정 이벤트 발생
7. 서버가 대상 사용자의 토큰 조회
8. 서버가 FCM API로 메시지 발송 요청
9. FCM이 대상 기기로 메시지 전달
10. 앱 또는 Android 시스템이 메시지 처리
이 구조에서 중요한 것은 서버가 토큰을 정확하게 관리해야 한다는 점입니다.
토큰이 오래되었거나 잘못 저장되어 있으면 알림이 도착하지 않을 수 있습니다.
10. 서버에서 해야 할 일
FCM을 제대로 사용하려면 서버 역할이 중요합니다.
서버는 단순히 메시지를 보내는 것뿐 아니라, 토큰과 수신 대상 정보를 관리해야 합니다.
서버에서 처리해야 할 주요 작업은 다음과 같습니다.
- 사용자 또는 기기별 FCM 토큰 저장
- 토큰 갱신 시 최신값 반영
- 알림 발송 대상 조회
- 중복 대상 제거
- FCM API 호출
- 발송 성공/실패 결과 저장
- 만료되거나 잘못된 토큰 정리
- 재시도 또는 실패 로그 관리
Firebase 공식 문서도 비활성 기기의 오래된 등록 토큰으로 메시지를 보내면 리소스 낭비와 부정확한 전달률 보고로 이어질 수 있으므로, 등록 토큰을 효율적으로 관리하는 것이 중요하다고 설명합니다.
11. 앱에서 해야 할 일
앱에서는 FCM 토큰을 생성하고 서버에 등록해야 합니다.
또한 PUSH 메시지를 수신했을 때 어떤 동작을 할지도 구현해야 합니다.
앱에서 처리해야 할 주요 작업은 다음과 같습니다.
- FCM SDK 설정
- 알림 권한 요청
- FCM 토큰 조회
- 토큰 갱신 이벤트 처리
- 서버에 토큰 등록
- PUSH 수신 처리
- 백그라운드/포그라운드 상태별 처리
- 알림 클릭 시 화면 이동
- 수신 데이터 저장
- 중복 메시지 방지
Android 13 이상에서는 알림 표시를 위해 POST_NOTIFICATIONS 권한 처리가 필요할 수 있으므로 앱 권한 처리도 함께 고려해야 합니다.
12. 중복 PUSH가 발생하는 이유
앱을 개발하다 보면 같은 알림이 두 번 이상 도착하는 경우가 있습니다.
대표적인 원인은 다음과 같습니다.
1. 같은 기기가 여러 번 등록된 경우
앱을 재설치하거나 토큰이 갱신되었는데 서버에서 기존 토큰을 정리하지 않으면 같은 사용자에게 여러 토큰이 남을 수 있습니다.
이 경우 서버가 모든 토큰으로 알림을 보내면서 같은 휴대폰에 중복 알림이 도착할 수 있습니다.
2. 연결 정보가 중복된 경우
예를 들어 A와 B가 서로 QR을 만들어 연결하고, 다시 상대 QR을 읽어서 연결하면 서버에는 연결 이력이 여러 건 생길 수 있습니다.
이때 발송 대상 조회에서 중복 제거를 하지 않으면 같은 상대에게 여러 번 PUSH가 발송될 수 있습니다.
3. Notification과 Data를 동시에 처리하는 경우
Notification Message는 시스템이 자동으로 표시하고, 앱에서도 Data Message를 받아 직접 알림을 만들면 중복으로 보일 수 있습니다.
4. 앱 수신 처리에서 중복 저장한 경우
서버에서는 한 번만 보냈더라도 앱에서 같은 메시지를 여러 번 저장하면 수신 목록에 중복으로 보일 수 있습니다.
13. 중복 PUSH 방지 방법
중복 PUSH를 막으려면 서버와 앱 양쪽에서 처리해야 합니다.
서버에서는 다음과 같은 처리가 필요합니다.
- 수신 대상 device_id 기준 중복 제거
- 동일 FCM 토큰 기준 중복 제거
- 같은 상대와 여러 번 연결된 경우 최신 연결 1건만 사용
- 실패하거나 만료된 토큰 정리
- 발송 로그 저장 후 중복 발송 방지
앱에서는 다음과 같은 처리가 필요합니다.
- 메시지 고유 ID 기준 중복 수신 방지
- 이미 저장된 수신 로그인지 확인
- 같은 PUSH가 재전달되어도 목록에는 1건만 저장
- 알림 클릭 이벤트 중복 처리 방지
나여기있어 앱에서는 이런 문제를 줄이기 위해 서버에서 발송 대상을 중복 제거하고, 앱에서도 수신 로그 ID 기준으로 중복 저장을 방지하는 구조를 적용했습니다.
14. FCM과 위치 기반 앱
위치 기반 앱에서 FCM은 특히 유용합니다.
예를 들어 나여기있어 같은 앱에서는 사용자가 상태와 위치를 보낼 때 상대방에게 즉시 알려야 합니다.
이때 서버는 상태, 메시지, 위도, 경도 정보를 받아 FCM으로 상대방에게 전달합니다.
동작 구조는 다음과 같습니다.
1. 사용자가 “나 여기있어” 버튼 클릭
2. 앱이 현재 GPS 위치 조회
3. 상태, 메시지, 위도, 경도를 서버로 전송
4. 서버가 연결된 상대 폰 조회
5. 서버가 중복 대상을 제거
6. FCM으로 PUSH 발송
7. 상대방 폰에서 알림 수신
8. 앱에서 수신 내용을 저장
9. 지도에서 위치 확인
이런 구조를 사용하면 앱이 실행 중이 아니더라도 상대방이 상태와 위치 알림을 받을 수 있습니다.
15. FCM 사용 시 주의할 점
FCM은 매우 편리하지만, 몇 가지 주의해야 할 점이 있습니다.
1. 개인정보를 과도하게 넣지 않기
PUSH 메시지에는 민감한 개인정보를 과도하게 넣지 않는 것이 좋습니다.
상태, 위치, 이름, 전화번호 같은 정보는 앱의 성격에 따라 민감할 수 있습니다.
특히 잠금화면에 알림 내용이 표시될 수 있으므로, 알림 본문에는 최소한의 정보만 표시하고 상세 정보는 앱 내부에서 확인하도록 설계하는 것이 안전합니다.
2. 토큰을 최신 상태로 유지하기
FCM 토큰은 변경될 수 있으므로 최신 토큰을 서버에 저장해야 합니다.
오래된 토큰이 많아지면 발송 실패가 늘어나고, 불필요한 서버 요청도 증가합니다.
3. 중복 발송 방지하기
동일 사용자, 동일 기기, 동일 토큰에 대해 중복으로 발송하지 않도록 서버에서 대상 목록을 정리해야 합니다.
4. 알림 권한 처리하기
Android 최신 버전에서는 알림 권한을 사용자가 허용해야 알림이 정상 표시됩니다.
앱 설치 후 권한 안내를 자연스럽게 제공하는 것이 좋습니다.
5. 실패 로그를 관리하기
FCM 발송이 항상 성공하는 것은 아닙니다.
토큰 만료, 네트워크 오류, 권한 문제, 기기 상태 등에 따라 실패할 수 있습니다.
따라서 서버에는 발송 성공/실패 로그를 남기고, 반복 실패하는 토큰은 정리하는 구조가 필요합니다.
16. FCM을 적용하면 좋은 앱
FCM은 다음과 같은 앱에 특히 유용합니다.
- 메신저 앱
- 배달/주문 앱
- 예약 관리 앱
- 위치 공유 앱
- 보호자 알림 앱
- 공지사항 앱
- 제조 현장 알림 앱
- 설비 이상 알림 앱
- MES/ERP 업무 알림 앱
특히 제조 현장에서는 설비 이상, 생산 지시, 품질 이슈, 긴급 승인 요청 등을 실시간으로 전달하는 데 활용할 수 있습니다.
17. FCM의 장점
FCM의 장점은 다음과 같습니다.
- Google Firebase 기반으로 안정적
- Android 앱과 연동이 좋음
- 특정 기기, 그룹, 토픽 대상 발송 가능
- Notification/Data 메시지 지원
- 앱이 백그라운드여도 알림 수신 가능
- 서버 API를 통해 자동 발송 가능
- 다양한 앱 서비스에 적용 가능
18. FCM의 한계
FCM은 편리하지만 모든 것을 보장하는 실시간 메시징 시스템은 아닙니다.
다음과 같은 한계도 고려해야 합니다.
- 네트워크 상태에 따라 지연 가능
- 기기 절전 모드 영향 가능
- 사용자가 알림 권한을 거부하면 표시 제한
- 토큰 관리가 부실하면 발송 실패 증가
- 민감 정보 전송 시 보안 설계 필요
- 동일 메시지 중복 처리 로직 필요
따라서 FCM은 “즉시 전달을 시도하는 PUSH 알림 시스템”으로 이해하는 것이 좋습니다.
정말 중요한 데이터는 서버에 저장하고, PUSH는 사용자에게 “새로운 내용이 있으니 앱에서 확인하세요”라고 알려주는 방식으로 설계하는 것이 안전합니다.
19. 실제 개발 시 권장 구조
실제 앱에서 FCM을 안정적으로 사용하려면 다음 구조를 권장합니다.
앱
- FCM 토큰 발급
- 서버에 토큰 등록
- 토큰 갱신 시 서버 재등록
- PUSH 수신 처리
- 메시지 ID 기준 중복 방지
- 알림 클릭 시 상세 화면 이동
서버
- 사용자/기기/토큰 관리
- 대상 사용자 조회
- 중복 토큰 제거
- FCM API 발송
- 성공/실패 로그 저장
- 실패 토큰 정리
DB
- 사용자 정보
- 기기 정보
- FCM 토큰
- 발송 로그
- 수신 로그
- 연결 정보
이렇게 구성하면 단순 알림뿐 아니라 서비스 운영에 필요한 추적과 장애 대응도 가능해집니다.
20. 마무리
FCM은 모바일 앱에서 PUSH 알림을 구현할 때 매우 중요한 기술입니다.
앱이 실행 중이 아니더라도 사용자에게 정보를 전달할 수 있고, 서버와 앱을 연결하는 실시간 알림 구조를 만들 수 있습니다.
하지만 단순히 “알림 보내기” 기능만 구현해서는 충분하지 않습니다.
실제 서비스에서는 다음을 함께 고려해야 합니다.
- 토큰 관리
- 알림 권한
- 중복 발송 방지
- 실패 로그 관리
- 개인정보 보호
- 앱 상태별 수신 처리
- 서버와 DB 구조 설계
나여기있어 앱에서도 FCM을 이용해 상태와 위치 정보를 상대방에게 전달하고, 중복 PUSH 방지와 수신 로그 관리 기능을 함께 적용했습니다.
작은 앱이라도 PUSH 알림 구조를 제대로 설계하면 훨씬 안정적이고 신뢰할 수 있는 서비스가 될 수 있습니다.
조그만 기술로 세상을 이롭게.
'조그만 기술로 세상을 이롭게 > 나여기있어' 카테고리의 다른 글
| 나여기있어 앱, 구글 플레이스토어 정식 출시 안내 (0) | 2026.06.19 |
|---|---|
| 나여기있어 개발 기술 요약 (0) | 2026.06.16 |
| 나여기있어 앱, 프로덕션 출시 진행 중입니다 (0) | 2026.06.16 |
| Here & Safe: Preparing the Global Version of “Na Yeogi Isseo” (0) | 2026.06.15 |
| 나여기있어 영문판 준비 중입니다 (0) | 2026.06.15 |