최근 여러 개의 “어때 시리즈” 앱을 개발하면서 공통적으로 필요한 기능이 하나 생겼습니다.
바로 PUSH 알림 기능입니다.
예를 들어 고속도로어때 앱의 경우 ITS API 사용량 제한을 초과했을 때 사용자에게 안내 메시지를 보내거나, 미세먼지어때 앱에서는 API 점검 안내, 지도어때 앱에서는 업데이트 안내를 보낼 수 있습니다.
이번 글에서는 각 앱에서 FCM 토큰을 발급받고, 서버에서 앱별 토큰을 관리한 뒤, 관리 프로그램에서 원하는 앱과 대상을 선택해 PUSH 메시지를 발송하는 구조를 정리해보겠습니다.
1. PUSH 알림이 필요한 이유
앱을 운영하다 보면 사용자에게 알려야 할 상황이 자주 발생합니다.
예를 들면 다음과 같습니다.
- API 사용량 제한 초과 안내
- 공공데이터 서버 장애 안내
- 앱 업데이트 안내
- 신규 기능 추가 안내
- 서비스 점검 안내
- 특정 앱 사용자 대상 공지
- 테스트 사용자에게만 알림 발송
고속도로어때 앱의 경우 ITS API 제한량을 초과하면 CCTV 조회가 원활하지 않을 수 있습니다.
이때 앱을 실행한 사용자에게만 안내하는 것보다 PUSH 알림으로 미리 알려주면 사용자 불편을 줄일 수 있습니다.
2. 기본 구조
PUSH 알림 구조는 어렵게 생각할 필요가 없습니다.
핵심은 다음과 같습니다.
각 어때 앱
→ FCM 토큰 발급
→ 내 서버로 토큰 전송
→ 서버 DB에 앱별 토큰 저장
→ 관리 프로그램에서 앱 선택
→ 제목과 내용 입력
→ 전체 또는 선택 사용자에게 PUSH 발송
→ 사용자 휴대폰에서 알림 수신
즉, 앱은 자신의 FCM 토큰을 서버에 등록하고, 실제 PUSH 발송은 서버 또는 관리 프로그램에서 처리합니다.
3. 앱별 토큰 관리 방식
어때 시리즈 앱이 여러 개라면 앱별로 토큰을 구분해서 저장해야 합니다.
예를 들면 다음과 같습니다.
eits 고속도로어때
eair 미세먼지어때
emap 지도어때
ebusstop 버스정류소어때
ecctv 국도어때
embti 성격어때
앱에서 서버로 토큰을 보낼 때 appCode 값을 함께 보내면 서버는 어떤 앱의 토큰인지 구분할 수 있습니다.
예를 들어 고속도로어때 앱에서는 다음과 같이 보낼 수 있습니다.
{
"appCode": "eits",
"appName": "고속도로어때",
"userKey": "device-uuid",
"fcmToken": "FCM_TOKEN_VALUE",
"deviceName": "Galaxy S23",
"appVersion": "1.0.5",
"platform": "android"
}
4. 서버 DB 테이블 예시
서버에는 앱별 FCM 토큰을 저장하는 테이블이 필요합니다.
CREATE TABLE push_device (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
app_code VARCHAR(30) NOT NULL,
app_name VARCHAR(100) NOT NULL,
user_key VARCHAR(100),
fcm_token TEXT NOT NULL,
device_name VARCHAR(100),
app_version VARCHAR(30),
platform VARCHAR(20) DEFAULT 'android',
is_active TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
토큰이 중복 저장되지 않도록 FCM 토큰 기준으로 중복 체크를 하는 것이 좋습니다.
ALTER TABLE push_device
ADD UNIQUE KEY uq_fcm_token (fcm_token(255));
이렇게 하면 같은 기기에서 앱을 여러 번 실행해도 토큰이 중복 저장되는 문제를 줄일 수 있습니다.
5. 관리 프로그램 구성
관리 프로그램은 처음에는 단순하게 만들면 됩니다.
화면 구성 예시는 다음과 같습니다.
[PUSH 발송 관리]
앱 선택
[고속도로어때 ▼]
발송 대상
[전체 사용자] [선택 사용자]
제목
[고속도로어때 안내]
내용
[현재 ITS API 제한으로 CCTV 조회가 원활하지 않습니다.]
[발송하기]
토큰 목록은 다음과 같이 표시할 수 있습니다.
앱명 버전 기기명 최근등록일 선택
고속도로어때 1.0.5 Galaxy S23 2026-05-26 □
고속도로어때 1.0.4 Galaxy A32 2026-05-25 □
미세먼지어때 1.0.3 Galaxy S22 2026-05-24 □
이 구조라면 전체 발송도 가능하고, 특정 테스트 기기만 선택해서 발송하는 것도 가능합니다.
6. 발송 방식
PUSH 발송은 크게 두 가지 방식으로 나눌 수 있습니다.
1) 앱 전체 발송
고속도로어때 전체 사용자에게 알림을 보낼 때 사용합니다.
예를 들어 ITS API 제한 초과 안내는 특정 사용자에게만 필요한 것이 아니라 고속도로어때 사용자 전체에게 필요한 안내입니다.
SELECT fcm_token
FROM push_device
WHERE app_code = 'eits'
AND is_active = 1;
가져온 토큰 전체에 FCM PUSH를 발송하면 됩니다.
2) 선택 사용자 발송
관리 프로그램에서 특정 토큰만 선택해서 발송하는 방식입니다.
이 방식은 테스트할 때 유용합니다.
예를 들면 다음과 같습니다.
테스트 기기 1대에만 발송
관리자 휴대폰에만 발송
특정 앱 버전 사용자에게만 발송
7. 발송 이력 저장
PUSH 알림은 발송 이력을 남겨두는 것이 좋습니다.
언제, 어떤 앱에, 어떤 제목과 내용으로, 몇 명에게 발송했는지 기록해야 운영 관리가 편리합니다.
CREATE TABLE push_send_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
app_code VARCHAR(30),
title VARCHAR(200),
message TEXT,
target_type VARCHAR(30),
target_count INT DEFAULT 0,
success_count INT DEFAULT 0,
fail_count INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
이렇게 하면 나중에 공지 내역을 확인하거나, 장애 안내를 언제 보냈는지 추적할 수 있습니다.
8. 고속도로어때 적용 예시
고속도로어때 앱에서는 ITS API 제한 초과 상황에 PUSH 알림을 활용할 수 있습니다.
예를 들어 서버 또는 관리자가 ITS API 제한 초과를 확인하면 다음과 같은 알림을 보낼 수 있습니다.
제목: 고속도로어때 안내
내용:
현재 ITS API 사용량 제한으로 일부 CCTV 조회가 원활하지 않을 수 있습니다.
잠시 후 다시 이용해 주세요.
복구 후에는 다음과 같은 알림도 보낼 수 있습니다.
제목: 고속도로어때 정상화 안내
내용:
ITS API 사용 제한이 해제되어 CCTV 조회가 정상화되었습니다.
이렇게 하면 사용자는 앱 오류로 오해하지 않고, 현재 상황을 이해할 수 있습니다.
9. Flask 서버 기준 API 예시
앱에서 FCM 토큰을 등록하는 API는 다음과 같이 만들 수 있습니다.
@app.route("/api/push/register-token", methods=["POST"])
def register_token():
data = request.json
app_code = data.get("appCode")
app_name = data.get("appName")
user_key = data.get("userKey")
fcm_token = data.get("fcmToken")
device_name = data.get("deviceName")
app_version = data.get("appVersion")
platform = data.get("platform", "android")
save_or_update_token(
app_code,
app_name,
user_key,
fcm_token,
device_name,
app_version,
platform
)
return {"result": "ok"}
관리 프로그램에서 앱별 토큰을 조회하는 API는 다음과 같이 구성할 수 있습니다.
@app.route("/api/push/tokens", methods=["GET"])
def get_tokens():
app_code = request.args.get("appCode")
rows = select_tokens_by_app(app_code)
return {
"result": "ok",
"tokens": rows
}
PUSH 발송 API는 다음과 같이 구성할 수 있습니다.
@app.route("/api/push/send", methods=["POST"])
def send_push():
data = request.json
app_code = data.get("appCode")
title = data.get("title")
message = data.get("message")
target_type = data.get("targetType", "ALL")
token_ids = data.get("tokenIds", [])
if target_type == "ALL":
tokens = get_tokens_by_app(app_code)
else:
tokens = get_tokens_by_ids(token_ids)
result = send_fcm_to_tokens(tokens, title, message)
save_push_log(
app_code,
title,
message,
target_type,
len(tokens),
result["success"],
result["fail"]
)
return {
"result": "ok",
"success": result["success"],
"fail": result["fail"]
}
10. C# MAUI 앱에서 필요한 처리
각 어때 앱에서는 FCM 토큰을 발급받은 후 서버에 등록하면 됩니다.
앱마다 다음과 같이 앱 코드를 다르게 설정합니다.
고속도로어때:
public static class AppConfig
{
public const string AppCode = "eits";
public const string AppName = "고속도로어때";
}
미세먼지어때:
public static class AppConfig
{
public const string AppCode = "eair";
public const string AppName = "미세먼지어때";
}
지도어때:
public static class AppConfig
{
public const string AppCode = "emap";
public const string AppName = "지도어때";
}
이렇게 하면 여러 앱에서 동일한 서버 API를 사용하면서 앱별로 토큰을 구분할 수 있습니다.
11. 단계별 개발 방향
처음부터 자동 알림까지 모두 만들 필요는 없습니다.
다음 순서로 개발하면 안정적으로 확장할 수 있습니다.
1단계: 수동 PUSH 발송
앱에서 FCM 토큰 발급
서버에 토큰 저장
관리 프로그램에서 앱 선택
제목/내용 입력
전체 또는 선택 발송
발송 이력 저장
2단계: 장애 안내 자동화
서버가 ITS API 상태 확인
제한 초과 또는 장애 감지
고속도로어때 사용자에게 자동 PUSH 발송
복구 시 정상화 알림 발송
3단계: 앱별 맞춤 알림
고속도로어때: ITS API 제한 안내
미세먼지어때: 공공데이터 장애 안내
지도어때: 지도 API 오류 안내
버스정류소어때: 버스 API 오류 안내
공시어때: 관심기업 공시 알림
4단계: 사용자별 맞춤 알림
관심 지역 알림
관심 기업 공시 알림
관심 CCTV 상태 알림
관심 버스 노선 알림
12. 이 방식의 장점
앱별 FCM 토큰을 서버에서 관리하는 방식은 다음과 같은 장점이 있습니다.
구현이 단순하다
앱별 공지 발송이 가능하다
테스트 기기에만 발송할 수 있다
관리 프로그램에서 직접 발송할 수 있다
발송 이력을 관리할 수 있다
향후 자동 알림으로 확장하기 쉽다
여러 앱을 하나의 PUSH 플랫폼으로 관리할 수 있다
특히 어때 시리즈처럼 여러 앱을 운영하는 경우에는 공통 PUSH 서버를 만들어두면 이후 앱이 추가되어도 같은 구조를 그대로 사용할 수 있습니다.
13. 최종 구조 정리
최종 구조는 다음과 같습니다.
[각 어때 앱]
- FCM 토큰 발급
- appCode와 함께 서버로 토큰 전송
- PUSH 수신 처리
[서버]
- 앱별 토큰 저장
- 토큰 중복 관리
- 앱별 토큰 조회
- FCM PUSH 발송
- 발송 이력 저장
[관리 프로그램]
- 앱 선택
- 대상 선택
- 제목/내용 입력
- PUSH 발송
- 발송 결과 확인
마무리
어때 시리즈 앱에 PUSH 알림을 적용하려면 처음부터 복잡한 자동화 시스템을 만들기보다, 먼저 앱별 FCM 토큰을 서버에 저장하고 관리 프로그램에서 선택 발송하는 구조로 시작하는 것이 좋습니다.
이 방식은 구현이 쉽고, 운영자가 직접 필요한 시점에 알림을 보낼 수 있으며, 이후 API 장애 자동 감지나 관심정보 알림 같은 고급 기능으로 확장하기도 좋습니다.
고속도로어때의 ITS API 제한 초과 안내, 미세먼지어때의 공공데이터 오류 안내, 지도어때의 업데이트 안내처럼 여러 앱에 공통으로 활용할 수 있기 때문에 “어때 시리즈 공통 PUSH 알림 플랫폼”으로 발전시킬 수 있습니다.
'조그만 기술로 세상을 이롭게' 카테고리의 다른 글
| EPLUS Privacy Policy (0) | 2026.05.27 |
|---|---|
| EPLUS Privacy Policy (0) | 2026.05.27 |
| 공공데이터포털 DATA.GO.KR이란? (0) | 2026.05.24 |
| 구글플레이콘솔 비공개 테스트에서 프로덕션 출시까지 (0) | 2026.05.23 |
| 구글플레이스토어에서 앱이 업데이트가 안되는 경우에는!!! (0) | 2026.05.22 |