Skip to content

Commit 407c415

Browse files
authored
[DDING-000] 이메일 전송 로직 리팩토링 (#347)
1 parent d803d60 commit 407c415

File tree

10 files changed

+81
-178
lines changed

10 files changed

+81
-178
lines changed

src/main/java/ddingdong/ddingdongBE/domain/formapplication/infrastructure/SesFormApplicationEmailSender.java renamed to src/main/java/ddingdong/ddingdongBE/domain/form/infrastructure/SesFormResultEmailSender.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
package ddingdong.ddingdongBE.domain.formapplication.infrastructure;
1+
package ddingdong.ddingdongBE.domain.form.infrastructure;
22

3-
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
4-
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplicationEmailSender;
3+
import ddingdong.ddingdongBE.domain.form.service.FormResultEmailSender;
54
import ddingdong.ddingdongBE.email.entity.EmailContent;
65
import ddingdong.ddingdongBE.email.infrastructure.SesEmailSender;
76
import lombok.RequiredArgsConstructor;
@@ -15,25 +14,24 @@
1514

1615
@RequiredArgsConstructor
1716
@Component
18-
public class SesFormApplicationEmailSender implements FormApplicationEmailSender {
17+
public class SesFormResultEmailSender implements FormResultEmailSender {
1918

2019
@Value("${cloud.aws.ses.sender-email}")
2120
private String senderEmail;
2221

2322
private final SesEmailSender sesEmailSender;
2423

2524
@Override
26-
public void sendResult(final FormApplication formApplication, final EmailContent emailContent,
27-
final Long emailSendHistoryId) {
28-
SendEmailRequest sendEmailRequest = createSendEmailRequest(formApplication, emailContent);
29-
sesEmailSender.sendResult(sendEmailRequest, emailSendHistoryId);
25+
public void sendResult(String destinationEmail, String destinationName, Long emailHistoryId, EmailContent emailContent) {
26+
SendEmailRequest sendEmailRequest = createSendEmailRequest(destinationEmail, destinationName, emailContent);
27+
sesEmailSender.sendResult(sendEmailRequest, emailHistoryId);
3028
}
3129

32-
private SendEmailRequest createSendEmailRequest(FormApplication formApplication, EmailContent emailContent) {
30+
private SendEmailRequest createSendEmailRequest( String destinationEmail, String destinationName, EmailContent emailContent) {
3331
return SendEmailRequest.builder()
3432
.source(senderEmail)
3533
.destination(Destination.builder()
36-
.toAddresses(formApplication.getEmail())
34+
.toAddresses(destinationEmail)
3735
.build())
3836
.configurationSetName("ddingdong-form-application-result-set")
3937
.message(Message.builder()
@@ -45,12 +43,12 @@ private SendEmailRequest createSendEmailRequest(FormApplication formApplication,
4543
.html(Content.builder()
4644
.charset("UTF-8")
4745
.data(emailContent.htmlContent()
48-
.replace("{지원자명}", formApplication.getName()))
46+
.replace("{지원자명}", destinationName))
4947
.build())
5048
.text(Content.builder()
5149
.charset("UTF-8")
5250
.data(emailContent.textContent()
53-
.replace("{지원자명}", formApplication.getName()))
51+
.replace("{지원자명}", destinationName))
5452
.build())
5553
.build())
5654
.build())

src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,21 @@
2929
import ddingdong.ddingdongBE.domain.form.service.dto.query.MultipleFieldStatisticsQuery.OptionStatisticQuery;
3030
import ddingdong.ddingdongBE.domain.form.service.dto.query.SingleFieldStatisticsQuery;
3131
import ddingdong.ddingdongBE.domain.form.service.dto.query.SingleFieldStatisticsQuery.SingleStatisticsQuery;
32-
import ddingdong.ddingdongBE.email.entity.EmailContent;
32+
import ddingdong.ddingdongBE.domain.form.service.event.SendFormResultEmailEvent;
3333
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
3434
import ddingdong.ddingdongBE.domain.formapplication.service.FormAnswerService;
35-
import ddingdong.ddingdongBE.domain.formapplication.service.FormApplicationEmailService;
3635
import ddingdong.ddingdongBE.domain.formapplication.service.FormApplicationService;
3736
import ddingdong.ddingdongBE.domain.user.entity.User;
37+
import ddingdong.ddingdongBE.email.entity.EmailContent;
38+
import ddingdong.ddingdongBE.email.entity.EmailSendHistory;
39+
import ddingdong.ddingdongBE.email.service.EmailSendHistoryService;
3840
import java.time.LocalDate;
3941
import java.util.List;
4042
import lombok.RequiredArgsConstructor;
4143
import lombok.extern.slf4j.Slf4j;
4244
import org.springframework.cache.annotation.CacheEvict;
4345
import org.springframework.cache.annotation.Caching;
46+
import org.springframework.context.ApplicationEventPublisher;
4447
import org.springframework.stereotype.Service;
4548
import org.springframework.transaction.annotation.Transactional;
4649

@@ -58,7 +61,8 @@ public class FacadeCentralFormServiceImpl implements FacadeCentralFormService {
5861
private final FormAnswerService formAnswerService;
5962
private final FileMetaDataService fileMetaDataService;
6063
private final ClubMemberService clubMemberService;
61-
private final FormApplicationEmailService formApplicationEmailService;
64+
private final EmailSendHistoryService emailSendHistoryService;
65+
private final ApplicationEventPublisher applicationEventPublisher;
6266

6367
@Transactional
6468
@Override
@@ -187,7 +191,11 @@ public void sendApplicationResultEmail(SendApplicationResultEmailCommand command
187191
command.target()
188192
);
189193
EmailContent emailContent = EmailContent.of(command.title(), command.message(), club);
190-
formApplicationEmailService.sendBulkResult(formApplications, emailContent);
194+
formApplications.forEach(application -> {
195+
EmailSendHistory emailSendHistory = emailSendHistoryService.save(EmailSendHistory.createPending(application));
196+
applicationEventPublisher.publishEvent(new SendFormResultEmailEvent(
197+
emailSendHistory.getId(), application.getEmail(), application.getName(), emailContent));
198+
});
191199
}
192200

193201
@Transactional
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ddingdong.ddingdongBE.domain.form.service;
2+
3+
import ddingdong.ddingdongBE.email.entity.EmailContent;
4+
5+
public interface FormResultEmailSender {
6+
7+
void sendResult(String destinationEmail, String destinationName, Long emailHistoryId, EmailContent emailContent);
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ddingdong.ddingdongBE.domain.form.service.event;
2+
3+
import ddingdong.ddingdongBE.domain.form.service.FormResultEmailSender;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.scheduling.annotation.Async;
7+
import org.springframework.stereotype.Service;
8+
import org.springframework.transaction.event.TransactionPhase;
9+
import org.springframework.transaction.event.TransactionalEventListener;
10+
11+
@Service
12+
@RequiredArgsConstructor
13+
@Slf4j
14+
public class FormApplicationSendEmailEventHandler {
15+
16+
private final FormResultEmailSender formResultEmailSender;
17+
18+
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
19+
@Async("emailAsyncExecutor")
20+
public void sendBulkResult(SendFormResultEmailEvent event) {
21+
log.info("지원 결과 이메일 전송 이벤트 핸들링 성공 : {} : {}", event.destinationEmail(), event.destinationName());
22+
formResultEmailSender.sendResult(
23+
event.destinationEmail(),
24+
event.destinationName(),
25+
event.emailSendHistoryId(),
26+
event.emailContent()
27+
);
28+
}
29+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ddingdong.ddingdongBE.domain.form.service.event;
2+
3+
import ddingdong.ddingdongBE.email.entity.EmailContent;
4+
5+
public record SendFormResultEmailEvent(
6+
Long emailSendHistoryId,
7+
String destinationEmail,
8+
String destinationName,
9+
EmailContent emailContent) {
10+
}

src/main/java/ddingdong/ddingdongBE/domain/formapplication/entity/FormApplicationEmailSender.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/java/ddingdong/ddingdongBE/domain/formapplication/service/FormApplicationEmailService.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

src/main/java/ddingdong/ddingdongBE/email/service/EmailSendHistoryService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public void updateEmailSendStatus(String eventType, String messageId) {
4848
emailSendHistory.updateStatusTo(eventType);
4949
}
5050

51+
@Transactional
52+
public EmailSendHistory save(EmailSendHistory emailSendHistory) {
53+
return emailSendHistoryRepository.save(emailSendHistory);
54+
}
55+
5156
private EmailSendHistory getById(Long emailSendHistoryId) {
5257
return emailSendHistoryRepository.findById(emailSendHistoryId)
5358
.orElseThrow(() -> new ResourceNotFound(

src/test/java/ddingdong/ddingdongBE/domain/formapplication/infrastructure/SesFormApplicationEmailSenderTest.java renamed to src/test/java/ddingdong/ddingdongBE/domain/form/infrastructure/SesFormResultEmailSenderTest.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package ddingdong.ddingdongBE.domain.formapplication.infrastructure;
1+
package ddingdong.ddingdongBE.domain.form.infrastructure;
22

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

55
import ddingdong.ddingdongBE.common.fixture.ClubFixture;
66
import ddingdong.ddingdongBE.common.fixture.FormApplicationFixture;
77
import ddingdong.ddingdongBE.common.support.TestContainerSupport;
88
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplication;
9-
import ddingdong.ddingdongBE.domain.formapplication.entity.FormApplicationEmailSender;
9+
import ddingdong.ddingdongBE.domain.form.service.FormResultEmailSender;
1010
import ddingdong.ddingdongBE.domain.formapplication.repository.EmailSendHistoryRepository;
1111
import ddingdong.ddingdongBE.domain.formapplication.repository.FormApplicationRepository;
1212
import ddingdong.ddingdongBE.email.entity.EmailContent;
@@ -18,10 +18,10 @@
1818
import org.springframework.boot.test.context.SpringBootTest;
1919

2020
@SpringBootTest
21-
class SesFormApplicationEmailSenderTest extends TestContainerSupport {
21+
class SesFormResultEmailSenderTest extends TestContainerSupport {
2222

2323
@Autowired
24-
private FormApplicationEmailSender formApplicationEmailSender;
24+
private FormResultEmailSender formResultEmailSender;
2525

2626
@Autowired
2727
private EmailSendHistoryRepository emailSendHistoryRepository;
@@ -38,7 +38,7 @@ void setUp() {
3838
formApplication = FormApplicationFixture.pendingFormApplication();
3939
FormApplication savedFormApplication = formApplicationRepository.save(formApplication);
4040
emailContent = EmailContent.of("테스트 제목", "테스트 내용입니다. 안녕하세요 {지원자명}님", ClubFixture.createClub());
41-
41+
4242
// 실제 EmailSendHistory 엔티티 생성
4343
emailSendHistory = EmailSendHistory.createPending(savedFormApplication);
4444
emailSendHistory = emailSendHistoryRepository.save(emailSendHistory);
@@ -48,7 +48,8 @@ void setUp() {
4848
@Test
4949
void sendResult_success() {
5050
// when
51-
formApplicationEmailSender.sendResult(formApplication, emailContent, emailSendHistory.getId());
51+
formResultEmailSender.sendResult(formApplication.getEmail(), formApplication.getName(), emailSendHistory.getId(),
52+
emailContent);
5253

5354
// then
5455
EmailSendHistory updatedHistory = emailSendHistoryRepository.findById(emailSendHistory.getId()).orElseThrow();

src/test/java/ddingdong/ddingdongBE/domain/formapplication/service/FormApplicationEmailServiceTest.java

Lines changed: 0 additions & 113 deletions
This file was deleted.

0 commit comments

Comments
 (0)