엔지니어링 · 2026년 9월 21일
트랜잭션 이메일 마이그레이션 플레이북
관측 가능성을 잃지 않고 트랜잭션 이메일 제공업체를 옮기려면 단계적 접근이 필요합니다. 이중 발송, 이벤트 동등성 매핑, 점진적 DNS 전환을 다룹니다.
마이그레이션의 핵심 과제
관측 가능성을 잃지 않고 트랜잭션 이메일을 마이그레이션하려면 발송 트리거를 제공업체 구현과 분리해야 합니다. 전략은 이중 발송(섀도잉)과 이벤트 매핑을 허용하는 제공업체 추상화 계층을 구현하는 것입니다. 웹훅으로 전송 이벤트를 계속 추적하면서 트래픽의 일부를 새 제공업체로 보내면, 주요 흐름을 전환하기 전에 새 제공업체가 메일을 수락하고 관측 파이프라인이 결과를 수집하는지 확인할 수 있습니다.
마이그레이션을 하는 이유
대부분의 마이그레이션은 비용, 개발자 경험, 컴플라이언스 때문에 이루어집니다. 예를 들어 제공업체 간 비용 차이는 상당합니다. Amazon SES 요금에 따르면 종량제 발송은 이메일 1,000통당 0.10 USD입니다. 반면 Postmark 요금은 월 15 USD에 10,000통부터 시작하며 초과분은 1,000통당 1.80~1.20 USD입니다. 이메일 50,000통을 보내는 비용은 SES 종량제에서 대략 5 USD이고 Postmark 요금제에서는 약 66 USD입니다.
다른 이유로는 EU 전용 개인정보 최소화 텔레메트리로의 전환이나 더 나은 에이전트 대응(MCP 서버 지원 등)의 필요성이 있습니다. 이유가 무엇이든 위험은 같습니다. 전환 기간 동안 전달 파이프라인에 사각지대가 생긴다는 것입니다.
1단계: 추상화 계층
비즈니스 로직에서 제공업체 SDK를 직접 호출한다면 종속된 상태입니다. 요청과 응답을 표준화하는 래퍼가 필요합니다.
통합 페이로드
제공업체에 종속되지 않는 내부 스키마를 정의하세요. 그러면 기반 API가 to를 배열로 기대하는지 단일 문자열로 기대하는지를 애플리케이션이 신경 쓰지 않아도 됩니다.
{
"message_id": "msg_12345",
"recipient": "user@example.com",
"template_id": "welcome_email",
"variables": {
"name": "Alex"
},
"idempotency_key": "unique_request_id_789"
}
AI 에이전트나 자동화된 워크플로를 다룰 때는 이메일 발송을 외부 부수 효과로 취급하는 것이 중요합니다. 재시도된 에이전트 루프가 같은 트랜잭션 이메일을 한 사용자에게 다섯 번 보내지 않도록 멱등성 키를 사용해야 합니다.
2단계: DNS와 ID 설정
이메일을 한 통이라도 보내기 전에 ID를 설정해야 합니다. 대부분의 마이그레이션이 DNS 전파 지연이나 잘못된 구성 때문에 실패하는 단계입니다.
- 도메인 검증: 새 제공업체의 DKIM과 SPF 레코드를 추가하세요. SendHQ 이메일 DNS 확인 도구 같은 도구로 레코드가 활성 상태이고 형식이 올바른지 확인하세요.
- 레코드 이해하기: SPF(서버를 승인)와 DKIM(메시지에 서명)의 차이를 이해해야 합니다. 마이그레이션 중에 여러 제공업체를 사용한다면 SPF 레코드에 둘 다 포함해야 합니다.
- DMARC 정렬: 정렬이 약간 어긋나 있을 때 하드 바운스가 발생하지 않도록 초기 마이그레이션 단계에서는 DMARC 정책을
p=none으로 설정하세요. 자세한 설정 단계는 SendHQ의 DKIM, SPF, DMARC 가이드를 참고하세요.
3단계: 섀도 발송(이중 발송)
스위치를 한 번에 전환하지 마세요. 대신 기존 제공업체로 발송하면서 비동기로 복제본(또는 샘플링한 비율)을 새 제공업체로도 보내는 라우팅 로직을 구현하세요.
구현 로직
async function sendEmail(payload) {
// Primary send (Current Provider)
const primaryResult = await primaryProvider.send(payload);
// Shadow send (New Provider) - do not await or block the main thread
if (Math.random() < 0.1) { // 10% sample
newProvider.send(payload).catch(err =>
console.error("Shadow send failed", err)
);
}
return primaryResult;
}
이 단계에서는 제공업체 수락을 테스트합니다. 제공업체가 "네, 이 메시지를 받겠습니다"라고 말하는 순간입니다. 이는 전달(메시지가 수신 서버에 도달)이나 받은편지함 도달(메시지가 스팸함을 피함)과는 다릅니다.
4단계: 관측 가능성과 이벤트 동등성
관측 가능성은 메시지를 sent에서 delivered 또는 bounced까지 추적할 수 있는 능력입니다. 제공업체마다 웹훅 스키마가 다릅니다.
이벤트 매핑하기
이벤트를 내부 데이터베이스에 맞게 정규화하는 매핑 표를 만드세요.
내부 이벤트 | Amazon SES | Resend | Postmark | SendHQ
sent | Send | sent | Sent | sent
delivered | Delivery | delivered | Delivered | delivered
bounced | Bounce | bounced | Bounced | bounced
complaint | Complaint | complained | Complaint | complaint
웹훅 페이로드 처리하기
웹훅 리스너는 범용적이어야 합니다. 새 제공업체에서 페이로드를 받으면 분석 엔진에 도달하기 전에 변환기를 거쳐 처리해야 합니다.
function transformWebhook(provider, payload) {
switch(provider) {
case 'resend':
return { event: payload.data.delivered ? 'delivered' : 'failed', id: payload.data.id };
case 'sendhq':
return { event: payload.event, id: payload.message_id };
default:
throw new Error("Unknown provider");
}
}
5단계: 점진적 전환
새 제공업체가 메일을 수락하고 웹훅이 이벤트를 올바르게 매핑하는 것을 확인했다면 가중치 기반 분배로 넘어가세요.
- 트래픽 1%: 전체 트랜잭션 메일의 1%를 새 제공업체로 보냅니다. 반송률을 모니터링하세요.
- 트래픽 10%: 부하를 늘립니다. 속도 제한을 확인하세요. 예를 들어 Resend의 무료 요금제는 하루 이메일 100통으로 제한되어 있어 테스트 중에 병목이 될 수 있습니다.
- 트래픽 50%: 안정성 테스트입니다. 지연 시간이 허용 가능한 수준으로 유지되는지 확인하세요.
- 트래픽 100%: 최종 전환입니다.
흔한 마이그레이션 실패 문제 해결
"조용한 누락"
일부 제공업체는 이메일을 수락(202 Accepted)하지만 콘텐츠 필터나 검증되지 않은 발신 ID 때문에 내부적으로 버립니다. 그래서 섀도 발송 단계는 생략할 수 없습니다. sent 이벤트는 많은데 delivered 이벤트가 적다면 API 문제가 아니라 전달 문제입니다.
속도 제한 급증
제공업체마다 버스트 한도가 다릅니다. Mailgun 요금과 SendGrid 요금(현재 무료 요금제에 60일 체험판을 사용)은 처리량 할당량이 서로 다른 경우가 많습니다. 한도가 높은 계정에서 새 계정으로 옮기면 제한을 받을 수 있습니다. RabbitMQ나 SQS 같은 큐를 구현해 급증을 완화하세요.
멱등성 실패
제공업체를 바꿀 때 배치를 실수로 재시도할 수 있습니다. AI 에이전트로 이메일을 실행한다면 에이전트가 고유한 요청 ID를 제공하도록 하세요. 에이전트가 MCP 서버로 이메일 API와 상호작용한다면 API는 24시간 이내의 중복된 idempotency_key 값을 거부해야 합니다.
마이그레이션 체크리스트
- 추상화 계층 구현됨(제공업체 중립 페이로드).
- 새 제공업체의 DNS 레코드(SPF, DKIM)가 추가되었습니다.
- sendhq.cc/tools/email-dns-checker로 DNS를 검증했습니다.
- 새 제공업체 스키마를 처리하도록 웹훅 리스너를 업데이트했습니다.
- 이벤트 매핑 표 완료됨(Sent, Delivered, Bounced, Complaint).
- 섀도 발송이 1%에서 10%로 활성화되어 있습니다.
- 에이전트 주도 발송의 멱등성 키가 검증되었습니다.
- 점진적 램프업(1%, 10%, 50%, 100%).
- 100% 안정화 후 7일이 지나면 이전 제공업체 API 키를 폐기했습니다.
제공업체 선택에 대한 마무리 생각
제공업체 선택은 비용과 개발 속도 사이의 트레이드오프입니다. 절대적으로 가장 낮은 비용이 필요하다면 종량제 이메일 1,000통당 0.10 USD인 Amazon SES를 이기기 어렵습니다. 다만 2026년 7월 21일 기준으로 새 요금제(Essentials 0.16 USD, Pro 0.22 USD)는 다른 비용 구조를 도입했습니다. 에이전트 대응이 기본 제공되고 EU 전용 개인정보 최소화 텔레메트리를 갖춘 최신 API가 필요하다면 SendHQ가 간결한 대안을 제공합니다.
어떤 제공업체를 쓰든 목표는 엔지니어링 팀이 특정 업체의 SDK에 묶이지 않게 하는 것입니다. 이메일을 표준화된 부수 효과로 다루면 위험도가 높은 마이그레이션이 일상적인 구성 변경으로 바뀝니다.
안정적인 이메일 워크플로를 구축하는 방법은 https://sendhq.cc 에서 더 알아보세요.