Skip to content

Commit

Permalink
폼 상태 변경 시 이메일 전송 문제 해결 및 리팩토링 (#322)
Browse files Browse the repository at this point in the history
  • Loading branch information
juno-junho authored Apr 25, 2024
1 parent 98efa89 commit 335d742
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,15 @@ public enum TemplateName {
public static TemplateName findByTemplateName(String templateName) {
return Arrays.stream(values())
.filter(template -> template.templateName.equals(templateName))
.findFirst()
.findAny()
.orElseThrow();
}

public static Long findTemplateIdByTemplateName(String templateName) {
return Arrays.stream(values())
.filter(template -> template.templateName.equals(templateName))
.findAny()
.map(TemplateName::getTemplateId)
.orElseThrow();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package com.spaceclub.notification.mail.domain.repository;

import com.spaceclub.notification.mail.domain.Template;
import com.spaceclub.notification.mail.domain.TemplateName;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface TemplateRepository extends JpaRepository<Template, Long> {

@Query("select distinct t.template from Template t " +
"join fetch MailHistory m on m.templateId = t.id " +
"where m.templateName = :templateName")
String findTemplateByTemplateName(@Param("templateName") TemplateName templateName);
@Query("select t.template from Template t where t.id = :templateId")
String findHTMLByTemplateId(Long templateId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,28 +40,39 @@ public void sendEmail(MailEvent mailEvent) {
MailInfo mailInfo = mailEvent.mailInfo();

TemplateName templateName = TemplateName.findByTemplateName(mailInfo.templateName());
String mailTemplateHTML = templateRepository.findTemplateByTemplateName(templateName);
String mailTemplateHTML = templateRepository.findHTMLByTemplateId(templateName.getTemplateId());

Map<String, Object> additionalInfo = mailInfo.getAdditionalInfo(templateName);
Context context = new ContextCreator(mailProperties).createContext(additionalInfo);
String processedMailTemplateHTML = processGeneratingTemplate(additionalInfo, mailTemplateHTML);

String processedMailTemplateHTML = templateEngine.process(mailTemplateHTML, context);
executeMailDeliveryAndRecordHistory(mailInfo, processedMailTemplateHTML, templateName);
}

private String processGeneratingTemplate(Map<String, Object> additionalInfo, String mailTemplateHTML) {
Context context = new ContextCreator(mailProperties).createContext(additionalInfo);
return templateEngine.process(mailTemplateHTML, context);
}

private void executeMailDeliveryAndRecordHistory(MailInfo mailInfo, String processedMailTemplateHTML, TemplateName templateName) {
boolean isSent = true;
try {
MimeMessage message = MimeMessageCreator.createMailMessage(emailSender, mailProperties, mailInfo, processedMailTemplateHTML);
emailSender.send(message);
emailSender.send(message); // 메일 전송
} catch (MessagingException e) {
log.error("메일 전송 실패", e);
isSent = false;
} finally {
MailHistory mailHistory = switch (templateName) {
case WELCOME -> WelcomeMailInfo.createMailHistory(mailInfo, isSent);
case EVENT_STATUS_CHANGED -> EventStatusChangeMailInfo.createMailHistory(mailInfo, isSent);
};
} finally { // 이력 DB에 저장
MailHistory mailHistory = createMailHistory(mailInfo, templateName, isSent);
mailHistoryRepository.save(mailHistory);
}
log.debug("메일 발송 완료!");
}

private MailHistory createMailHistory(MailInfo mailInfo, TemplateName templateName, boolean isSent) {
return switch (templateName) {
case WELCOME -> WelcomeMailInfo.createMailHistory(mailInfo, isSent);
case EVENT_STATUS_CHANGED -> EventStatusChangeMailInfo.createMailHistory(mailInfo, isSent);
};
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private void sendEachMail(MailHistory mailHistory) {
return;
}
mailHistory.changeToSent();
mailHistoryRepository.save(mailHistory);
mailHistoryRepository.save(mailHistory); // dirty checking x
log.debug("메일 재전송 완료");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public enum ParticipationStatus {
public static String getStatusName(String eventStatus) {
return Arrays.stream(values())
.filter(status -> status.name().equalsIgnoreCase(eventStatus))
.findFirst()
.findAny()
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이벤트 상태입니다."))
.statusName;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.spaceclub.notification.mail.domain;

import com.spaceclub.SpaceClubCustomDisplayNameGenerator;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import static org.assertj.core.api.Assertions.assertThat;

@DisplayNameGeneration(SpaceClubCustomDisplayNameGenerator.class)
class TemplateNameTest {

@ParameterizedTest
@CsvSource({"welcome, WELCOME", "event-status-change, EVENT_STATUS_CHANGED"})
void 템플릿_이름으로_템플릿_이름_조회에_성공한다(String templateName, TemplateName expected) {
// when
TemplateName result = TemplateName.findByTemplateName(templateName);

// then
assertThat(result).isEqualTo(expected);
}

@ParameterizedTest
@CsvSource({"welcome, 1", "event-status-change, 2"})
void 템플릿_이름으로_템플릿_ID_조회에_성공한다(String templateName, Long expectedId) {
// when
Long result = TemplateName.findTemplateIdByTemplateName(templateName);

// then
assertThat(result).isEqualTo(expectedId);
}

}

This file was deleted.

0 comments on commit 335d742

Please sign in to comment.