개발지식 먹는 하마 님의 블로그
[내일배움캠프 82일차] AWS SES 서버 기반 메일 발송 본문
AWS SES도입
메일 발송 방식으로 AWS SES를 도입하기로 하였다.
AWS SES는 아마존에서 제공하는 메일 발송 서비스이다.
도입 이유
이전 테스트에서도 확인한 단점이지만 Gmail-SMTP는 연결을 재사용하지 않기 때문에 성능이 좋은 편은 아니기 때문이다.
메일 발송 개수가 100만 개까지 크게 증가한다면 결국 비동기를 도입했다 하더라도 여전히 발송에 오래 걸리기 때문이다.
SES는 연결을 재사용하기 때문에 대용량 메일 발송에 적합하다!
+ SendGrid 같은 다른 서비스들과 비교를 해보았을 때
비용이 그나마 가성비 있었다. (자동차 보험 중 캐럿 같은 느낌 - 쓴 만큼만 낸다!)
✅ 구현 및 테스트
SDK V1은 지원이 종료된다고 하기에 SDK V2 기반으로 구현하였다.
private final SpringTemplateEngine templateEngine;
private final SesV2Client sesV2Client;
public void sendQuizEmail(Subscription subscription, Quiz quiz) throws SesV2Exception {
Context context = new Context();
context.setVariable("toEmail", subscription.getEmail());
context.setVariable("question", quiz.getQuestion());
context.setVariable("quizLink", MailLinkGenerator.generateQuizLink(subscription.getSerialId(), quiz.getSerialId()));
context.setVariable("subscriptionSettings", MailLinkGenerator.generateSubscriptionSettings(subscription.getSerialId()));
String htmlContent = templateEngine.process("mail-template", context);
//수신인
Destination destination = Destination.builder()
.toAddresses(subscription.getEmail())
.build();
//이메일 제목
Content subject = Content.builder()
.data("[CS25] " + quiz.getQuestion())
.charset("UTF-8")
.build();
//html 구성
Content htmlBody = Content.builder()
.data(htmlContent)
.charset("UTF-8")
.build();
Body body = Body.builder()
.html(htmlBody)
.build();
Message message = Message.builder()
.subject(subject)
.body(body)
.build();
EmailContent emailContent = EmailContent.builder()
.simple(message)
.build();
SendEmailRequest emailRequest = SendEmailRequest.builder()
.destination(destination)
.content(emailContent)
.fromEmailAddress("CS25 <noreply@cs25.co.kr>")
.build();
sesV2Client.sendEmail(emailRequest);
}
SES는 동기 기반에서도 충분히 빠른 성능을 보였다.
위에서 언급했듯이 기존 연결을 재사용하기 때문이었다.
Gmail-SMTP에서는 반드시 필요했던 비동기 처리의 필요성이 조금은 줄어들었다...
그러나 발송해야할 메일 개수가 10000개 이상으로 증가한다면, 여전히 비동기 처리는 필요하다.
여담 - 샌드박스 모드
실제 발송을 테스트하기 위해서는 샌드박스 모드가 아닌 프로덕션 모드로 전환하는 과정이 필요하다.
자세한 과정을 다룬 글들은 워낙 많기 때문에 따로 정리하지는 않도록 하겠다.
샌드박스 모드 해제 경험이 다양하길래 그냥 나도 한 번 적어보려고 한다.
1차 시도
문서가 부족하다고 자료를 첨부해 달라는 메일이 왔다.
우리는 아직 배포 전이었지만 프로젝트를 설명하고 신뢰도를 높일 만한 수단을 고민하다가 다음 자료를 첨부했다.
- 배포를 위해 구매한 도메인 주소
- 발표를 위해 제작한 브로셔
- 그 외에 디테일한 상황 설명
디테일한 상황 설명을 한국어로 적어서 보냈다.
글로벌 시대답게 전세계적으로 서비스를 제공하는 업체들은 보통 기본적으로 고객센터 문의에 번역 기능이 깔려있고,
그게 아니더라도 번역이 매우 쉬운 세상이다.
거기다 아마존 정도라면 한국 전용 고객센터? 가 있을 것이라고 생각했기 때문이었다.
2일이 지났지만 별다른 답장이나 모드 전환이 되지 않았다.
(24시간 이내에 해준다며...! 나 거의 바로 회신한 건데!)
2차 시도
내 회신 메일이 저 뒤로 밀려났나 싶어서 회신 내용이 잘 확인된 건지 알고 싶다는 2차 메일도 보냈다.
그러나... 하루가 지나도 여전히 감감무소식이었다.
3차 시도
빨리 테스트해봐야 하는데...
혹시나 하는 마음에 여러 글들을 검색해 보았다.
이게 웬걸, 저 승인은 캐나다? 인가 어디서 직접 한단다.
이전에 보냈던 내용을 영어로 바꿔서 다시 보냈다.
자료와 내용 모두 이전과 동일하다.
그리고 드. 디. 어 프로덕션 모드 전환에 성공하였다!
(내가 진즉 번역기를 돌리는 성의를 보였어야 했었는데... 뼈아픈 실책이었다.)
모드 전환을 기다리면서 여러 글도 찾아보고 튜터님들께도 여쭤봤더니
아무래도 저 사람들도 기업이다 보니 사업성을 중요하게 보는 것 같고, 돈이 안 될 것 같으면 승인이 안되거나
요청한 자료가 부실하면 매우 오래 걸리는 경우도 있다는 것 같았다. (한 달 걸린 사람이 있다는 썰도 봄)
만약 AWS SES를 써야 하는 사람이 있다면 제일 먼저!! 프로덕션 전환부터 신청하고 개발을 하던 뭘 하길 바란다.
(본인은 개발 먼저 하고 배포 직전에 모드 전환하려다 가슴 졸였다...)
'내일배움캠프 (CS25)' 카테고리의 다른 글
[내일배움캠프] 모의 면접 (입문) 복기 (0) | 2025.06.26 |
---|---|
[내일배움캠프 80일차] 2차 리팩토링 - 멀티모듈, 쿼리 노출 보안 (0) | 2025.06.17 |
[내일배움캠프 79일차] 트러블 슈팅 Throttle 예외 - RateLimiter 적용 (0) | 2025.06.16 |
[내일배움캠프 78일차] 이메일 발송 흐름 성능 개선(비동기) (0) | 2025.06.13 |
[내일배움캠프 77일차] 이메일 발송 흐름 리팩토링 (0) | 2025.06.13 |