<aside> 👉

동기/비동기 및 Spring 비동기 학습 자료

Spring 에서의 메일 전송 with SMTP

</aside>

문제 상황

서비스 코드

@Service
@RequiredArgsConstructor
public class EmailService {

		private final JavaMailSender emailSender;
		
		public void sendEmail(EmailRequest emailRequest) {
        MimeMessage emailForm = createEmailForm(emailRequest);
        emailSender.send(emailForm);
    }

}
public record EmailRequest(
        String recipient,
        String subject,
        String text
) { }
private MimeMessage createEmailForm(EmailRequest emailRequest) {
    try {
        MimeMessage message = emailSender.createMimeMessage();
        message.addRecipients(TO, emailRequest.recipient());
        message.setSubject(emailRequest.subject());
        message.setText(emailRequest.text(), "utf-8", "html");

        return message;
    } catch (Exception e) {
        throw new CustomCommonException(CommonErrorCode.UNABLE_TO_SEND_EMAIL);
    }
}

메일 전송 로직 실행 시간 측정

@Timer
public void sendEmail(EmailRequest emailRequest) {
    ...
}
public class EmailTest extends IntegrationTest {

    @Autowired
    private EmailService emailService;

		// JavaMailSender의 기능을 그대로 사용하며, Mock 객체의 기능인 실행 횟수 검증 사용을 위해서 @SpyBean 선언
    @SpyBean
    private JavaMailSender mailSender;

    @Test
    public void 메일_전송_성공() {
        // given
        final EmailRequest emailRequest = EmailRequest.builder()
                .recipient("[email protected]")
                .subject("테스트 메일")
                .text("메일 내용")
                .build();

        // when
        emailService.sendEmail(emailRequest);

        // then
        verify(mailSender, times(1)).send((MimeMessage) any());
    }
}
c.l.ordermanage.common.timer.TimerAop    : sendEmail - total time : 3.408221792초

<aside> <img src="/icons/question-mark_red.svg" alt="/icons/question-mark_red.svg" width="40px" />

메일 전송 시, 3초 정도의 시간이 걸리는 이유

비동기 적용