Skip to content

Commit 5d4088c

Browse files
authored
refactor: 이메일 전송 그룹 관련 코드 및 테이블 삭제 (#346)
* refactor: 이메일 전송 그룹 관련 코드 및 테이블 삭제 * refactor: 이메일 전송 실패 처리 로직 추가 및 관련 예외 코드 정의 * refactor: 이메일 전송 실패 로그 메시지 개선 및 불필요한 에러 코드 제거
1 parent bbe4243 commit 5d4088c

6 files changed

Lines changed: 109 additions & 54 deletions

File tree

src/main/java/org/ject/support/external/email/domain/EmailSendGroup.java

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

src/main/java/org/ject/support/external/email/exception/EmailErrorCode.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66
import org.springframework.http.HttpStatus;
77

88
import static org.springframework.http.HttpStatus.BAD_REQUEST;
9-
import static org.springframework.http.HttpStatus.NOT_FOUND;
9+
import static org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE;
1010

1111
@Getter
1212
@AllArgsConstructor
1313
public enum EmailErrorCode implements ErrorCode {
1414
INVALID_EMAIL_TEMPLATE(BAD_REQUEST, "INVALID_EMAIL_TEMPLATE", "유효하지 않은 메일 템플릿입니다."),
15-
NOT_FOUND_SEND_GROUP(NOT_FOUND, "NOT_FOUND_SEND_GROUP", "존재하지 않는 전송 그룹입니다."),
16-
;
15+
EMAIL_SEND_FAILURE(SERVICE_UNAVAILABLE, "EMAIL_SEND_FAILURE", "이메일 전송에 실패했습니다.");
1716

1817
private final HttpStatus httpStatus;
1918
private final String code;

src/main/java/org/ject/support/external/email/repository/EmailSendGroupRepository.java

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

src/main/java/org/ject/support/external/email/service/SesEmailSendService.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
import com.google.common.collect.Lists;
44
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
56
import org.ject.support.common.util.Map2JsonSerializer;
6-
import org.ject.support.external.email.domain.EmailSendGroup;
77
import org.ject.support.external.email.domain.EmailTemplate;
8-
import org.ject.support.external.email.exception.EmailErrorCode;
98
import org.ject.support.external.email.exception.EmailException;
10-
import org.ject.support.external.email.repository.EmailSendGroupRepository;
119
import org.ject.support.external.infrastructure.SesRateLimiter;
1210
import org.springframework.beans.factory.annotation.Value;
1311
import org.springframework.stereotype.Service;
@@ -26,14 +24,16 @@
2624
import java.util.List;
2725
import java.util.Map;
2826

27+
import static org.ject.support.external.email.exception.EmailErrorCode.EMAIL_SEND_FAILURE;
28+
29+
@Slf4j
2930
@Service
3031
@RequiredArgsConstructor
3132
public class SesEmailSendService implements EmailSendService {
3233

3334
private static final String GROUP_CODE_TAG_NAME = "group_code";
3435

3536
private final Map2JsonSerializer map2JsonSerializer;
36-
private final EmailSendGroupRepository emailSendGroupRepository;
3737
private final SesV2Client sesV2Client;
3838
private final SesRateLimiter rateLimiter;
3939

@@ -58,8 +58,12 @@ public void sendTemplatedEmail(EmailTemplate sendGroupCode, String toEmail, Map<
5858
.emailTags(messageTag)
5959
.build();
6060

61-
// 이메일 전송
62-
sesV2Client.sendEmail(emailRequest);
61+
try {
62+
sesV2Client.sendEmail(emailRequest);
63+
} catch (Exception e) {
64+
log.error("이메일 전송 실패 sendGroupCode={}", sendGroupCode.getTemplateName(), e);
65+
throw new EmailException(EMAIL_SEND_FAILURE);
66+
}
6367
}
6468

6569
@Override
@@ -94,11 +98,6 @@ public void sendBulkTemplatedEmail(EmailTemplate sendGroupCode, List<String> toL
9498
});
9599
}
96100

97-
private EmailSendGroup getSendGroup(String sendGroupCode) {
98-
return emailSendGroupRepository.findByCode(sendGroupCode)
99-
.orElseThrow(() -> new EmailException(EmailErrorCode.NOT_FOUND_SEND_GROUP));
100-
}
101-
102101
private Template getTemplate(String templateName, Map<String, String> parameter) {
103102
return Template.builder()
104103
.templateName(templateName)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- email send group table 삭제
2+
DROP TABLE IF EXISTS email_send_group;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package org.ject.support.external.email.service;
2+
3+
import org.ject.support.base.UnitTestSupport;
4+
import org.ject.support.common.util.Map2JsonSerializer;
5+
import org.ject.support.external.email.domain.EmailTemplate;
6+
import org.ject.support.external.email.exception.EmailErrorCode;
7+
import org.ject.support.external.email.exception.EmailException;
8+
import org.ject.support.external.infrastructure.SesRateLimiter;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.Test;
11+
import org.mockito.InjectMocks;
12+
import org.mockito.Mock;
13+
import org.springframework.test.util.ReflectionTestUtils;
14+
import software.amazon.awssdk.services.sesv2.SesV2Client;
15+
import software.amazon.awssdk.services.sesv2.model.SendEmailRequest;
16+
import software.amazon.awssdk.services.sesv2.model.SendEmailResponse;
17+
18+
import java.util.Map;
19+
20+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
21+
import static org.mockito.ArgumentMatchers.any;
22+
import static org.mockito.ArgumentMatchers.anyMap;
23+
import static org.mockito.BDDMockito.given;
24+
import static org.mockito.Mockito.verify;
25+
26+
class SesEmailSendServiceTest extends UnitTestSupport {
27+
28+
@InjectMocks
29+
private SesEmailSendService sesEmailSendService;
30+
31+
@Mock
32+
private Map2JsonSerializer map2JsonSerializer;
33+
34+
@Mock
35+
private SesV2Client sesV2Client;
36+
37+
@Mock
38+
private SesRateLimiter rateLimiter;
39+
40+
private static final String MOCK_FROM_EMAIL = "test@example.com";
41+
42+
@BeforeEach
43+
void setUp() {
44+
ReflectionTestUtils.setField(sesEmailSendService, "from", MOCK_FROM_EMAIL);
45+
}
46+
47+
@Test
48+
void 이메일_전송에_실패할_경우_EMAIL_SEND_FAILURE_예외_발생() {
49+
// given
50+
String to = "user@recipient.com";
51+
String subject = "Test Subject";
52+
String htmlBody = "<h1>Test Body</h1>";
53+
54+
SendEmailResponse mockResponse = SendEmailResponse.builder()
55+
.messageId("mock-message-id-123")
56+
.build();
57+
given(map2JsonSerializer.serializeAsString(anyMap())).willReturn("{\"key\":\"value\"}");
58+
given(sesV2Client.sendEmail(any(SendEmailRequest.class)))
59+
.willThrow(new RuntimeException("Simulated SES send failure"));
60+
61+
// when, then
62+
assertThatThrownBy(() -> sesEmailSendService.sendTemplatedEmail( EmailTemplate.AUTH_CODE,
63+
to,
64+
Map.of("subject", subject, "htmlBody", htmlBody)
65+
))
66+
.isInstanceOf(EmailException.class)
67+
.extracting(e -> ((EmailException) e).getErrorCode())
68+
.isEqualTo(EmailErrorCode.EMAIL_SEND_FAILURE);
69+
}
70+
71+
@Test
72+
void 이메일_전송_성공_시_SES_Client_호출_검증() {
73+
// given
74+
String to = "user@recipient.com";
75+
String subject = "Test Subject";
76+
String htmlBody = "<h1>Test Body</h1>";
77+
78+
SendEmailResponse mockResponse = SendEmailResponse.builder()
79+
.messageId("mock-message-id-123")
80+
.build();
81+
given(map2JsonSerializer.serializeAsString(anyMap())).willReturn("{\"key\":\"value\"}");
82+
given(sesV2Client.sendEmail(any(SendEmailRequest.class))).willReturn(mockResponse);
83+
84+
// when
85+
sesEmailSendService.sendTemplatedEmail(
86+
EmailTemplate.AUTH_CODE,
87+
to,
88+
Map.of("subject", subject, "htmlBody", htmlBody)
89+
);
90+
91+
// then
92+
verify(map2JsonSerializer).serializeAsString(anyMap());
93+
verify(sesV2Client).sendEmail(any(SendEmailRequest.class));
94+
}
95+
}

0 commit comments

Comments
 (0)