작성일: 2026년 4월 7일 진행 단계: Phase 8 (테스트 및 버그 수정) — 계속 이전 일지: Day 10 (Weekly 스케줄 수정, 히스토리 날짜 상세, 히스토리 동기화)
| 작업 | 내용 | 상태 |
|---|---|---|
| FCM 연동 | Firebase Admin SDK 설정 및 FCM 전송 구현 | ✅ 완료 |
| 포그라운드 푸시 알림 | FCM 수신 후 액션 버튼이 있는 로컬 알림 표시 | ✅ 완료 |
| 백그라운드 푸시 알림 | 백그라운드 isolate 핸들러 + 로컬 알림 + 액션 버튼 | ✅ 완료 |
| 알림 액션 버튼 | 복용 ✓ / 건너뜀 ✗ 버튼 → API 호출 + UI 갱신 | ✅ 완료 |
| Undo 기능 | DELETE /dose/undo 엔드포인트 + 프론트 연동 | ✅ 완료 |
| 약 편집 주기 타입 수정 | cycleType을 활성 스케줄에서만 파싱 | ✅ 완료 |
| 비활성 스케줄 정리 | dose_logs 참조 없는 스케줄 하드 삭제 | ✅ 완료 |
| DB 초기화 | 테스트 약 및 데이터 삭제 | ✅ 완료 |
firebase-admin 패키지 설치 후 서비스 계정 키로 초기화:
if not firebase_admin._apps:
cred = credentials.Certificate(settings.FIREBASE_CREDENTIALS_PATH)
firebase_admin.initialize_app(cred)
절대 경로 하드코딩 없이 pathlib + .env 방식으로 경로 관리.
_send_fcm() 구현Flutter가 액션 버튼과 함께 알림을 직접 표시할 수 있도록 data-only FCM 메시지 전송:
message = messaging.Message(
data={
'schedule_id': schedule_id,
'log_date': datetime.now(timezone.utc).strftime('%Y-%m-%d'),
'medication_name': medication_name,
'type': 'medication_reminder',
},
android=messaging.AndroidConfig(priority='high'),
token=token,
)
핵심 결정: notification 필드 없음 (data-only) → Android가 시스템 알림을 직접 표시하지 않아 Flutter가 액션 버튼이 있는 커스텀 로컬 알림을 표시 가능.
FcmService._handleForegroundMessage가 FCM 데이터를 복용 ✓ / 건너뜀 ✗ 버튼이 있는 로컬 알림으로 변환:
static Future<void> _handleForegroundMessage(RemoteMessage message) async {
await _showNotificationFromData(
_localNotifications,
message.data,
message.hashCode,
);
}
포그라운드/백그라운드 핸들러 중복 제거를 위해 _showNotificationFromData를 공통 헬퍼로 분리.