들어가며1편에서는 Gmail SMTP의 하루 발송량 제한인 500건을 넘지 않기 위해 BCC를 도입하여 발송량 자체를 줄였다. 2편에서는 서킷브레이커 패턴을 활용해 Gmail SMTP의 하루 발송량을 초과하더라도 정상적으로 이메일을 발송할 수 있는 시스템을 구현하였다. 3편에서는 Transactional Outbox 패턴을 적용하여 네트워크 장애, 비동기 스레드 풀 포화, 애플리케이션 종료 상황에서도 최소 1회 이메일 전송을 보장하였다. 이번 편에서는 어떻게 AWS SES의 초당 14건 전송 제한에 맞춰 초당 전송량 초과 예외 없이 이메일을 전송했는지에 관해 작성할 예정이다. 배경서비스 운영 중 다음과 같은 에러가 발생했다.org.springframework.mail.MailSendException: F..
배경 1편에서는 Gmail SMTP의 하루 발송량 제한인 500건을 넘지 않기 위해 BCC를 도입하여 발송량 자체를 줄였다. 2편에서는 서킷브레이커 패턴을 활용해 Gmail SMTP의 하루 발송량을 초과하더라도 정상적으로 이메일을 발송할 수 있는 시스템을 구현하였다. 이번 편에서는 이메일을 최소 한번 보내도록 보장하기 위해 어떻게 구현했는지에 관해 작성할 예정이다. 현재 시스템의 문제점 현재 이메일을 보낼때 JavaMailSender를 통해 비동기로 보내고 있다. 이 구조에서는 이메일이 보내지지 않을 수 있는데 이는 다음 이유때문이다. 이메일을 보낼때 SMTP 서버에게 데이터를 보내야 한다. 이때 네트워크를 타기 때문에 패킷이 유실되거나, 네트워크 지연, 네트워크 다운등의 이유로 데이터를 보내지 못할..
배경 저번 글에서는 Gmail SMTP의 하루 발송량 제한인 500건을 넘지 않기 위해 BCC를 도입하여 발송량 자체를 줄였다. 하지만 BCC 방식은 어디까지나 임시방편일 뿐이다. BCC로 발송량을 조금 줄일 수는 있지만, 500건 제한을 근본적으로 해결하는 방법은 아니기 때문이다. 그래서 실제로 500건을 넘어가는 상황이 발생했을 때 어떻게 처리할지도 함께 고민해야 했다. 이번 글에서는 하루 발송량이 500건을 넘었을 때 어떻게 대처했는지 공유한다.500건이 넘는다면? 하루 발송량이 500건을 초과해 Gmail SMTP 서버로부터 실패 응답을 받게 되면 어떻게 처리해야 할까? 다른 SMTP 서버로 전환해야 할까? 아니면 애초에 하루 발송량 제한이 높은 다른 서비스로 완전히 옮겨야 할까? 결론부터 말하자..
배경 우아한테크코스에서 진행 중인 팀 프로젝트에서는 사용자가 속한 조직에서 이벤트가 주최되면, 알림을 설정한 사용자들에게 이메일을 보내고 있다. 추가로 이벤트 신청 마감 30분 전, 이벤트 시작 하루 전에도 리마인더 이메일을 보내고 있다. 여기서 중요한 점은 이메일을 ‘확실하게’ 보내야 한다는 것이다. 이벤트 리마인더 성격의 서비스다 보니, 이벤트가 열렸다는 이메일을 제때 전달하지 못하면 특히 선착순 이벤트에서는 사용자가 참여하고 싶어도 참여하지 못할 수 있다. 그래서 이 글에서는 어떻게 하면 이메일을 신뢰성 있게 보낼 수 있을지에 대해 정리해보려고 한다. Gmail SMTP 하루 발송량 초과 우리는 처음에 Gmail SMTP만 사용해서 이메일을 보내고 있었다. 사이드 프로젝트에서도 여러 번 써봐서 충분..
약 2달 만에 쓰는 미션 1 회고.. 기억이 가물가물 하지만 최대한 써보겠다! 미리 쓰자.. 🚪레벨 2 첫 미션 시작 레벨 2 첫 미션의 페어는 모코였다. 모코와 나 둘다 스프링을 해본 경험이 있어, 이번 미션은 레벨 1 미션들에 비해서는 꽤나 쉬운 편에 속했다. 그래서 미션보다는 스프링의 내부 동작에 대해 더 깊이 파보는 시간을 가졌다. 레벨 2를 시작하면서 다짐한것은 내가 고민한 부분에 대해 기록하는 것이었다. 레벨 1에서는 이러한 기록을 하지 않아 레벨 1이 다 끝난 이후에 내가 무엇을 배웠는지, 어떤 것들을 했는지 생각이 나질 않았다. 모코가 미션을 진행하며 고민을 적어두는 노션 템플릿을 마침 가지고 있어, 해당 템플릿을 얻어 여기다가 고민들을 적기 시작했다. 1️⃣ [1 ~ 3 단계] 방탈출 ..
배경우테코에서 미션을 진행하며 테이블 초기화를 위해 schema.sql 파일을 이용하게 되었고, 그 과정에서 스프링을 시작하면 어떻게 schema.sql 파일을 실행시키는지 궁금해져 디버깅을 통해 알아보고자 이 글을 작성하게 되었다.학습 내용@Configuration( proxyBeanMethods = false)@ConditionalOnMissingBean({SqlDataSourceScriptDatabaseInitializer.class, SqlR2dbcScriptDatabaseInitializer.class})@ConditionalOnSingleCandidate(DataSource.class)@ConditionalOnClass({DatabasePopulator.class})class DataSo..
들어가며 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 이용하면 부모 클래스가 가지고 있는 멤버변수와 메서드를 사용할 수 있어 코드 재사용을 할때 효과적이라고 한다. 그렇다면 상속은 언제 사용하는것이 좋을까? 상속을 사용하는 이유 상속을 왜 사용할까? 상속은 두가지 용도로 사용된다. 첫번째는 타입 계층을 구현하는 것이고 두번째는 코드 재사용이다. 객체지향 프로그래밍에서 타입 계층을 구현한다는 의미는 무엇일까? 객체지향 프로그래밍에서 타입을 정의하는 것은 객체의 퍼블릭 인터페이스를 정의하는 것과 동일하다. 즉, 객체의 퍼블릭 인터페이스가 객체의 타입을 결정한다. 따라서 동일한 퍼블릭 인터페이스를 제공하는 객체들은 동일한 타입으로 분류된다. 여기서 중요한 사실은 객체의 타입..
개발의 시작 개발의 본격적인 시작은 군대 입대 3개월전이었다. 입대전 할것도 마땅치 않아 무언가라도 해보고 싶었던 나는 우연히 프론트 개발에 대해 알게되었다. 예전에 형이 학교에서 만들어온 사이트를 내게 보여준 적이 있었는데, 정말 신기하기도 했고 어떻게 저걸 만들 수 있을지 궁금했다. 컴공 1학년을 마쳤지만, 전공수업때 배운건 C언어, 파이썬 뿐이라 그런건 도대체 어떻게 만드는지 궁금했다. 그래서 처음에 웹사이트를 한번 만들어 보자고 다짐했다. 처음에는 생활코딩의 web강의를 들으며 html, css, js가 무엇인지 알게되었고 조금이나마 무언가를 내 손으로 직접 만들 수 있었다. 단지 컴퓨터밖에 없는데 무언가가 내뜻대로 만들어지고 바로 눈에 보이니 그때부터 개발에 대한 매력에 빠진 것 같다. 그렇게..
