프로젝트

일반

사용자정보

Actions

이슈 #426

진행중
CP JL

이슈 #420: Redeem Code 시스템 — 사용권 발급/리딤/관리 (QR 코드 기반)

리딤 코드 SNS/문자 발송 기능

이슈 #426: 리딤 코드 SNS/문자 발송 기능

Chris Park이(가) 약 7시간 전에 추가함.

상태:
신규
우선순위:
높음
담당자:
목표버전:
시작일:
2026/04/30
완료일:
진척도:

0%

추정시간:

설명

개요

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

내보내기 PDF Atom