-
Notifications
You must be signed in to change notification settings - Fork 0
Notification Flow
l2juhan edited this page Apr 18, 2026
·
2 revisions
μΈμ± μλ¦Ό, νΈμ μλ¦Ό, μλ¦Ό μ€μ μ λν μ 체 νλ‘μ°λ₯Ό μ€λͺ ν©λλ€.
| νλͺ© | λ΄μ© |
|---|---|
| λμ μ¬μ©μ | WORKER, EMPLOYER κ³΅ν΅ |
| μΈμ± μλ¦Ό | SSE μ€μκ° κ΅¬λ + Header 벨 μμ΄μ½ λ±μ§ |
| νΈμ μλ¦Ό | FCM ν ν° κΈ°λ° (μ± λ°±κ·ΈλΌμ΄λ/μ’ λ£ μ) |
| API λͺ¨λ | src/api/notification/ |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β μλ¦Ό μμ€ν
ꡬ쑰 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β [μ± Foreground] β
β β β
β βββ SSE ꡬλ
(/api/notifications/stream) β
β β β μ μλ¦Ό μμ μ unreadCount μ¦κ° β
β β β Header 벨 μμ΄μ½μ μ«μ λ±μ§ νμ (1~9, 10+β"9+") β
β β β
β βββ 벨 μμ΄μ½ ν΄λ¦ β NotificationPopup (μ΅κ·Ό 5κ°) β
β β "μ 체 보기" β NotificationScreen β
β β
β [μ± Background/μ’
λ£] β
β β β
β βββ FCM νΈμ μλ¦Ό (OS μλ¦ΌμΌν°μ νμ) β
β β β
β βββ μλ¦Ό ν β λ₯λ§ν¬ λ€λΉκ²μ΄μ
(actionType κΈ°λ°) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β SSE μ€μκ° κ΅¬λ
νλ‘μ° β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β [λ‘κ·ΈμΈ μ±κ³΅] β
β β β
β βΌ β
β useNotificationStream() νμ±ν β
β β β
β βββ GET /api/notifications/unread-count β
β β β μ΄κΈ° μ½μ§ μμ μλ¦Ό μ β notificationStore μ μ₯ β
β β β
β βββ SSE μ°κ²° (/api/notifications/stream) β
β β XMLHttpRequest κΈ°λ° (React Native νΈν) β
β β μ°κ²° λκΉ μ 5μ΄ ν μλ μ¬μ°κ²° β
β β μ μ΄λ²€νΈ μμ μ incrementUnreadCount() β
β β
β [λ‘κ·Έμμ/μΈλ§μ΄νΈ] β
β β β
β βΌ β
β SSE μ°κ²° ν΄μ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
interface NotificationStoreState {
unreadCount: number;
setUnreadCount: (count: number) => void;
incrementUnreadCount: () => void;
decrementUnreadCount: () => void;
}βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FCM ν ν° κ΄λ¦¬ νλ‘μ° β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β [λ‘κ·ΈμΈ μ±κ³΅] β
β β β
β βΌ β
β useFcmToken() νμ±ν β
β β β
β βΌ β
β GET /api/settings/me β pushEnabled μ‘°ν (2026-03-09 λ³κ²½) β
β β β
β βββ pushEnabled: false β ν ν° λ±λ‘νμ§ μμ β
β β β
β βββ pushEnabled: true β registerPushToken() β
β β β
β βΌ β
β expo-notificationsλ‘ Expo Push Token λ°κΈ β
β (λλ°μ΄μ€λ§λ€ κ³ μ ν ν ν°) β
β β β
β βΌ β
β POST /api/notifications/fcm-token β
β { token: "ExponentPushToken[xxx]", deviceInfo: "ios 18" }β
β β β
β βΌ β
β AsyncStorageμ ν ν° μ μ₯ (λ‘κ·Έμμ μ μμ μ©) β
β β
β [λ‘κ·Έμμ] β
β β β
β βΌ β
β unregisterPushToken() β
β β β
β βΌ β
β DELETE /api/notifications/fcm-token { token: "μ μ₯λ ν ν°" } β
β β β
β βΌ β
β AsyncStorageμμ ν ν° μ κ±° β
β β β
β βΌ β
β logout() μ€ν (auth ν ν° μμ , μΏ ν€ μμ ) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
μλ¦Όμ ννλ©΄ actionTypeμ λ°λΌ ν΄λΉ νλ©΄μΌλ‘ μ΄λν©λλ€.
| actionType | κ·Όλ‘μ | κ³ μ©μ£Ό |
|---|---|---|
VIEW_WORK_RECORD |
WorkerHomeMain (μ£Όκ° μΊλ¦°λ) | EmployerHomeMain (μΌκ° μΊλ¦°λ) |
VIEW_CORRECTION_REQUEST |
SentRequests (λ³΄λΈ μμ²) | EmployerReceivedRequests (λ°μ μμ²) |
VIEW_PENDING_APPROVAL |
Notifications | EmployerReceivedRequests |
VIEW_SALARY |
WorkerMonthlyCalendar | Notifications |
VIEW_PAYMENT_MANAGEMENT |
Notifications | RemittanceManage (μ‘κΈκ΄λ¦¬) |
VIEW_WORKPLACE_INVITATION |
WorkplaceManage | WorkerManage (μ§μκ΄λ¦¬) |
VIEW_NOTICE |
Notifications | Notifications |
NONE |
Notifications | Notifications |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β λ₯λ§ν¬ λ€λΉκ²μ΄μ
νλ‘μ° β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β [μ± μ’
λ£ μνμμ μλ¦Ό ν] β
β β β
β βΌ β
β getLastNotificationResponseAsync() β
β β λ§μ§λ§ μλ¦Ό μλ΅ νμΈ β actionType μΆμΆ β navigate() β
β β
β [μ± λ°±κ·ΈλΌμ΄λμμ μλ¦Ό ν] β
β β β
β βΌ β
β addNotificationResponseReceivedListener() β
β β μλ¦Ό μλ΅ μ΄λ²€νΈ μμ β actionType μΆμΆ β navigate() β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β μλ¦Ό μμΈ νλ©΄ ꡬ쑰 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββ β
β β Header: [β] "μλ¦Ό" [μ 체 μ½μ] β β
β βββββββββββββββββββββββββββββββββββββββββββββ€ β
β β Filter Chips β β
β β [μ 체] [μ½μ§ μμ μλ¦Ό N] β β
β βββββββββββββββββββββββββββββββββββββββββββββ€ β
β β NotificationItem (FlatList, pull-refresh) β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β β β [π] 근무 μΌμ μ΄ λ³κ²½λμμ΅λλ€. Γβ β β
β β β 3λΆ μ β β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β β β [π] μ μ μμ²μ΄ μΉμΈλμμ΅λλ€. Γβ β β
β β β 1μκ° μ β β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββ€ β
β β Pagination (νλ¨ κ³ μ ) β β
β β < [1] [2] [3] ... [10] > β β
β βββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GET /api/notifications?page=0&size=10&is_read=false
β { content: [...], totalPages: 5, totalElements: 42 }
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β μλ¦Ό μ€μ νλ©΄ ꡬ쑰 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββ β
β β Header: [β] "μλ¦Ό μ€μ " β β
β βββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β β
β β νΈμ μλ¦Ό [Toggle β] β β
β β μ±μ μ¬μ©νμ§ μμ λλ β β
β β μλ¦Όμ λ°μ΅λλ€. β β
β β βββββββββββββββββββββββββ β β
β β λλ°μ΄μ€ μλ¦Ό μ€μ μ΄κΈ° π β β
β β βββββββββββββββββββββββββ β β
β β λλ°μ΄μ€ μ€μ μμ μλ¦Ό κΆνμ λλ©΄ β β
β β νΈμ μλ¦Όμ΄ μ± λ΄ μ€μ κ³Ό κ΄κ³μμ΄ β β
β β μμ λμ§ μμ΅λλ€. β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
κΈ°μ‘΄μ AsyncStorage λ‘컬 μ μ₯ λ°©μμμ μλ² API λκΈ°ν λ°©μμΌλ‘ λ³κ²½λλ€.
[νλ©΄ μ§μ
]
β GET /api/settings/me β { pushEnabled } λ‘λ β ν κΈ μ΄κΈ°κ° μ€μ
[ν κΈ OFF β ON]:
β λλ°μ΄μ€ μλ¦Ό κΆν νμΈ
β κΆν OFF β Alert "λλ°μ΄μ€ μ€μ μμ μλ¦Όμ νμ©ν΄μ£ΌμΈμ" + μ€μ μ΄λ
β κΆν ON β PUT /api/settings/me { pushEnabled: true }
β μ±κ³΅ μ registerPushToken() νΈμΆ
[ν κΈ ON β OFF]:
β PUT /api/settings/me { pushEnabled: false }
β μ±κ³΅ μ unregisterPushToken() νΈμΆ
| κ΅¬λΆ | μ΄μ (λ‘컬) | νμ¬ (μλ²) |
|---|---|---|
| μ μ₯μ | AsyncStorage (PUSH_ENABLED_KEY) |
μλ² DB (/api/settings/me) |
| λ€μ€ λλ°μ΄μ€ | λλ°μ΄μ€λ³ λ°λ‘ κ΄λ¦¬ | κ³μ λ¨μλ‘ ν΅μΌ |
| ν μ°λ |
useFcmTokenκ° AsyncStorage μ‘°ν |
useFcmTokenκ° GET /api/settings/me μ‘°ν |
| κ΄λ ¨ νμΌ |
src/api/settings/{index,types}.ts μ κ· μμ± |
β |
| λ©μλ | μλν¬μΈνΈ | μ€λͺ |
|---|---|---|
| GET | /api/notifications |
μλ¦Ό λͺ©λ‘ μ‘°ν (page, size, is_read) |
| GET | /api/notifications/unread-count |
μ½μ§ μμ μλ¦Ό μ |
| GET | /api/notifications/stream |
SSE μ€μκ° μλ¦Ό ꡬλ |
| PUT | /api/notifications/{id}/read |
μλ¦Ό μ½μ μ²λ¦¬ |
| PUT | /api/notifications/read-all |
μ 체 μ½μ μ²λ¦¬ |
| DELETE | /api/notifications/{id} |
μλ¦Ό μμ |
| λ©μλ | μλν¬μΈνΈ | μ€λͺ |
|---|---|---|
| POST | /api/notifications/fcm-token |
FCM ν ν° λ±λ‘ |
| DELETE | /api/notifications/fcm-token |
FCM ν ν° μμ |
| λ©μλ | μλν¬μΈνΈ | μ€λͺ |
|---|---|---|
| GET | /api/settings/me |
μ¬μ©μ μλ¦Ό μ€μ μ‘°ν (pushEnabled λ±) |
| PUT | /api/settings/me |
μ¬μ©μ μλ¦Ό μ€μ κ°±μ |
| λΆλ₯ | νμΌ | μ€λͺ |
|---|---|---|
| API | api/notification/types.ts |
μλ¦Ό νμ μ μ (NotificationType, ActionType, PagedResponse λ±) |
| API | api/notification/index.ts |
μλ¦Ό API ν¨μ 7κ° |
| Store | stores/notificationStore.ts |
unreadCount μ μ μν |
| Hook | hooks/common/useNotifications.ts |
μλ¦Ό νλ©΄ λ°μ΄ν° κ΄λ¦¬ |
| Hook | hooks/common/useNotificationStream.ts |
SSE ꡬλ + λ±μ§ μ λ°μ΄νΈ |
| Hook | hooks/common/useFcmToken.ts |
λ‘κ·ΈμΈ μ FCM ν ν° μλ λ±λ‘ |
| Hook | hooks/common/useNotificationNavigation.ts |
νΈμ ν β λ₯λ§ν¬ |
| Util | utils/sse.ts |
XMLHttpRequest κΈ°λ° SSE ν΄λΌμ΄μΈνΈ |
| Util | utils/pushToken.ts |
ν ν° λ°κΈ/λ±λ‘/μμ μ νΈ |
| Screen | screens/common/NotificationScreen.tsx |
μλ¦Ό μμΈ νλ©΄ |
| Screen | screens/common/NotificationSettingsScreen.tsx |
μλ¦Ό μ€μ νλ©΄ |
| Component | components/common/notification/NotificationPopup.tsx |
Header μλ¦Ό νμ |