[P2] 알림 시스템 (Push/Email/Kakao)

ID: 73410efc-ec2b-4d9a-a4af-be0e0adcc9e7

보통 완료

## 개요
Web Push, 이메일, 카카오톡 알림 시스템

## 범위
- PushSubscription 모델: user_id, subscription(JSON), is_active, browser_info
- Web Push 구독/해제 (web-push gem, VAPID)
- 푸시 알림 발송
- Solid Queue로 CRON 알림 (시간별 대상자 조회 + 발송)
- Action Mailer 이메일 알림
- Solapi 카카오톡 알림 (선택적)
- 알림 설정 (방식, 시간)

## 완료 기준
- [ ] Web Push 구독/발송 동작
- [ ] Solid Queue CRON 예약 알림 동작
- [ ] 알림 설정 변경 동작
- [ ] 이메일 알림 발송 동작
- [ ] 통합 테스트 통과

## 참고
- 레거시: api/push/*.ts, api/notifications/cron/route.ts
- 기능 ID: N1-N4

첨부 이미지

이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)

JPEG, PNG, GIF, WebP / 최대 10MB

담당자: 팀리드
생성일: 2026년 03월 01일 12:28

활동 로그

  • 팀리드 팀 작업 완료 - [P2] 알림 시스템 (Push/Email/Kakao)

    2026년 03월 02일 05:13:29

    상세 보기

    ## 수정된 기능

    ### 1. 알림 기반 (notification-foundation)
    - `web-push` gem (v3.1.0) 설치
    - `PushSubscription` 모델 생성 (UUID PK, endpoint/p256dh/auth 개별 칼럼, unique index)
    - `user_settings.notification_methods` 칼럼 추가 (콤마 구분 문자열, default: "push")
    - `User` has_many :push_subscriptions 관계 설정
    - `UserSetting` 헬퍼 메서드 (push_enabled?, email_enabled?, kakao_enabled?)

    ### 2. 알림 백엔드 (notification-backend)
    - `PushSubscriptionsController` - POST /push/subscribe, GET /push/vapid_public_key, DELETE /push/unsubscribe
    - `NotificationService` - 웹 푸시 + 이메일 통합 발송 서비스
    - `NotificationCronJob` - 매 시간 알림 발송 체크 (Solid Queue recurring)
    - `NotificationMailer` + qt_reminder.html.erb 이메일 템플릿
    - `config/recurring.yml` - Solid Queue 스케줄 설정
    - routes.rb에 /push/* 라우트 추가

    ### 3. 알림 프론트엔드 (notification-frontend)
    - Service Worker (app/views/pwa/service-worker.js에 push/notificationclick 핸들러)
    - Stimulus `push_notification_controller` - 구독 등록/해제
    - Stimulus `service_worker_controller` - SW 자동 등록
    - Stimulus `notification_methods_controller` - 체크박스 → hidden input 연동
    - Settings UI에 알림 방식 선택 섹션 추가 (push/email/kakao 체크박스)

    ## 해결된 문제
    - web-push gem 빌드 시 openssl 의존성 → Docker에 libssl-dev 추가
    - public/service-worker.js와 app/views/pwa/service-worker.js 충돌 → public 버전 삭제
    - 레거시 subscription JSONB → SQLite3 개별 칼럼 분리 (endpoint, p256dh, auth)

    ## 발견된 패턴/주의사항
    - Docker 컨테이너에서 native gem 빌드 시 build-essential, libssl-dev 필요
    - compose.yaml 포트가 3001:3000으로 변경됨 (nineway 프로젝트 3000 사용)

    ## 테스트 결과
    - 406 runs, 948 assertions, 0 failures
    - 기존 테스트 1개 실패 (PagesControllerTest - 본 작업 무관)

    ## 남은 이슈
    - 배포 시 VAPID 키 생성 및 환경변수 설정 필요 (VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_EMAIL)
    - Action Mailer SMTP 설정 필요 (production.rb)
    - 카카오톡 알림 (Solapi) 미구현 (준비 중 표시)

  • 팀리드 상태 변경: 진행 중 → 완료

    2026년 03월 02일 05:13:06

  • 팀리드 위임: notification-frontend에게 '알림 프론트엔드: Service Worker + Settings UI + Stimulus' 작업 배정

    2026년 03월 02일 04:41:14

  • 팀리드 위임: notification-backend에게 '알림 백엔드: 컨트롤러 + Job + Mailer + 라우팅' 작업 배정

    2026년 03월 02일 04:40:53

  • 팀리드 위임: notification-foundation에게 '알림 기반: Gem 추가 + PushSubscription 모델 + 마이그레이션' 작업 배정

    2026년 03월 02일 04:40:03

  • 팀리드 작업 시작 - [P2] 알림 시스템 (Push/Email/Kakao)

    2026년 03월 02일 04:39:36

    상세 보기

    ## 작업 계획
    - 목표: 웹 푸시(VAPID), 이메일(Action Mailer), 카카오톡(Solapi) 알림 시스템 구현
    - 접근 방식: DB 모델 → 백엔드 서비스 → 프론트엔드 순으로 3개 에이전트 병렬 작업

    ## 코드베이스 분석 결과
    - Solid Queue 설정 완료 (production.rb에서 queue adapter 설정됨)
    - ApplicationMailer 기본 클래스만 존재
    - push_subscriptions 테이블 미생성
    - user_settings에 notification_methods 칼럼 없음
    - web-push gem 미설치
    - 레거시 코드 참고: /mnt/c/dev/logbible/src/app/api/push/, /api/notifications/

    ## 서브 티켓 계획
    1. 알림 기반 모델/마이그레이션 (gems, DB, models)
    2. 웹 푸시 + 알림 Job 백엔드 (controllers, jobs, routes)
    3. 알림 프론트엔드 (service worker, settings UI, stimulus)

    ## 현재 상태
    - 보드 현황: backlog 0 / todo 8 / in_progress 1 / review 0 / done 37

  • 팀리드 티켓 클레임 완료

    2026년 03월 02일 04:35:33