F9. 알림
1. 기능명
서비스 내 알림
2. 기능 목적
사용자가 놓치면 안 되는 변화를 서비스 안에서 확인하게 한다.
- 경매는 마감 시각이 있으므로 마감 임박을 알린다
- 주최자에게 새 사연 도착을 알려 공감(F4)으로 이어지게 한다
- 낙찰 결과를 전달해 다음 단계(전달 논의, F6)로 이어지게 한다
푸시 알림은 만들지 않는다. 알림은 서비스 안에서만 확인한다. Service Worker·구독 관리·만료 처리에 드는 비용에 비해 실효가 낮다고 판단했다.
3. 동작 방식
3.1 알림 종류
| 종류 | 받는 사람 | 시점 |
|---|---|---|
| 마감 임박 | 참여자 | 기간에 비례한 3단계 — 3일 전 · 1일 전 · 1시간 전 (아래) |
| 새 사연 등록 | 주최자 | 사연이 등록됐을 때 |
| 낙찰 결과 | 주최자와 참여자 전원 | 마감 처리 완료 시 (F5) |
| 채팅 새 메시지 | 대화 상대 | 메시지가 도착했을 때 (F6) |
수신 대상은 관계로 결정된다 (
00-관계-판정). 사용자 유형을 조회하지 않는다.
마감 임박 — 기간에 비례한 3단계
경매가 길수록 더 여러 번, 짧을수록 한 번만 알린다. 단계는 3일 · 1일 · 1시간 셋으로 고정이고, 경매 기간보다 짧은 단계만 보낸다.
| 등록 기간 | 3일 전 | 1일 전 | 1시간 전 | 합계 |
|---|---|---|---|---|
| 7일 | O | O | O | 3회 |
| 3일 | - | O | O | 2회 |
| 1일 | - | - | O | 1회 |
- 기간과 같거나 긴 단계는 보내지 않는다. 등록되는 순간 발송되어 임박의 의미가 사라지기 때문이다
- 그 단계를 지난 뒤에 참여한 사람에게는 보내지 않는다. 마감 30분 전에 사연을 쓴 사람은 마감이 임박한 것을 이미 안다. 알림이 아니라 소음이고, "1시간 전"이라는 문구도 사실과 다르다
- 스케줄러가 멈췄다 재개해 여러 단계가 한꺼번에 해당하면 가장 급한 단계 하나만 보낸다
채팅방 개설은 별도 알림을 만들지 않는다. 낙찰 결과 알림에서 채팅으로 이동하게 한다.
3.2 표시
| 위치 | 내용 |
|---|---|
| 헤더 배지 | 읽지 않은 알림이 있으면 점을 표시한다 |
알림 목록 /notifications | 알림 문구, 관련 경매, 수신 시각 |
- 읽지 않은 알림을 구분해 표시한다
- 알림을 누르면 관련 경매 또는 채팅방으로 이동한다
- 목록을 열면 읽음으로 처리한다
3.3 중복 방지
같은 사건에 대해 같은 사용자에게 알림을 두 번 만들지 않는다.
마감 임박·낙찰 결과는 (사용자, 종류, 경매) 조합당 1건으로 제한한다. 새 메시지는 반복 발생하므로 이 제한에서 제외한다.
마감 임박은 단계가 곧 종류다.
3일 전·1일 전·1시간 전이 서로 다른 종류이므로 단계마다 1건씩, 최대 3건이 쌓인다. 같은 단계를 두 번 받는 일은 없다.
3.4 색상
마감 임박 알림에만 경고색(레드) 을 쓴다. 나머지는 기본 강조색을 따른다.
4. 예외 처리
| 상황 | 처리 |
|---|---|
| 알림 0건 | "새로운 알림이 없어요" 빈 상태를 표시한다 |
| 알림 목록 조회 실패 | 에러와 재시도를 제공한다. 빈 목록으로 위장하지 않는다 |
| 알림 생성 실패 | 원래 처리(낙찰 확정 등)를 롤백하지 않는다. 사용자는 서비스 안에서 결과를 확인할 수 있어야 한다 |
| 일부 수신자에게만 실패 | 성공한 알림을 되돌리지 않는다. 실패분만 재시도한다 |
| 알림 클릭 시 대상이 삭제됨 | "삭제되었거나 찾을 수 없어요" 안내 후 목록에 머무른다 |
| 배지 갱신 실패 | 알림 목록 자체는 정상 동작해야 한다 |
| 비회원 | 알림 기능을 노출하지 않는다 |
5. 완료 조건
| # | 조건 |
|---|---|
| 1 | 마감 임박·새 사연·낙찰 결과·새 메시지 알림이 관계 기준으로 올바른 대상에게 생성된다 |
| 2 | 수신 대상 판정에 users.role을 조회하지 않는다 |
| 3 | 읽지 않은 알림이 헤더 배지에 반영된다 |
| 4 | 알림을 누르면 관련 경매 또는 채팅방으로 이동한다 |
| 5 | 같은 사건에 대한 중복 알림이 생성되지 않는다 |
| 6 | 알림 생성 실패가 낙찰 등 원래 처리를 되돌리지 않는다 |
| 7 | 알림 0건과 조회 실패가 서로 다른 화면으로 구분된다 |
| 8 | Service Worker·푸시 구독 관련 코드가 존재하지 않는다 |