diff --git a/specs/001-feed-features/checklists/requirements.md b/specs/001-feed-features/checklists/requirements.md new file mode 100644 index 00000000..acef85c4 --- /dev/null +++ b/specs/001-feed-features/checklists/requirements.md @@ -0,0 +1,34 @@ +# Specification Quality Checklist: 피드(Feed) 기능 + +**Purpose**: Validate specification completeness and quality before proceeding to planning +**Created**: 2026-05-17 +**Feature**: [spec.md](../spec.md) + +## Content Quality + +- [x] No implementation details (languages, frameworks, APIs) — 본문에 Spring/JPA/REST 등 구현 용어 미포함, 비즈니스 어휘만 사용 +- [x] Focused on user value and business needs — 우선순위(P1~P3)로 사용자 가치 정렬 +- [x] Written for non-technical stakeholders — 한국어 비기술자 친화 서술 +- [x] All mandatory sections completed — User Scenarios / Requirements / Success Criteria 전부 작성 + +## Requirement Completeness + +- [x] No [NEEDS CLARIFICATION] markers remain — 2개 마커 모두 해소 (Q1: 알고리즘 선택 규칙 명문화 / Q2: 노출 정책 = 즉시 숨김 → 검수 큐 → 복원/영구 숨김, 트리거는 범위 외) +- [x] Requirements are testable and unambiguous — 모든 FR이 사용자 관찰 가능한 동작으로 기술 +- [x] Success criteria are measurable — SC 7개 모두 측정 가능한 결과 명시 +- [x] Success criteria are technology-agnostic — 응답시간/RPS 등 기술 임계치 배제 +- [x] All acceptance scenarios are defined — 5개 User Story 모두 Given-When-Then 시나리오 보유 +- [x] Edge cases are identified — Edge Cases 섹션에 8개 케이스 명시 +- [x] Scope is clearly bounded — Book/Report/Notification/Auth는 명시적으로 범위 외 처리 +- [x] Dependencies and assumptions identified — Assumptions 섹션에 8개 항목 기록 + +## Feature Readiness + +- [x] All functional requirements have clear acceptance criteria — FR-001~FR-025가 User Story 시나리오와 매핑됨 +- [x] User scenarios cover primary flows — 작성/조회/반응/저장/추천/작성 보조 모두 커버 +- [x] Feature meets measurable outcomes defined in Success Criteria — SC가 P1~P3 시나리오와 정렬됨 +- [x] No implementation details leak into specification — 구현 디테일은 Assumptions에서 외부화 + +## Notes + +- 2026-05-17 1차 검증: 2개 마커 해소, 모든 항목 통과. `/speckit-clarify`(선택) 또는 `/speckit-plan`으로 진행 가능. diff --git a/specs/001-feed-features/spec.md b/specs/001-feed-features/spec.md new file mode 100644 index 00000000..5e27e410 --- /dev/null +++ b/specs/001-feed-features/spec.md @@ -0,0 +1,206 @@ +# Feature Specification: 피드(Feed) 기능 + +**Feature Branch**: `001-feed-features` + +**Created**: 2026-05-17 + +**Status**: Reviewed (clarifications resolved 2026-05-17) + +**Input**: User description: "피드 관련 기능" + +> 본 문서는 신규 기능 정의가 아닌, 이미 운영 중인 THIP 서비스의 "피드" 도메인을 사용자 관점에서 역설계해 정형화한 PRD다. 구현 상세(스택·아키텍처)는 의도적으로 배제하고, 사용자가 무엇을(WHAT) 왜(WHY) 할 수 있어야 하는지에 집중한다. + +## User Scenarios & Testing *(mandatory)* + +THIP은 같은 책을 읽는 사람들이 감상을 공유하는 독서 커뮤니티이며, **피드**는 사용자가 작성한 독서 기록을 다른 사용자와 공유·발견·반응하는 핵심 면이다. 아래 사용자 스토리는 우선순위(P1 ~ P3)로 정렬되어 있으며, 각각 독립적으로 검증·배포 가능한 슬라이스다. + +### User Story 1 - 책에 대한 감상을 피드로 남기고 관리하기 (Priority: P1) + +사용자는 자신이 읽은 책에 대해 글·이미지·태그로 감상을 기록하고, 다른 사용자에게 공개할지 비공개로 둘지 선택한다. 작성한 피드는 언제든지 수정·삭제할 수 있어야 한다. + +**Why this priority**: 콘텐츠가 없으면 커뮤니티는 존재하지 않는다. 작성·수정·삭제는 다른 모든 시나리오의 전제 조건이다. + +**Independent Test**: 단일 사용자가 회원 가입 후 공개 피드 1건, 비공개 피드 1건을 각각 작성하고, 본문/이미지/태그를 수정한 뒤 삭제할 수 있다. 비공개 피드는 본인 외 다른 사용자에게 노출되지 않는다. + +**Acceptance Scenarios**: + +1. **Given** 로그인한 사용자가 책 한 권을 선택했을 때, **When** 본문·이미지(0장 이상)·태그·공개 여부를 입력해 피드 작성을 요청하면, **Then** 새 피드가 저장되고 사용자에게 생성된 피드 식별자가 반환된다. +2. **Given** 사용자가 작성한 피드가 존재할 때, **When** 본문/태그/이미지/공개 여부 중 하나 이상을 변경해 수정을 요청하면, **Then** 해당 피드의 내용이 갱신되며 연결된 책은 변경되지 않는다. +3. **Given** 비공개로 표시된 피드가 존재할 때, **When** 작성자가 아닌 사용자가 해당 피드를 조회하면, **Then** 시스템은 접근을 거부한다. +4. **Given** 사용자가 자신의 피드를 삭제하면, **When** 동일 피드를 다시 조회하면, **Then** 더 이상 어떤 사용자에게도 노출되지 않는다. +5. **Given** 다른 사용자의 피드가 존재할 때, **When** 본인이 아닌 사용자가 수정·삭제를 요청하면, **Then** 작업이 거부된다. + +--- + +### User Story 2 - 피드 둘러보기와 발견 (Priority: P1) + +사용자는 자신의 홈 피드, 특정 사용자의 피드, 그리고 특정 책에 대한 다른 사람들의 피드를 둘러보며 새로운 콘텐츠를 발견한다. 모든 목록은 부드럽게 이어지는 연속 스크롤(커서 기반 페이지) 경험을 제공해야 한다. + +**Why this priority**: 작성된 콘텐츠가 소비되지 않으면 작성자의 동기가 사라진다. 발견 경험은 리텐션의 근간이다. + +**Independent Test**: 여러 사용자의 공개 피드가 존재하는 환경에서, 사용자가 (a) 전체 피드, (b) 자신의 피드, (c) 다른 사용자의 공개 피드, (d) 특정 ISBN의 책에 대한 피드를 각각 커서 페이지로 끝까지 탐색할 수 있다. + +**Acceptance Scenarios**: + +1. **Given** 다수의 공개 피드가 존재할 때, **When** 사용자가 전체 피드 목록을 요청하면, **Then** 정해진 페이지 크기만큼의 피드와 다음 페이지를 가져올 수 있는 다음 커서가 함께 반환된다. +2. **Given** 사용자가 다음 커서로 다시 요청하면, **When** 이전 페이지에 포함된 피드는 제외되고 다음 묶음이 반환되며, **Then** 더 이상 데이터가 없으면 다음 커서가 비어있음으로 응답된다. +3. **Given** 다른 사용자의 비공개 피드가 존재할 때, **When** 그 사용자의 피드 목록을 조회하면, **Then** 비공개 피드는 결과에서 제외된다. +4. **Given** 특정 ISBN(13자리) 책에 대한 피드를 조회할 때, **When** 정렬 기준을 "좋아요 순" 또는 "최신 순"으로 지정하면, **Then** 해당 기준에 따라 정렬된 결과가 반환된다. +5. **Given** 사용자가 자신의 피드 화면 또는 다른 사용자의 피드 화면에 진입했을 때, **When** 상단 영역을 조회하면, **Then** 해당 사용자의 프로필 요약·팔로워 수·작성한 (공개) 피드 개수·(타인일 경우) 내가 팔로잉 중인지 여부가 함께 반환된다. + +--- + +### User Story 3 - 좋아요·저장으로 반응하고 다시 찾아보기 (Priority: P2) + +사용자는 마음에 드는 피드에 좋아요를 누르거나 저장(북마크)해두고, 저장한 피드는 별도의 목록에서 다시 확인한다. + +**Why this priority**: 작성자에 대한 사회적 보상(좋아요)과 사용자의 재방문 동기(저장)는 커뮤니티 성장 곡선을 결정한다. P1 이후 가장 큰 효과를 낸다. + +**Independent Test**: 사용자가 임의의 공개 피드에 좋아요/좋아요 취소를 토글했을 때 좋아요 수가 정확히 반영되고, 같은 피드를 저장/저장 해제했을 때 저장한 피드 목록에 정확히 나타나거나 사라진다. + +**Acceptance Scenarios**: + +1. **Given** 사용자가 공개 피드를 보고 있을 때, **When** 좋아요 상태를 ON으로 변경하면, **Then** 해당 피드의 좋아요 수가 1 증가하고 사용자의 좋아요 상태가 ON으로 반환된다. +2. **Given** 좋아요를 누른 상태에서, **When** 다시 좋아요 상태를 OFF로 변경하면, **Then** 해당 피드의 좋아요 수가 1 감소한다. +3. **Given** 동일 사용자가 같은 피드에 대해 좋아요 요청을 동시에 여러 번 보내더라도, **Then** 최종 좋아요 수는 의도된 한 번의 상태 변경만큼만 변한다(중복 누계 금지). +4. **Given** 비공개 피드에 대해, **When** 작성자가 아닌 사용자가 좋아요 또는 댓글 작성을 시도하면, **Then** 작업이 거부된다. +5. **Given** 사용자가 피드를 저장한 뒤, **When** 저장한 피드 목록을 조회하면, **Then** 해당 피드가 커서 페이지에 포함된다. **And** 저장을 해제하면 다음 조회부터 사라진다. + +--- + +### User Story 4 - 개인화된 피드 추천 (Priority: P3) + +전체 피드 목록은 단순 시간순이 아니라, 사용자가 팔로잉하는 사람·관심 도메인을 우선해서 노출함으로써 발견 효율을 높인다. 시스템은 사용자 상황(신규 사용자 / 활동 사용자)에 따라 적절한 노출 모드를 선택한다. + +**Why this priority**: P1·P2가 안정화된 이후 의미가 있다. 노출 모드 변경은 측정 가능한 효과(체류 시간·반응율)를 동반해야 한다. + +**Independent Test**: 동일한 피드 풀에서, (a) 팔로잉이 없는 신규 사용자와 (b) 활동 이력이 있는 사용자가 각자 전체 피드를 요청했을 때 노출 순서가 의도된 정책에 따라 달라진다. + +**Acceptance Scenarios**: + +1. **Given** 사용자가 다수의 다른 사용자를 팔로잉하고 있을 때, **When** 전체 피드 목록을 요청하면, **Then** 팔로잉하는 사용자의 피드가 비-팔로잉 피드보다 상단에 노출된다. +2. **Given** 사용자가 충분한 활동 이력을 가진 경우, **When** 전체 피드 목록을 요청하면, **Then** 시스템은 개인화된 노출 정책을 적용한다. +3. **Given** 사용자가 신규이거나 활동 이력이 적은 경우, **When** 전체 피드 목록을 요청하면, **Then** 시스템은 기본 노출 정책(시간순 또는 인기순)을 적용한다. + +**노출 모드 선택 규칙 (확정)**: + +본 시스템은 세 종류의 노출 모드를 가지며, 다음 단순 규칙으로 하나를 선택한다. 괄호 안은 현재 구현 클래스명(참조용). + +1. **기본 노출 모드 (`Basic`)**: 팔로잉이 임계치(N명) 미만인 사용자에게 적용. 시스템 전체에서 최신/인기 신호를 사용한다. +2. **팔로잉 우선 노출 모드 (`FollowingPriority`)**: 팔로잉이 임계치(N명) 이상인 사용자에게 적용. 팔로잉 대상자의 피드를 우선 노출하고 나머지를 보충한다. +3. **개인화 노출 모드 (`Personalized`)**: 위 두 모드의 상위 모드로, 사용자별 활동 누적치(좋아요·저장·체류 등)가 별도 임계치를 넘은 경우에만 적용 대상이 된다. 적용 트리거의 구체 임계치는 본 PRD 범위 외에서 정의·튜닝한다. + +임계치(N, 활동 누적치)의 구체 수치는 운영 데이터에 따라 조정 가능하며, 본 PRD는 결정 규칙만을 정의한다. 모드 우선순위는 개인화(자격이 있을 때) > 팔로잉 우선 > 기본 순으로 평가된다. + +--- + +### User Story 5 - 피드 작성을 위한 컨텍스트 제공 (Priority: P2) + +사용자가 피드 작성 화면에 진입했을 때, 본문에 첨부할 수 있는 카테고리·태그 목록과 이미지를 업로드할 수 있는 안전한 업로드 경로를 받는다. + +**Why this priority**: 작성 경험의 마찰을 낮춰 P1의 완료율을 끌어올리는 보조 시나리오. + +**Independent Test**: 작성 화면에서 사용 가능한 카테고리/태그 목록과, 이미지 업로드를 위한 직접 업로드 URL을 시스템에 요청해 받을 수 있다. + +**Acceptance Scenarios**: + +1. **Given** 사용자가 작성 화면을 열었을 때, **When** 작성 보조 정보를 요청하면, **Then** 선택 가능한 카테고리와 그 하위 태그 목록이 반환된다. +2. **Given** 사용자가 이미지 첨부를 시도할 때, **When** 업로드 URL 발급을 요청하면, **Then** 시스템은 일정 시간 동안만 유효한 직접 업로드 경로를 사용자별로 발급한다. +3. **Given** 발급된 업로드 경로로 업로드된 이미지가 아닌 임의의 외부 이미지 URL을 피드에 사용하려고 시도하면, **Then** 시스템은 거부한다. + +--- + +### Edge Cases + +- **비공개 피드**: 작성자만 조회/수정/삭제/좋아요/댓글이 가능하다. 다른 사용자에게는 존재가 노출되지 않는다(목록 제외 + 직접 조회 거부). +- **카운트 무결성**: 좋아요·댓글·저장의 토글이 동시 요청으로 발생해도 최종 수치는 정합해야 한다(작성자/뷰어 모두에게 일관된 값을 보여야 함). +- **댓글 카운트 언더플로우**: 어떤 경우에도 댓글 수가 음수가 되지 않는다. +- **삭제된 피드**: 삭제된 피드에 대한 후속 좋아요·댓글·저장 요청은 명확한 오류로 거부된다. +- **ISBN 입력 오류**: 13자리가 아닌 ISBN으로 책 관련 피드를 요청하면 잘못된 입력으로 응답한다. +- **이미지 소유권**: 다른 사용자에게 발급된 업로드 경로로 올린 이미지를 자신의 피드에 첨부하려는 시도는 거부된다. +- **수정 시 책 변경 시도**: 피드 수정 시 책(targetBook)을 다른 책으로 바꾸려는 요청은 거부된다. +- **신고 누적 시 노출 정책 (확정)**: 신고 누적치가 시스템 임계를 도달하면 해당 피드는 **즉시 일반 노출에서 숨김** 처리되어 어떤 사용자 목록·검색 결과에도 포함되지 않는다. 동시에 운영자 **검수 큐**에 자동 진입하며, 검수 결과에 따라 (a) **노출 복원** 또는 (b) **영구 숨김** 중 하나로 종료된다. 작성자에게는 검수 결과가 전달된다. 신고 행위 자체(트리거 API/사용자 흐름)는 본 PRD 범위 외(별도 신고 도메인 PRD)에서 정의한다. + +## Requirements *(mandatory)* + +### Functional Requirements + +#### 작성·수정·삭제 + +- **FR-001**: 사용자는 본문, (선택) 이미지 목록, (선택) 태그 목록, 공개/비공개 여부, 연결할 책(ISBN 기반)을 지정해 피드를 작성할 수 있어야 한다. +- **FR-002**: 시스템은 작성된 피드의 작성자, 작성 시각, 공개 여부, 연결 책을 영구적으로 보존해야 한다. +- **FR-003**: 작성자는 본인의 피드 본문·태그·공개 여부·이미지 목록을 수정할 수 있다. 연결 책은 수정 대상에서 제외한다. +- **FR-004**: 이미지 수정은 "삭제 또는 유지"만 가능하다(수정 요청 본문에는 최종적으로 남아야 할 이미지 식별자 집합만 전달되며, 새 이미지의 임의 추가는 별도 업로드 경로를 통과한 것에 한정). +- **FR-005**: 작성자는 본인의 피드를 삭제할 수 있다. 삭제 이후 해당 피드는 어떤 사용자에게도 노출되지 않는다. +- **FR-006**: 작성자가 아닌 사용자가 수정 또는 삭제를 시도하면 거부해야 한다. + +#### 조회·발견 + +- **FR-007**: 시스템은 사용자에게 다음 다섯 종류의 피드 목록을 제공한다: (a) 전체 피드, (b) 자신의 피드, (c) 특정 사용자의 공개 피드, (d) 특정 책(ISBN)에 연관된 피드, (e) 자신이 저장한 피드. +- **FR-008**: 모든 피드 목록은 커서 기반 페이지네이션을 사용하며, 응답에 다음 페이지를 위한 커서 또는 종료 신호를 포함해야 한다. +- **FR-009**: 특정 책에 연관된 피드 목록은 "좋아요 순(기본)"과 "최신 순" 정렬을 지원한다. +- **FR-010**: 시스템은 사용자가 단일 피드의 상세 정보(본문, 태그, 이미지, 좋아요 수, 댓글 수, 저장 여부, 좋아요 여부, 작성자 정보)를 조회할 수 있게 해야 한다. +- **FR-011**: 시스템은 피드 화면 상단을 위해 (a) 본인 또는 (b) 다른 사용자의 프로필 요약, 팔로워 수, 작성한 피드 수, (b의 경우) 내가 팔로잉 중인지 여부를 함께 제공해야 한다. +- **FR-012**: 비공개 피드는 어떤 목록·검색 결과에도 작성자 본인이 아닌 사용자에게 노출되어서는 안 된다. +- **FR-013**: 사용자가 단일 피드를 직접 조회할 때 비공개 피드라면 작성자 본인 외 사용자에게는 접근을 거부한다. + +#### 반응·저장 + +- **FR-014**: 사용자는 공개 피드에 좋아요를 토글할 수 있어야 한다(ON/OFF). +- **FR-015**: 비공개 피드에 대한 다른 사용자의 좋아요 또는 댓글 작성 시도는 거부되어야 한다. +- **FR-016**: 좋아요 카운트는 동시 토글 시나리오에서도 정합해야 한다(중복 증가/감소 없음). +- **FR-017**: 사용자는 임의의 공개 피드를 저장/저장 해제할 수 있으며, 저장된 피드는 자신만 볼 수 있는 별도 목록으로 제공되어야 한다. + +#### 작성 보조 + +- **FR-018**: 시스템은 피드 작성 화면을 위해 선택 가능한 카테고리와 하위 태그 목록을 제공해야 한다. +- **FR-019**: 피드에 첨부되는 이미지는 시스템이 발급한 직접 업로드 경로를 통해서만 업로드되어야 하며, 다른 사용자에게 발급된 경로로 업로드된 이미지를 자신의 피드에 첨부할 수 없다. +- **FR-020**: 이미지 업로드 경로는 한정된 시간 동안만 유효해야 한다. + +#### 노출 정책 + +- **FR-021**: 전체 피드 목록은 단순 시간순이 아니라, 사용자의 팔로잉·활동 이력을 반영해 우선순위를 적용한 결과를 반환할 수 있어야 한다. +- **FR-022**: 시스템은 사용자별로 다음 규칙으로 노출 모드를 선택한다. (1) 개인화 노출 모드(`Personalized`) 적용 자격(활동 누적치 임계치 이상)이 있으면 개인화 모드, (2) 그렇지 않고 팔로잉 수가 임계치 N 이상이면 팔로잉 우선 노출 모드(`FollowingPriority`), (3) 그 외에는 기본 노출 모드(`Basic`). 구체 임계치는 운영 튜닝 대상이며 본 PRD는 결정 규칙만 정의한다. + +#### 안전성·정합성 + +- **FR-023**: 시스템은 신고 누적치가 임계에 도달한 피드를 일반 노출에서 즉시 숨김 처리하고 운영자 검수 큐에 자동 진입시켜야 한다. 검수 결과에 따라 노출 복원 또는 영구 숨김 중 하나로 종료되며, 작성자에게 결과가 전달되어야 한다. 신고 트리거 자체는 본 PRD의 범위가 아니다. +- **FR-024**: 어떤 경우에도 피드의 댓글 수·좋아요 수가 음수가 될 수 없다. +- **FR-025**: ISBN으로 책 연관 피드를 조회할 때, 13자리 숫자가 아닌 입력은 잘못된 입력으로 거부되어야 한다. + +### Key Entities + +- **Feed (피드)**: 사용자가 책 한 권에 대해 남기는 감상 단위. 본문, 작성자, 연결된 책, 공개 여부, 좋아요 수, 댓글 수, 신고 수, 태그 목록, 이미지 목록을 가진다. +- **Tag (태그)**: 피드에 첨부되는 분류 키워드. 카테고리 하위에 속한다. +- **Image Content (이미지)**: 피드 본문에 첨부되는 이미지 자원. 업로드 시 사용자별 소유권을 가진다. +- **Saved Feed (저장된 피드)**: 사용자가 다시 보기 위해 북마크한 피드와 사용자 간 연결. +- **Book (책)**: 피드가 연관되는 외부 도서 자원. ISBN으로 식별된다(상세 정의는 본 PRD 범위 외). +- **User (사용자)**: 피드의 작성자/소비자. 팔로잉·팔로워 관계를 가진다(상세 정의는 본 PRD 범위 외). + +## Success Criteria *(mandatory)* + +### Measurable Outcomes + +- **SC-001**: 사용자는 작성 화면 진입부터 피드 생성 완료까지 평균 60초 이내에 마칠 수 있다(이미지 0~3장 기준). +- **SC-002**: 사용자가 피드 목록(전체/내/타인/책별/저장) 첫 화면을 요청한 뒤, 95%의 요청이 사용자가 "지연 없이 떴다"고 인식하는 시간 내에 첫 결과를 받는다. +- **SC-003**: 동일 사용자가 같은 피드에 좋아요를 빠르게 반복 토글해도 최종 좋아요 수가 정확히 한 번의 변화만 반영한다(중복/누락 0건). +- **SC-004**: 비공개 피드가 작성자 외 사용자에게 노출되는 사건이 발생하지 않는다(노출 사건 0건). +- **SC-005**: 저장한 피드를 사용자가 다시 찾으려고 할 때, 저장 직후 또는 다음 세션에서 모두 동일한 결과를 본다(저장 직후 사라짐·중복 노출 0건). +- **SC-006**: 신규로 가입한 사용자가 최초 전체 피드를 조회한 뒤 1분 안에 최소 1개의 피드를 클릭/스크롤한다(콘텐츠 발견 효과). +- **SC-007**: 책별 피드 조회 시 사용자가 선택한 정렬 기준(좋아요 순 / 최신 순)을 변경했을 때, 사용자는 정렬이 적용되었음을 첫 화면에서 식별할 수 있다. + +> 본 PRD는 사용자 경험 차원의 성공 기준만 정의하며, 백엔드 응답 시간/RPS 등 기술 임계치는 헌법(constitution)의 성능 가드 원칙과 별도의 부하 시나리오에서 정의한다. + +## Assumptions + +- **이미 운영 중인 기능의 역설계**: 본 PRD는 신규 기능 정의가 아니라 기존 구현을 사용자 관점으로 정형화한 산출물이다. 따라서 본 PRD가 도출하는 요구사항은 "구현되어 있어야 한다"가 아니라 "구현이 보장해야 한다(혹은 보장하고 있어야 한다)"이다. +- **인증 전제**: 모든 피드 시나리오는 인증된 사용자를 전제로 한다. 인증/인가의 상세 동작은 별도 PRD가 다룬다. +- **책(Book) 도메인은 외부 의존**: 피드는 ISBN을 통해 책을 참조한다. 책의 등록·수정·동기화는 별도 도메인 PRD가 정의한다. +- **신고(Report)는 별도 도메인**: 신고 트리거 API와 사용자 흐름은 별도 신고 도메인 PRD가 정의한다. 본 PRD는 신고 누적 결과(노출 정책: 즉시 숨김 → 검수 큐 → 복원/영구 숨김)만을 정의한다. +- **이미지 저장소**: 이미지 업로드/저장은 안전한 외부 객체 저장소를 사용한다고 가정한다. 구체적 저장소 선택은 본 PRD 범위 외다. +- **알림 연동**: 본 PRD는 *본 도메인이 직접 발화하는* 알림 트리거만을 보증한다. 좋아요·댓글로 인한 알림(피드 좋아요/피드 댓글/피드 댓글 답글/피드 댓글 좋아요)의 트리거 발화는 각각 좋아요 공통 도메인과 댓글 도메인이 책임지며, 본 도메인은 그 발화의 *대상이 피드라는 사실*만 인정한다. 알림 트리거 수신 이후의 저장·표시·푸시 전달 흐름은 알림 도메인 PRD(#359)를 따른다. + + **본 도메인이 직접 발화하는 트리거**: + - **"팔로잉한 사용자가 새 피드를 작성함"**: 사용자가 *공개* 피드를 생성하는 데 성공한 시점에, 작성자를 팔로잉 중인 사용자들에게 알림 트리거가 발화된다. 비공개 피드는 발화하지 않는다(트리거 수신자에게 노출되지 않을 콘텐츠는 알림도 보내지 않는다). 피드 수정·삭제는 트리거를 발화하지 않는다. +- **카테고리/태그 사전**: 작성 화면에서 보여지는 카테고리·태그는 시스템에 의해 사전 정의되어 있으며, 본 PRD는 그 편집 흐름을 정의하지 않는다. +- **페이지 크기**: 모든 커서 페이지의 기본 페이지 크기는 시스템 설정값으로 고정되며, 본 PRD는 그 값을 단정하지 않는다.