Skip to content

[docs] 알림(Notification) 도메인 PRD 역설계 (specs/006-notification-domain)#359

Open
buzz0331 wants to merge 1 commit into
chore/spec-kit-setupfrom
006-notification-domain
Open

[docs] 알림(Notification) 도메인 PRD 역설계 (specs/006-notification-domain)#359
buzz0331 wants to merge 1 commit into
chore/spec-kit-setupfrom
006-notification-domain

Conversation

@buzz0331
Copy link
Copy Markdown
Contributor

Summary

운영 중인 알림(Notification) 도메인을 사용자 관점에서 역설계해 PRD로 정형화한 여섯 번째 산출물.
신규 기능 정의가 아닌 기존 구현을 "이래야 한다"로 문서화하는 작업.

Depends on #353 (Spec Kit 셋업 + 헌법 v1.0.0 비준). #353 머지 후 base를 develop으로 retarget 예정.

무엇이 추가되는가

파일 내용
specs/006-notification-domain/spec.md 알림 도메인 PRD (한국어, 248 줄)
specs/006-notification-domain/checklists/requirements.md 사양 품질 체크리스트 (15/15 통과)

본 PRD의 본질

알림 도메인은 수동적이다. 다른 도메인(피드/팔로우/방/RoomPost/댓글/좋아요)에서 발화된 트리거를 받아, 그 트리거를 알림으로 가공해 (a) 알림 센터에 누적하고 (b) 디바이스에 푸시한다.

본 PRD가 다루는 것: 트리거를 받은 이후의 알림 동작 — 저장, 표시, 읽음 처리, 라우팅, 푸시 전달, 디바이스 토큰, 수신 여부.

본 PRD가 다루지 않는 것: 언제 트리거가 발화되는지 — 각 발화 도메인 PRD의 책임.

PRD 구성

  • User Stories 5건 (우선순위)
    • P1: 알림 센터 (카테고리 필터, 안 읽은 알림 존재 확인)
    • P1: 읽음 처리 + 라우팅 (이미 읽음에도 라우팅은 항상 응답)
    • P1: 디바이스 토큰 등록·갱신·삭제 (deviceId 기준 활성 1건)
    • P1: 트리거 수신과 발화 (트리거 카탈로그 15종 명문화)
    • P2: 디바이스별 수신 여부 토글 (같은 사용자라도 디바이스 독립)
  • Functional Requirements 21건
  • Success Criteria 7건 — 권한 누수 0, 누락·중복 0, 라우팅 누락 0 등
  • Edge Cases 10건 — 권한 검증, 멱등성, 자기 알림, OFF 디바이스, 외부 장애 등

핵심 결정

알림 트리거 카탈로그 (User Story 5)

15종 트리거를 카테고리·발화 도메인·라우팅 대상별로 명문화. 다른 PRD가 "트리거를 발화한다"고 명시한 부분(예: 팔로우 PRD #355)이 이 카탈로그와 정합해야 함.

카테고리 트리거 수 발화 도메인
FEED 6종 피드(#354)·팔로우(#355)
ROOM 9종 방(#358)·RoomPost(#357)·댓글·좋아요

디바이스 단위 수신 여부 (FR-013)

같은 사용자가 디바이스 A는 켜고 B는 끌 수 있음. 알림 센터 누적은 수신 여부와 무관(앱 안에서는 보임, 푸시만 차단).

저장과 전달의 독립성 (FR-019, SC-006)

외부 푸시 채널(현재 FCM) 일시 장애로 푸시 전달이 실패해도 알림 센터에 누적된 알림은 손실되지 않음. 사용자 가시성 보장.

알림 보존 정책 (FR-021)

현재 정책: 평생 누적, 자동 삭제·만료·사용자 수동 삭제 모두 미제공.

향후 도입 예정 (Assumptions에 명시):

  • 최근 N일 기준 자동 삭제 정책 도입 예정 (N의 구체 값은 운영 데이터 보고 결정)
  • 도입 시 FR-021, Edge Cases 업데이트 필요 (개정 트리거)

읽음 처리의 멱등성과 라우팅 보장 (FR-005, FR-006)

읽음 처리는 최초 1회만 상태를 바꾸지만, 라우팅 정보는 매번 응답된다. 클라이언트는 이미 읽은 알림을 다시 클릭해도 의도된 화면으로 이동 가능.

범위 외 (의도적)

  • 각 트리거의 발화 조건과 횟수 — 발화 도메인 PRD의 책임
  • 외부 푸시 채널 벤더(FCM) — 벤더 중립 추상화
  • 댓글·좋아요 사용자 흐름 자체 — 댓글 도메인·좋아요 공통 도메인(Post) PRD
  • 사용자 라이프사이클 — 발화 주체/수신자 탈퇴 시 알림 표시 정책은 별도 PRD
  • 외부 푸시 호출 비용·할당량 — 운영 정책

누적 PRD 진행 상황

# 도메인 PR
001 피드(Feed) #354
002 팔로우(Follow) #355
003 책(Book) #356
004 방 게시글(RoomPost) — 기록·투표 #357
005 방(Room) #358
006 알림(Notification) 본 PR

Test plan

  • PRD 본문이 비즈니스 어휘로 읽히는지 (FCM·Firebase 등 구현 디테일 누출 점검)
  • 알림 트리거 카탈로그(User Story 5) 15종이 실제 코드의 템플릿과 일치하는지
  • 카탈로그가 발화 도메인 PRD들과 정합한지 (특히 팔로우 PRD #355의 트리거 발화 보증 문구와의 연결)
  • 디바이스 단위 수신 여부 정책(같은 사용자, 다른 디바이스 = 다른 설정)이 현재 운영 의도와 일치하는지
  • 알림 보존 정책 "현재 평생 누적 → 향후 N일 제한"의 도입 시점·우선순위에 대한 팀 의견
  • 누락된 시나리오(예: 알림 묶음/그룹핑, 시간대별 수신 차단, 카테고리별 수신 여부 등) 검토

- 운영 중인 알림 도메인을 사용자 관점으로 정형화 (신규 기능 정의 아님)
- User Story 5건 (P1: 알림 센터·읽음 라우팅·디바이스 토큰 등록·트리거 수신,
  P2: 디바이스별 수신 여부 토글)
- Functional Requirements 21건 (FR-001 ~ FR-021)
- 측정 가능한 Success Criteria 7건, Edge Cases 10건, Assumptions 11건
- 본 PRD의 본질: 트리거 수신 이후의 알림 동작
  (트리거 발화 조건은 발화 도메인 PRD가 책임)
- 알림 트리거 카탈로그 15종 명문화:
  FEED 6종(팔로우/피드 좋아요/댓글/답글/댓글 좋아요/팔로잉 새 피드),
  ROOM 9종(새 참여자/모집 조기 마감/활동 시작/기록·투표 시작/
  게시글 댓글·답글·좋아요/댓글 좋아요)
- 디바이스 단위 수신 여부 토글 정책: 같은 사용자라도 디바이스별 독립
- 외부 푸시 채널(현재 FCM)은 벤더 중립 추상화
- 저장(알림 센터)과 전달(푸시)의 독립성 보장 (외부 장애 시에도 누적 손실 X)
- 알림 보존 정책 명문화: 현재는 평생 누적·수동 삭제 미제공
  향후 최근 N일 자동 삭제 도입 예정 (개정 트리거로 Assumptions에 명시)
- 트리거 발화 도메인·댓글·좋아요·사용자 라이프사이클은 명시적 범위 외
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 17, 2026

Warning

Rate limit exceeded

@buzz0331 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 48 minutes and 42 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 70faf529-bb53-493a-ac28-497828599c23

📥 Commits

Reviewing files that changed from the base of the PR and between 2277cb3 and 716835b.

📒 Files selected for processing (2)
  • specs/006-notification-domain/checklists/requirements.md
  • specs/006-notification-domain/spec.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 006-notification-domain

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

buzz0331 pushed a commit that referenced this pull request May 17, 2026
- "팔로잉한 사용자가 새 피드를 작성함" 트리거를 본 도메인 책임으로 명시
  (공개 피드 생성 성공 시 작성자의 팔로워들에게 발화,
  비공개·수정·삭제는 미발화)
- 좋아요·댓글로 인한 알림 트리거의 책임 분리 명확화
  (좋아요 공통 도메인, 댓글 도메인 책임)
- 알림 도메인 PRD(#359)의 트리거 카탈로그(FEED 6종)와 정합
buzz0331 pushed a commit that referenced this pull request May 17, 2026
- "새 기록 작성됨" 트리거: 기록 작성 성공 시 같은 방의 다른 참여자
  (작성자 제외)에게 발화. 수정·삭제는 미발화
- "새 투표 시작됨" 트리거: 투표 생성 성공 시 같은 방의 다른 참여자
  (작성자 제외)에게 발화. 참여·취소·항목 변경·수정·삭제는 미발화
  (생성 1회당 1건)
- 댓글·좋아요로 인한 알림 트리거 책임 분리 명확화
  (댓글 도메인, 좋아요 공통 도메인 책임)
- 알림 도메인 PRD(#359)의 트리거 카탈로그와 정합
buzz0331 pushed a commit that referenced this pull request May 17, 2026
- "새 참여자" 트리거: 방 참여 성공 시 호스트에게 발화.
  참여 취소(나가기)는 미발화 (참여 1회당 1건)
- "모집 조기 마감" 트리거: 호스트가 closeRoomRecruit으로
  RECRUITING -> IN_PROGRESS 전환 시 호스트 제외 참여자에게 발화
- "활동 시작" 트리거: IN_PROGRESS 진입 시 참여자에게 발화
  (조기 마감과 함께 발화될 수 있는 별개 트리거)
- 알림 도메인 PRD(#359)의 트리거 카탈로그(ROOM 9종 중 3종)와 정합
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant