๐ฃ ์๋ฆผ ์์คํ
Phase 1 ๋ฐ์นญ ํ์. ์์ฝยท์ธ์
ยท๊ฒฐ์ ยท์ ์ฐยท๋งค์นญ ์๋ฆผ.
์ฑ๋
| ์ฑ๋ |
์ฉ๋ |
๋น์ฉ |
| ํธ์ (FCMยทAPNs) |
์ธ์ฑ ์๋ฆผ (์ค์๊ฐ) |
๋ฌด๋ฃ |
| ์นด์นด์ค ์๋ฆผํก |
ํต์ฌ ํธ๋์ญ์
(Solapi) |
ํ๋น ~10์ |
| SMS |
์๋ฆผํก ์คํจ ์ fallback |
ํ๋น ~20์ |
| ์ด๋ฉ์ผ |
์์์ฆยท์ฝ๊ด ๋ณ๊ฒฝยท๋ง์ผํ
|
๋ฌด๋ฃ (์์ฒด SMTP ๋๋ SendGrid) |
| ์ธ์ฑ (๋ฒจ ์์ด์ฝ) |
๋ชจ๋ ์๋ฆผ ๋ณด๊ด |
๋ฌด๋ฃ |
์๋ฆผ ์นดํ
๊ณ ๋ฆฌ
ํธ๋์ญ์
(ํ์, ์ตํธ์์ โ)
- ์์ฝ ํ์ ยท๋ณ๊ฒฝยท์ทจ์ (ํ์ยท๋ฉํ )
- ์ธ์
์๋ฐ (T-1h, T-15๋ถ, T-5๋ถ)
- ๋งค์นญ (๋ฉํ ์๊ฒ ํ์ ๋งค์นญ)
- ๊ฒฐ์ ์ฑ๊ณตยท์คํจยท๊ฐฑ์ ์๋ฆผ
- ํ๋ถ ์ฒ๋ฆฌ
- ์ ์ฐ ์
๊ธ (๋ฉํ )
- ๋ฉํ ๋
ธ์ผ ๋ณด์
์ด์ (ํ์)
- ํ๊ฐ ์์ฒญ (T+90 ํ)
- ๋ฉํ ์ปดํ๋ ์ธ ๋ฑ๋ก
- ๋ฑ๊ธ ๋ณ๋ (Pro ์ธ์ฆ ํต๊ณผยท๋ฑ๊ธ ๋ณด๋ฅ)
- ์ผ์์ ์ง ์์ยท์ข
๋ฃ
- ์ฝ์ ๋ง๋ฃ ์๋ฐ (D-7)
๋ง์ผํ
(์ตํธ์ธ, ๋ณ๋ ๋์)
- ์ ๊ท ๋ฉํ ์ถ์ฒ
- ํ๋ก๋ชจ์
ยท์ด๋ฒคํธ
- AI ์๊ฐ ๋ถ์
ํธ๋ฆฌ๊ฑฐ ๋งคํธ๋ฆญ์ค
| ์ด๋ฒคํธ |
ํ์ |
๋ฉํ |
๊ด๋ฆฌ์ |
| ํ์ ์์ฝ ํ์ |
ํธ์ + ์๋ฆผํก |
ํธ์ |
- |
| ์ธ์
์๋ฐ T-1h |
ํธ์ |
ํธ์ |
- |
| ์ธ์
์๋ฐ T-15๋ถ |
ํธ์ |
ํธ์ (ํ์ ์ ๋ณด) |
- |
| ํ์ ๋
ธ์ผ (T+15) |
ํธ์ (ํ์ฐจ ์ฐจ๊ฐ) |
- |
์ธ์ฑ |
| ๋ฉํ ๋
ธ์ผ (T+15) |
ํธ์ + ์๋ฆผํก (๋ณด์) |
ํธ์ (ํจ๋ํฐ) |
ํธ์ (๊ธด๊ธ) |
| ๋ฉค๋ฒ์ญ ๊ฐฑ์ D-7 |
ํธ์ + ์ด๋ฉ์ผ |
- |
- |
| ์ ์ฐ ์
๊ธ (๊ฒฉ์ฃผ) |
- |
ํธ์ + ์ด๋ฉ์ผ |
- |
| Pro ์ธ์ฆ ํต๊ณผ |
- |
ํธ์ + ์ด๋ฉ์ผ |
- |
| ์ปดํ๋ ์ธ ๋ฑ๋ก |
์ธ์ฑ (์ ์ ํ์ธ) |
ํธ์ + ์ด๋ฉ์ผ |
ํธ์ (๊ธด๊ธ) |
| ๊ฒฐ์ ์คํจ |
ํธ์ + ์๋ฆผํก |
- |
- |
| 6h ์ด๋ด ์ทจ์ (ํ์) |
์ธ์ฑ (ํ์ฐจ ์ฐจ๊ฐ ์๋ด) |
์๋ฆผํก (๋ณด์) |
์ธ์ฑ |
๋ฐ์ดํฐ ๋ชจ๋ธ
type NotificationChannel = 'push' | 'kakao' | 'sms' | 'email' | 'in_app'
type NotificationType = 'transaction' | 'operations' | 'marketing'
interface NotificationTemplate {
id: string
type: NotificationType
eventKey: string // "session_imminent_t-1h"
channels: NotificationChannel[]
titleTemplate: string // "{memberName}๋ 1์๊ฐ ํ ์ธ์
์์"
bodyTemplate: string
kakaoTemplateCode?: string // Solapi ํ
ํ๋ฆฟ ์ฝ๋
}
interface NotificationDelivery {
id: string
templateId: string
recipientType: 'member' | 'mentor' | 'admin'
recipientId: string
channel: NotificationChannel
status: 'pending' | 'sent' | 'failed' | 'bounced'
sentAt?: string
payload: Record<string, any>
errorMessage?: string
}
interface NotificationPreference {
recipientType: string
recipientId: string
marketingOptIn: boolean
channels: { push: boolean, kakao: boolean, sms: boolean, email: boolean }
}
์นด์นด์ค ์๋ฆผํก (Solapi)
- ๋ณธ์ฌ ์นด์นด์ค ์ฑ๋ (
@PT-Platform ๊ฐ์ค) ๋ฑ๋ก
- ์๋ฆผํก ํ
ํ๋ฆฟ ์ฌ์ ์น์ธ (Solapi ์ฝ์)
- ํ์ยท๋ฉํ ์ ํด๋ํฐ ๋ณธ์ธ ์ธ์ฆ ์ ๋์ ์๋ ์ฒ๋ฆฌ
- ์๋ฆผํก ์คํจ ์ SMS fallback
API ์๋ํฌ์ธํธ
POST /api/notifications/internal/send โ ์์คํ
๋ด๋ถ ํธ์ถ (์ด๋ฒคํธ ๊ธฐ๋ฐ)
GET /api/notifications/me โ ๋ด ์๋ฆผ ๋ฆฌ์คํธ (์ธ์ฑ)
PATCH /api/notifications/me/:id/read โ ์ฝ์ ์ฒ๋ฆฌ
PATCH /api/notifications/me/preferences โ ์ฑ๋ยท๋ง์ผํ
์ค์
์ด์
- Queue ์์คํ
(Redis ๋ฑ) โ ์๋ฆผ ๋ฐ์ก ๋น๋๊ธฐ ์ฒ๋ฆฌ
- ์ฌ์๋ ์ ์ฑ
(์คํจ ์ 5๋ถยท30๋ถยท2h ๊ฐ๊ฒฉ)
- ๋ชจ๋ํฐ๋ง (์ฑ๊ณต๋ฅ ยท์ง์ฐ ์๊ฐ)
- ์ตํธ์์ ์ฒ๋ฆฌ (๋ง์ผํ
๋ง โ ํธ๋์ญ์
์ ๊ฐ์ )
๋น์ฉ ์ถ์ (Phase 1, 1์ง์ )
- ํ์ 200๋ช
ร ์ ํ๊ท 8 ์๋ฆผํก = 1,600๊ฑด ร 10์ = 16,000์/์
- ๋ฉํ 12๋ช
ร ์ 100 ์๋ฆผ = 1,200๊ฑด ร 10์ = 12,000์/์
- SMS fallback (10% ๊ฐ์ ) = ~5,000์/์
- ํธ์ยท์ด๋ฉ์ผ = ๋ฌด๋ฃ
- ํฉ โ 33,000์/์/์ง์
| 2026-05-13 |
์ด์ โ 5์ฑ๋ + ์นดํ
๊ณ ๋ฆฌ + ํธ๋ฆฌ๊ฑฐ ๋งคํธ๋ฆญ์ค + ๋ฐ์ดํฐ ๋ชจ๋ธ |