배경

가전기기(세탁기·건조기 등) 이벤트를 앱으로 알려주는 push는 원래 token 방식이었음. DB(push_tkn 컬럼)에 저장된 토큰 1개로만 보내기 때문에 마지막에 로그인한 기기 1대만 알림을 받음. 세대원이 여러 명이거나 한 사람이 폰 2대를 쓰면 나머지는 알림을 못 받음.

2026-06-29에 topic 방식으로 바꾸기로 결정함.

token 방식 (변경 전)topic 방식 (변경 후)
발송 기준DB에 저장된 토큰 1개해당 topic을 구독 중인 모든 기기
다중 기기안 됨 (마지막 로그인 기기만)됨 (구독한 모든 기기)
서버 DB 의존push_tkn 컬럼 필요불필요

변경 내용

발송 흐름

세탁기 완료
→ LG 서버
→ MAW webhook 수신 (/maw/v1/web/callback/lge)
→ MAW가 APW 호출 (topic 방식)
→ APW가 Firebase 호출
→ Firebase가 해당 topic 구독한 모든 기기에 발송
→ 앱 수신

구독 시점

  • 기기 등록 / 알림 켜기 → FCM topic 구독
  • 기기 삭제 / 알림 끄기 → FCM topic 해제
  • 세탁기·건조기만 구독/해제함.

topic 이름은 IOT_LG_[기기타입] 형식임 (IOT_LG_WASHER, IOT_LG_DRYER). 세대원이 A, B 두 명이면 MAW가 APW를 2번 호출하고, Firebase가 각 topic 구독자에게 보냄.

배포 시 주의

  1. 서버와 앱을 같이 배포해야 함. 서버만 먼저 나가면 아무도 topic을 구독하지 못해 알림이 전혀 가지 않음.
  2. 이미 기기를 등록해 둔 사용자는 새 topic을 자동으로 구독하지 않음. 기존 등록 기기를 일괄로 topic 구독시켜야 함.
  3. 앱 알림 설정 화면에 세탁기·건조기 항목을 추가함.

알림이 안 갈 때 보는 곳

테이블내용
tb_smah_hmapp_api_rq_l앱 API 요청 이력
tb_push_sndg_lpush 발송 이력
TB_RVC_CONT_L로봇청소기 제어 내역

2026-09-10 사례: 세탁기가 등록되어 있는데 tb_smah_hmapp_api_rq_l에도 tb_push_sndg_l에도 이력이 없었음. 확인해 보니 topic 방식 적용 전에 등록된 기기라 push 구독이 되어 있지 않았음. 위 2번 항목과 같은 원인임.

2026-08-18 로봇청소기 건도 TB_RVC_CONT_L에 제어 내역(homing, start)은 남아 있는데 push는 가지 않은 경우임. 제어 내역이 있는데 알림이 없으면 구독 상태를 먼저 봄.

앱 쪽 동작

FCM 토큰은 로그인할 때만 올라감

앱은 로그인 요청에 FCM 토큰을 함께 실어 보냄. 토큰만 따로 등록하는 API가 없음. → 토큰이 만료·재발급되면 다시 로그인해야 갱신됨. “예전엔 왔는데 언젠가부터 안 온다”는 문의는 재로그인으로 풀리는 경우가 많음.

구독하는 토픽

로그인 성공 시 기존 토픽을 해제하고 아래를 다시 구독함. 메인 화면들도 진입할 때마다 저장된 토픽과 현재 회원 정보를 비교해 달라졌으면 재구독함(전입·전출 시 자동 정리되는 경로임).

구분토픽
회원 소속세대·단지·시군구·관리사무소 ID
전체ALL_USERS
환경운영 빌드 PRD / 개발 빌드 DEV
공통알림SYS_ANNC 시스템공지, SBD_ANNC 단지공지
우리집제어IOT_LMP 조명, IOT_HTN 난방, IOT_VN 환기, IOT_PRVNTN 방범
아파트관리HSH_MNGEXP 관리비, HSH_RFE 임대료, HSH_EV 전기차, HSH_CAREL 차량입출차, SBD_VT 전자투표
헬스케어HC_TKMDCN 복약 관리
에너지ENGCNS_AMUSOV 목표 초과, ENGCNS_ATDR_GOO AUTO DR
기타HSH_NSBA_1·HSH_NSBA_2 층간소음
LG 가전IOT_LG_WASHER, IOT_LG_DRYER — 해당 가전이 등록됐을 때만

가스·외출·방문·체중·혈압 토픽은 코드에 있으나 주석 처리돼 화면에 안 뜸.

알림을 누르면 가는 화면

푸시 데이터의 screenId 값으로 이동 화면이 정해짐. 목록에 없는 값이면 즐겨찾기 화면으로 감.

screenId화면screenId화면
UI-121-200조명UI-122-300 / UI-122-330전자투표
UI-121-310 / UI-121-320난방UI-122-410차량 충전
UI-121-500환기UI-122-500입출차
UI-122-100관리비UI-123-120복약
UI-122-200임대료UI-123-220체중
UI-125-100내 정보UI-123-310혈압
UI-126-100공지사항UI-124-200에너지 목표
UI-120-000층간소음UI-124-400AUTO DR
UI-000-000(특수) 토큰 갱신 후 메인 재진입

알림을 눌렀는데 즐겨찾기로 간다면 screenId가 위 목록에 없는 값임. 서버 알림 템플릿 문제임.

그 밖에

  • 알림에 이미지 URL이 있으면 큰 이미지 알림으로 뜸. 층간소음 알림만 서버에서 안 받고 앱 내장 이미지를 씀.
  • iOS는 APNS 토큰이 준비되기 전에는 토픽 구독이 실패함. 앱이 최대 3회 재확인 후 조용히 건너뜀.
  • 백그라운드에서 푸시를 받으면 플래그를 남기고, 앱이 포그라운드로 돌아올 때 토큰을 갱신한 뒤 메인을 다시 그림.

푸시가 안 온다는 문의에서 볼 것

  1. 앱 알림 설정에서 해당 토픽이 꺼져 있는지
  2. 로그인한 지 오래돼 FCM 토큰이 만료됐는지 → 재로그인
  3. iOS인데 APNS 미준비로 구독이 스킵됐는지 → 앱 재실행 후 재로그인
  4. 개발 빌드(DEV 토픽)를 깔고 있는지공개노트/개발/모듈/앱 구조와 보안
  5. 위 서버 쪽 확인(구독 이력·발송 이력)

서버 발송 규칙 (APW)

내부 WAS가 APW POST /api/smh/push를 호출하면 APW가 FCM으로 보냄. 서버 구조는 공개노트/개발/모듈/APW 연계 서버.

발송 유형

전송 유형조건FCM 호출
topic토픽 1개단일 토픽
topic토픽 2~4개'A' in topics && 'B' in topics 조건식
token토큰 1개단일 토큰
token토큰 2개 이상단일 토큰으로 쪼개 건건이 발송

토픽 배열 규칙

["수신대상 유형", "대상 ID", "구독 주제"] 순서. 예: ["SBD","C02726","SYS_ANNC"], ["HSH","C0272600010124","HSH_EV"].

  • 유형은 ALL / SBD(단지) / HSH(세대) / FO / SGG. SBD면 단지 ID가 cmn.tb_smah_sbd_d에, HSH면 세대 ID가 cmn.tb_hsh_m에 있어야 함. 없으면 5027
  • 토픽은 최대 4개. 5개 이상이면 5028(FCM 조건식 제약)
  • 운영은 'PRD' in topics, 개발은 'DEV' in topics가 조건식 앞에 자동으로 붙음. 개발 서버 푸시는 개발 빌드 앱에만 감
  • 운영이 아니고 notification.receiver.ids가 설정돼 있으면 수신자가 그 계정으로 바뀜(오발송 방지)

토큰 발송

  • 멀티캐스트는 한 번에 25개씩 끊어 보냄. 발송 이력 cmn.tb_push_sndg_l.rcvr_key_list가 varchar(4096)이라 토큰 155자 × 25개 제한
  • FCM에 등록되지 않은 토큰은 자동 삭제하지 않음. 로그 fcm에 등록되지 않은 토큰입니다. [토큰] 토큰 현행화가 필요합니다. → 앱 재로그인으로만 갱신됨
  • 부분 실패는 응답 문자열에 Sended Fail: {token}:{exception}로 누적됨

응답 코드

2000 성공 / 5026 발송 실패 / 5027 잘못된 파라미터 / 5028 토픽 개수 초과.

홈넷 이벤트(입출차·층간소음·에너지 초과)의 발송 방식은 공개노트/기능/홈넷 이벤트 알림.

알림센터 (앱 화면)

앱의 알림센터는 별도 저장소가 아니라 발송 이력 테이블(cmn.tb_push_sndg_l)을 그대로 읽어 보여줌. MAW GET /maw/v1/common/notification이 내 단지·세대·사용자로 발송된 건을 돌려줌. 공개노트/개발/모듈/MAW 앱 API 서버

  • 발송 이력이 없으면 알림센터도 비어 있음. “폰에 알림은 왔는데 알림센터에 없다”면 발송 이력이 안 남은 것이고, “알림센터에는 있는데 폰에 안 왔다”면 구독·토큰 문제임. 이 둘을 가르는 것이 첫 단계임
  • 로그아웃하면 푸시 토큰이 지워짐. 다시 로그인해야 토큰 발송분이 다시 감

복약 알림은 SCW 스케줄러가 APW에 발송을 요청함. 구 버전 클래스와 현재 클래스가 같은 스케줄 이름을 써서 둘 다 켜면 중복 발송됨. 공개노트/개발/모듈/SCW 스케줄러 서버

앱 서버(MAW)는 복약 알림을 보내지 않음(2026-09-18 확인). MAW에는 스케줄러 자체가 없고 약 등록·복약 기록만 저장함. 그래서 “복약 알림이 안 와요”는 앱 서버 로그로 확인할 수 없고 ① 앱 알림 설정의 복약 토픽(HC_TKMDCN) ② SCW 복약 알림 스케줄 실행 이력 ③ 발송 이력 순으로 봄. 공개노트/기능/헬스케어

비상호출도 MAW는 관제(APW)에 이벤트를 올리기만 함. 실제 알림·출동은 관제 쪽이고 MAW 로그에는 호출 사실만 남음. 응답을 못 받으면 관제에는 전달됐는데 앱에는 실패로 보일 수 있음.

전입 승인 알림은 푸시 토큰이 없으면 조용히 건너뜀. 승인은 성공했는데 알림만 안 간 경우이고 관리자 화면에는 그 사실이 표시되지 않음. 공개노트/기능/로그인과 세대 승인

확인 방법

개발 서버에서 테스트하는 순서.

  1. 개발 서버에 배포하고 앱도 수정본을 배포함.
  2. Postman으로 LG webhook인 것처럼 /maw/v1/web/callback/lge에 요청을 보냄.
  3. 폰에 알림이 오는지 확인함.
  4. 안 오면 tb_push_sndg_l에 발송 이력이 남았는지 봄. 이력이 없으면 구독 문제, 이력이 있는데 안 오면 앱·Firebase 쪽 문제임.

관련