Actions
이슈 #426
진행중
CP
JL
이슈 #420: Redeem Code 시스템 — 사용권 발급/리딤/관리 (QR 코드 기반)
리딤 코드 SNS/문자 발송 기능
이슈 #426:
리딤 코드 SNS/문자 발송 기능
설명
개요¶
Redeem Code 시스템(#420)에서 발급된 코드를 SNS/문자 메시지로 자동 발송하는 기능을 구현한다.
발송 채널¶
| 채널 | 서비스 | 비고 |
|---|---|---|
| SMS | AWS SNS / Twilio | 국내 + 국제 발송 지원 |
| 카카오톡 | 카카오 비즈메시지 API | 템플릿 사전 승인 필요 |
| 이메일 | AWS SES / SendGrid | QR 코드 이미지 첨부 |
메시지 템플릿¶
[알페아] 사용권 코드가 도착했습니다!
리딤 코드: ALPHEA-XXXX-XXXX-XXXX
혜택: {reward_description}
유효기간: {expires_at}
앱에서 코드를 입력하시면 즉시 사용 가능합니다.
감사합니다.
발송 정책¶
- 배치 발급 시 자동 발송 옵션 제공 (Admin UI에서 토글)
- 발송 대상: 전화번호 또는 이메일 CSV 업로드
- 발송 시점: 코드 발급 즉시 OR 예약 발송 (크론 스케줄)
- 재발송: 수동 재발송 기능 제공 (발송 실패 시)
- 발송 이력: 발송 성공/실패 상태, 발송 시각, 에러 메시지 기록
DB 스키마 확장 (migrations/0009_redeem_code_delivery.sql)¶
CREATE TABLE redeem_code_deliveries (
id BIGSERIAL PRIMARY KEY,
code TEXT NOT NULL REFERENCES redeem_codes(code),
channel TEXT NOT NULL, -- 'sms' / 'kakao' / 'email'
recipient TEXT NOT NULL, -- 전화번호 / 이메일
template_id TEXT, -- 템플릿 ID (카카오톡 등)
status TEXT NOT NULL, -- 'pending' / 'sent' / 'failed'
sent_at TIMESTAMPTZ,
error_message TEXT,
provider_msg_id TEXT, -- 외부 서비스 메시지 ID
created_at TIMESTAMPTZ DEFAULT NOW(),
retry_count INT DEFAULT 0
);
CREATE INDEX idx_deliveries_code ON redeem_code_deliveries(code);
CREATE INDEX idx_deliveries_status ON redeem_code_deliveries(status);
Admin REST API 확장¶
POST /api/redeem-codes/batch/send # 배치 발송 (CSV + 채널 선택)
POST /api/redeem-codes/{code}/resend # 개별 재발송
GET /api/redeem-codes/{code}/deliveries # 발송 이력 조회
GET /api/delivery-logs # 전체 발송 로그 (필터: status/channel/date)
Dev Console UI 확장¶
Redeem Codes 탭 내 추가 기능:
- 발송 대상 CSV 업로드 폼 (columns: code, recipient, channel)
- 발송 채널 선택 (SMS / 카카오톡 / 이메일)
- 템플릿 프리뷰
- 발송 진행 상태 표시 (progress bar)
- 발송 이력 테이블 (코드별 발송 상태, 재발송 버튼)
외부 서비스 연동¶
AWS SNS (SMS)¶
// src/delivery/sns.rs
pub async fn send_sms(
phone: &str,
message: &str,
) -> Result<String, DeliveryError> {
// AWS SNS SDK 호출
}
카카오 비즈메시지¶
// src/delivery/kakao.rs
pub async fn send_kakao(
phone: &str,
template_id: &str,
params: HashMap<String, String>,
) -> Result<String, DeliveryError> {
// 카카오 비즈메시지 API 호출
}
AWS SES (Email)¶
// src/delivery/ses.rs
pub async fn send_email(
to: &str,
subject: &str,
body_html: &str,
attachments: Vec<Attachment>,
) -> Result<String, DeliveryError> {
// QR 코드 이미지를 첨부로 포함
}
구현 단계¶
-
Phase 1 — DB migration +
store/deliveries.rs -
Phase 2 — 외부 서비스 연동 모듈 (
src/delivery/) - Phase 3 — Admin REST API 확장
- Phase 4 — Dev Console UI 확장 (발송 폼 + 이력 테이블)
- Phase 5 — 배치 발송 스케줄러 (옵션)
환경 변수¶
# AWS SNS
AWS_SNS_REGION=ap-northeast-2
AWS_SNS_ACCESS_KEY_ID=...
AWS_SNS_SECRET_ACCESS_KEY=...
# 카카오 비즈메시지
KAKAO_API_KEY=...
KAKAO_SENDER_KEY=...
# AWS SES
AWS_SES_REGION=ap-northeast-2
AWS_SES_FROM_EMAIL=noreply@alphea.io
보안 고려사항¶
- 발송 대상 개인정보 (전화번호/이메일)는 암호화 저장 권장
- 발송 실패 시 민감 정보 로깅 금지
- Rate Limiting (분당 발송 건수 제한)
의존성¶
- #420 (Redeem Code 시스템) 선행 필수
- AWS SNS, Kakao, SES 계정 및 API 키 준비
Actions