작성일: 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 초기화 테스트 약 및 데이터 삭제 ✅ 완료

1. FCM 연동

Firebase Admin SDK 설정

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가 액션 버튼이 있는 커스텀 로컬 알림을 표시 가능.


2. 포그라운드 푸시 알림

FcmService._handleForegroundMessage가 FCM 데이터를 복용 ✓ / 건너뜀 ✗ 버튼이 있는 로컬 알림으로 변환:

static Future<void> _handleForegroundMessage(RemoteMessage message) async {
  await _showNotificationFromData(
    _localNotifications,
    message.data,
    message.hashCode,
  );
}

포그라운드/백그라운드 핸들러 중복 제거를 위해 _showNotificationFromData를 공통 헬퍼로 분리.