본문으로 건너뛰기

이메일 서비스 (Email Service)

문서 정보

  • 작성일: 2026-03-29
  • 최종 업데이트: 2026-03-29
  • 버전: v1.0.0

TL;DR

회원가입 환영 이메일과 Trial 만료 알림 이메일을 자동으로 발송하는 시스템입니다. 현재 Resend를 사용하며, 향후 AWS SES로 전환 예정입니다.


목차

  1. 핵심 개념
  2. 발송되는 이메일
  3. 아키텍처
  4. 환경 설정
  5. 이메일 템플릿
  6. Trial 만료 팝업 연동
  7. V2 SES 전환 계획
  8. FAQ

핵심 개념

용어설명
Resend트랜잭셔널 이메일 발송 서비스 (현재 사용 중)
AWS SESAmazon Simple Email Service (V2 전환 예정)
best-effort이메일 발송 실패 시 로그만 기록하고 핵심 로직에 영향 없음
shouldShowTrialExpiredNoticeTrial 만료 팝업 표시 여부 플래그

발송되는 이메일

1. 회원가입 환영 이메일

항목내용
트리거회원가입 완료 시
발신자Spoclip <noreply@spoclip.ai>
제목[Spoclip] 가입을 환영합니다! 14일 PRO 체험을 시작하세요
내용PRO 체험 혜택 안내 (4K UHD, 콕 디바이스 연동, 광고 제거 등)
CTA앱에서 확인하기 → https://spoclip.ai
발송 방식best-effort (실패해도 회원가입 성공)

2. Trial 만료 이메일

항목내용
트리거Trial 만료 스케줄러 (매일 03:00 KST)
발신자Spoclip <noreply@spoclip.ai>
제목[Spoclip] 체험 기간이 만료되었어요
내용잃어버린 혜택 목록 + 멤버십 가입 유도
CTA멤버십 시작하기 → https://spoclip.ai/ticket
발송 방식best-effort (실패 시 로그 기록)

아키텍처

┌──────────────────────────────────────────────────┐
│ 소비자 코드 │
│ │
│ MemberAuthService ExpireEntitlementScheduler
│ (회원가입 시) (Trial 만료 시) │
└──────┬──────────────────────────┬─────────────────┘
│ │
▼ ▼
┌──────────────────────────────────────────────────┐
│ ResendInfraService │
│ (@Global, Injection Token) │
│ │
│ sendEmail({ to, subject, html }) │
└──────────────────┬───────────────────────────────┘


┌──────────────────────────────────────────────────┐
│ Resend API │
│ (spoclip.ai 도메인 인증) │
└──────────────────────────────────────────────────┘

모듈 구조

src/infra/resend/
├── constants/resend-infra.constant.ts # Injection Token
├── interfaces/resend-infra.service.interface.ts
├── types/resend-infra.type.ts # ISendEmailParams, ISendEmailResult
├── templates/
│ ├── signup-welcome.template.ts # 회원가입 환영 HTML
│ └── trial-expired.template.ts # Trial 만료 HTML
├── resend-infra.service.ts # Resend API 호출
├── resend-infra.module.ts # @Global() 모듈
└── index.ts

환경 설정

# .env
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxxx
RESEND_FROM_EMAIL=Spoclip <noreply@spoclip.ai>
변수설명
RESEND_API_KEYResend API 키
RESEND_FROM_EMAIL발신자 이름 + 이메일

도메인 인증

spoclip.ai 도메인이 Resend에 인증되어 있습니다 (Cloudflare DNS에 SPF/DKIM 레코드 추가).


이메일 템플릿

두 템플릿 모두 앱 내 UI 디자인과 통일된 다크 테마를 적용합니다.

요소
배경색#1a1a1a
카드 배경#2a2a2e
CTA 버튼#6B8AFF
혜택 박스#333338
카드 라운딩20px

템플릿은 순수 HTML 함수로 구현되어 있어 외부 의존성이 없습니다.


Trial 만료 팝업 연동

이메일과 별도로, 앱 진입 시 Trial 만료 팝업을 표시하는 기능이 함께 구현되어 있습니다.

클라이언트 Flow

앱 진입 → GET /users/me

shouldShowTrialExpiredNotice === true?
↓ YES
팝업 표시

PATCH /marketing-policy/trial/expired-notice (204)

다음 진입 시 shouldShowTrialExpiredNotice === false

API 응답 예시

// 팝업 표시 필요
{
"entitlement": {
"activePlan": "FREE",
"trial": null,
"subscription": null,
"shouldShowTrialExpiredNotice": true
}
}

// 팝업 불필요 (이미 확인 또는 Trial 없음)
{
"entitlement": {
"activePlan": "FREE",
"trial": null,
"subscription": null,
"shouldShowTrialExpiredNotice": false
}
}

설계 포인트

  • trial 객체는 Trial ACTIVE 상태일 때만 반환
  • 만료된 Trial 정보는 팝업에 불필요하므로 trial: null
  • 팝업 확인 완료 시 DB 쿼리 자체를 스킵하여 비용 절감

V2 SES 전환 계획

Resend 무료 한도(3,000통/월)를 초과할 경우 AWS SES로 전환 예정입니다.

항목현재 (V1)예정 (V2)
ProviderResendAWS SES
무료 한도3,000통/월62,000통/월 (EC2)
인증 방식API KeyIAM Role
도메인spoclip.ai (Resend 인증)spoclip.ai (SES 인증 필요)

전환 전략

  • 범용 IEmailInfraService 인터페이스로 리팩토링
  • EMAIL_PROVIDER=ses|resend 환경변수로 런타임 provider 선택
  • 개발 환경은 Resend 유지, 프로덕션만 SES
  • 상세 계획: .omc/plans/v2-resend-to-ses-migration.md

선행 조건

  • AWS SES sandbox 해제 승인
  • SES에서 spoclip.ai 도메인 DKIM/SPF 인증

FAQ

Q: 이메일 발송이 실패하면 어떻게 되나요?

A: 모든 이메일 발송은 best-effort입니다. 실패해도 회원가입이나 Trial 만료 처리에 영향 없으며, 서버 로그에 경고만 기록됩니다.

Q: 사용자가 이메일을 등록하지 않았으면?

A: 소셜 로그인 시 이메일이 없는 경우(userInfo.email = null) 이메일 발송을 건너뜁니다. DB에 저장된 이메일은 암호화되어 있어 발송 시 복호화 후 사용합니다.

Q: Resend 무료 한도가 초과되면?

A: Resend는 한도 초과 시 발송이 차단됩니다. 에러 로그가 기록되며, SES 전환(V2)을 통해 해결 예정입니다.