From f361cbe9ce5fd45de81373e9c416bbf9c69fc01c Mon Sep 17 00:00:00 2001 From: lcomment Date: Thu, 29 Aug 2024 23:27:51 +0900 Subject: [PATCH] =?UTF-8?q?Refactor=20|=20CAKK-58=20|=20=ED=85=9C=ED=94=8C?= =?UTF-8?q?=EB=A6=BF=20=EC=BD=9C=EB=B0=B1=20=ED=8C=A8=ED=84=B4=20=EC=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VerificationCodeSendTemplateConfig.java | 30 +++++++++++ .../api/listener/EmailSendEventListener.java | 14 +++--- .../java/com/cakk/api/mapper/EventMapper.java | 5 ++ .../listener/EmailSendEventListenerTest.java | 9 ++-- .../VerificationCodeMessageExtractor.kt | 8 +++ .../VerificationCodeMimeMessageExtractor.kt | 50 +++++++++++++++++++ .../com/cakk/external/sender/EmailSender.kt | 44 ++-------------- .../template/VerificationCodeSendTemplate.kt | 28 +++++++++++ .../cakk/external/vo/VerificationMessage.kt | 6 +++ 9 files changed, 144 insertions(+), 50 deletions(-) create mode 100644 cakk-api/src/main/java/com/cakk/api/config/VerificationCodeSendTemplateConfig.java create mode 100644 cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMessageExtractor.kt create mode 100644 cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMimeMessageExtractor.kt create mode 100644 cakk-external/src/main/java/com/cakk/external/template/VerificationCodeSendTemplate.kt create mode 100644 cakk-external/src/main/java/com/cakk/external/vo/VerificationMessage.kt diff --git a/cakk-api/src/main/java/com/cakk/api/config/VerificationCodeSendTemplateConfig.java b/cakk-api/src/main/java/com/cakk/api/config/VerificationCodeSendTemplateConfig.java new file mode 100644 index 00000000..d2728629 --- /dev/null +++ b/cakk-api/src/main/java/com/cakk/api/config/VerificationCodeSendTemplateConfig.java @@ -0,0 +1,30 @@ +package com.cakk.api.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.cakk.external.extractor.VerificationCodeMessageExtractor; +import com.cakk.external.sender.MessageSender; +import com.cakk.external.template.VerificationCodeSendTemplate; + +@Configuration +public class VerificationCodeSendTemplateConfig { + + private final MessageSender messageSender; + private final VerificationCodeMessageExtractor verificationCodeMessageExtractor; + + public VerificationCodeSendTemplateConfig( + @Qualifier("emailSender") + MessageSender messageSender, + VerificationCodeMessageExtractor verificationCodeMessageExtractor + ) { + this.messageSender = messageSender; + this.verificationCodeMessageExtractor = verificationCodeMessageExtractor; + } + + @Bean + public VerificationCodeSendTemplate verificationCodeSendTemplate() { + return new VerificationCodeSendTemplate(messageSender, verificationCodeMessageExtractor); + } +} diff --git a/cakk-api/src/main/java/com/cakk/api/listener/EmailSendEventListener.java b/cakk-api/src/main/java/com/cakk/api/listener/EmailSendEventListener.java index 7849d788..e7a7d6fa 100644 --- a/cakk-api/src/main/java/com/cakk/api/listener/EmailSendEventListener.java +++ b/cakk-api/src/main/java/com/cakk/api/listener/EmailSendEventListener.java @@ -8,24 +8,26 @@ import com.cakk.api.annotation.ApplicationEventListener; import com.cakk.api.dto.event.EmailWithVerificationCodeSendEvent; -import com.cakk.external.sender.MessageSender; +import com.cakk.api.mapper.EventMapper; +import com.cakk.external.template.VerificationCodeSendTemplate; +import com.cakk.external.vo.VerificationMessage; @ApplicationEventListener public class EmailSendEventListener { - private final MessageSender messageSender; + private final VerificationCodeSendTemplate verificationCodeSendTemplate; public EmailSendEventListener( - @Qualifier("emailSender") - MessageSender messageSender + VerificationCodeSendTemplate verificationCodeSendTemplate ) { - this.messageSender = messageSender; + this.verificationCodeSendTemplate = verificationCodeSendTemplate; } @Async @EventListener public void sendEmailIncludeVerificationCode(EmailWithVerificationCodeSendEvent event) { - messageSender.send(Objects.requireNonNull(event.email()), Objects.requireNonNull(event.code())); + final VerificationMessage verificationMessage = EventMapper.supplyVerificationMessageBy(event); + verificationCodeSendTemplate.sendMessageForVerificationCode(verificationMessage); } } diff --git a/cakk-api/src/main/java/com/cakk/api/mapper/EventMapper.java b/cakk-api/src/main/java/com/cakk/api/mapper/EventMapper.java index 17eb2af9..52b8a7bf 100644 --- a/cakk-api/src/main/java/com/cakk/api/mapper/EventMapper.java +++ b/cakk-api/src/main/java/com/cakk/api/mapper/EventMapper.java @@ -9,6 +9,7 @@ import com.cakk.api.dto.event.IncreaseSearchCountEvent; import com.cakk.domain.mysql.event.shop.CertificationEvent; import com.cakk.external.vo.CertificationMessage; +import com.cakk.external.vo.VerificationMessage; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class EventMapper { @@ -42,4 +43,8 @@ public static CertificationMessage supplyCertificationMessageBy(final Certificat longitude ); } + + public static VerificationMessage supplyVerificationMessageBy(final EmailWithVerificationCodeSendEvent event) { + return new VerificationMessage(event.email(), event.code()); + } } diff --git a/cakk-api/src/test/java/com/cakk/api/listener/EmailSendEventListenerTest.java b/cakk-api/src/test/java/com/cakk/api/listener/EmailSendEventListenerTest.java index 409027b0..59cca7fe 100644 --- a/cakk-api/src/test/java/com/cakk/api/listener/EmailSendEventListenerTest.java +++ b/cakk-api/src/test/java/com/cakk/api/listener/EmailSendEventListenerTest.java @@ -12,6 +12,7 @@ import com.cakk.api.common.base.MockitoTest; import com.cakk.api.dto.event.EmailWithVerificationCodeSendEvent; import com.cakk.external.sender.MessageSender; +import com.cakk.external.template.VerificationCodeSendTemplate; class EmailSendEventListenerTest extends MockitoTest { @@ -19,7 +20,7 @@ class EmailSendEventListenerTest extends MockitoTest { private EmailSendEventListener emailSendEventListener; @Mock - private MessageSender messageSender; + private VerificationCodeSendTemplate verificationCodeSendTemplate; private EmailWithVerificationCodeSendEvent eventFixture() { return getConstructorMonkey().giveMeBuilder(EmailWithVerificationCodeSendEvent.class) @@ -33,13 +34,13 @@ void sendEmailIncludeVerificationCode() { // given EmailWithVerificationCodeSendEvent event = eventFixture(); - doNothing().when(messageSender).send(event.email(), event.code()); + doNothing().when(verificationCodeSendTemplate).sendMessageForVerificationCode(any()); // when assertDoesNotThrow(() -> emailSendEventListener.sendEmailIncludeVerificationCode(event)); // then - verify(messageSender, times(1)).send(event.email(), event.code()); + verify(verificationCodeSendTemplate, times(1)).sendMessageForVerificationCode(any()); } @TestWithDisplayName("이벤트에 null 데이터가 포함돼 있으면, 메일 전송 메서드가 호출 시, 에러를 반환한다.") @@ -54,6 +55,6 @@ void sendEmailIncludeVerificationCode2() { ); // then - verify(messageSender, times(0)).send(event.email(), event.code()); + verify(verificationCodeSendTemplate, times(0)).sendMessageForVerificationCode(any()); } } diff --git a/cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMessageExtractor.kt b/cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMessageExtractor.kt new file mode 100644 index 00000000..ff55c0a1 --- /dev/null +++ b/cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMessageExtractor.kt @@ -0,0 +1,8 @@ +package com.cakk.external.extractor + +import com.cakk.external.vo.VerificationMessage + +fun interface VerificationCodeMessageExtractor { + + fun extract(verificationMessage: VerificationMessage): T +} diff --git a/cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMimeMessageExtractor.kt b/cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMimeMessageExtractor.kt new file mode 100644 index 00000000..417238b6 --- /dev/null +++ b/cakk-external/src/main/java/com/cakk/external/extractor/VerificationCodeMimeMessageExtractor.kt @@ -0,0 +1,50 @@ +package com.cakk.external.extractor + +import jakarta.mail.MessagingException +import jakarta.mail.internet.MimeMessage + +import org.springframework.beans.factory.annotation.Value +import org.springframework.mail.javamail.JavaMailSender +import org.springframework.mail.javamail.MimeMessageHelper +import org.springframework.stereotype.Component + +import com.cakk.common.enums.ReturnCode +import com.cakk.common.exception.CakkException +import com.cakk.external.vo.VerificationMessage + +@Component +class VerificationCodeMimeMessageExtractor( + private val mailSender: JavaMailSender, + @Value("\${spring.mail.username}") + private val senderEmail: String +) : VerificationCodeMessageExtractor { + + override fun extract(verificationMessage: VerificationMessage): MimeMessage { + val message = mailSender.createMimeMessage() + + try { + val helper = MimeMessageHelper(message, true, "UTF-8") + + helper.setTo(verificationMessage.receiver) + helper.setFrom(senderEmail) + helper.setSubject("[케이크크] 이메일 인증") + + val body = """ +

인증코드를 확인해 주세요.

+

${verificationMessage.verificationCode}

+ 이메일 인증 절차에 따라 이메일 인증코드를 발급해드립니다.
+ 인증코드는 이메일 발송시점으로부터 3분 동안 유효합니다.
+ 만약 본인 요청에 의한 이메일 인증이 아니라면, cakk.contact@gmail.com 으로 관련 내용을 전달해 주세요. + 더욱 편리한 서비스를 제공하기 위해 항상 최선을 다하는 케이크크가 되겠습니다. +

+ + 감사합니다. + """.trimIndent() + helper.setText(body, true) + } catch (e: MessagingException) { + throw CakkException(ReturnCode.SEND_EMAIL_ERROR) + } + + return message + } +} diff --git a/cakk-external/src/main/java/com/cakk/external/sender/EmailSender.kt b/cakk-external/src/main/java/com/cakk/external/sender/EmailSender.kt index 3ab55b4d..5c0fdf32 100644 --- a/cakk-external/src/main/java/com/cakk/external/sender/EmailSender.kt +++ b/cakk-external/src/main/java/com/cakk/external/sender/EmailSender.kt @@ -1,11 +1,8 @@ package com.cakk.external.sender -import jakarta.mail.MessagingException import jakarta.mail.internet.MimeMessage -import org.springframework.beans.factory.annotation.Value import org.springframework.mail.javamail.JavaMailSender -import org.springframework.mail.javamail.MimeMessageHelper import org.springframework.stereotype.Component import com.cakk.common.enums.ReturnCode @@ -13,47 +10,14 @@ import com.cakk.common.exception.CakkException @Component class EmailSender( - private val mailSender: JavaMailSender, - @Value("\${spring.mail.username}") - private val senderEmail: String -): MessageSender { + private val mailSender: JavaMailSender +) : MessageSender { - override fun send(receiver: String, message: String) { + override fun send(message: MimeMessage) { try { - val emailForm = createMailFrom(receiver, message) - - mailSender.send(emailForm) + mailSender.send(message) } catch (e: RuntimeException) { throw CakkException(ReturnCode.SEND_EMAIL_ERROR) } } - - private fun createMailFrom(receiverMail: String, code: String): MimeMessage { - val message = mailSender.createMimeMessage() - - try { - val helper = MimeMessageHelper(message, true, "UTF-8") - - helper.setTo(receiverMail) - helper.setFrom(senderEmail) - helper.setSubject("[케이크크] 이메일 인증") - - val body = """ -

인증코드를 확인해 주세요.

-

$code

- 이메일 인증 절차에 따라 이메일 인증코드를 발급해드립니다.
- 인증코드는 이메일 발송시점으로부터 3분 동안 유효합니다.
- 만약 본인 요청에 의한 이메일 인증이 아니라면, cakk.contact@gmail.com 으로 관련 내용을 전달해 주세요. - 더욱 편리한 서비스를 제공하기 위해 항상 최선을 다하는 케이크크가 되겠습니다. -

- - 감사합니다. - """.trimIndent() - helper.setText(body, true) - } catch (e: MessagingException) { - throw CakkException(ReturnCode.SEND_EMAIL_ERROR) - } - - return message - } } diff --git a/cakk-external/src/main/java/com/cakk/external/template/VerificationCodeSendTemplate.kt b/cakk-external/src/main/java/com/cakk/external/template/VerificationCodeSendTemplate.kt new file mode 100644 index 00000000..abbd5bb9 --- /dev/null +++ b/cakk-external/src/main/java/com/cakk/external/template/VerificationCodeSendTemplate.kt @@ -0,0 +1,28 @@ +package com.cakk.external.template + +import com.cakk.external.extractor.VerificationCodeMessageExtractor +import com.cakk.external.sender.MessageSender +import com.cakk.external.vo.VerificationMessage + +class VerificationCodeSendTemplate( + private val messageSender: MessageSender, + private val verificationCodeMessageExtractor: VerificationCodeMessageExtractor +) { + + fun sendMessageForVerificationCode(verificationMessage: VerificationMessage) { + this.sendMessageForVerificationCode( + verificationMessage = verificationMessage, + verificationCodeMessageExtractor = verificationCodeMessageExtractor, + messageSender = messageSender + ) + } + + private fun sendMessageForVerificationCode( + verificationMessage: VerificationMessage, + verificationCodeMessageExtractor: VerificationCodeMessageExtractor, + messageSender: MessageSender + ) { + val extractMessage: T = verificationCodeMessageExtractor.extract(verificationMessage) + messageSender.send(extractMessage) + } +} diff --git a/cakk-external/src/main/java/com/cakk/external/vo/VerificationMessage.kt b/cakk-external/src/main/java/com/cakk/external/vo/VerificationMessage.kt new file mode 100644 index 00000000..66988a69 --- /dev/null +++ b/cakk-external/src/main/java/com/cakk/external/vo/VerificationMessage.kt @@ -0,0 +1,6 @@ +package com.cakk.external.vo + +data class VerificationMessage( + val receiver: String, + val verificationCode: String +)