Skip to content

Commit bbe4243

Browse files
authored
refactor: 이메일 전송 그룹 코드를 문자열에서 Enum 으로 변경 (#345)
* feat: 이메일 전송 그룹 코드를 문자열에서 Enum 으로 변경 * feat: 이메일 전송 메서드의 매개변수 명을 toEmail로 통일
1 parent d0350d4 commit bbe4243

9 files changed

Lines changed: 51 additions & 60 deletions

File tree

src/main/java/org/ject/support/domain/apply/service/RemindApplyService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.ject.support.domain.member.repository.MemberRepository;
88
import org.ject.support.domain.recruit.domain.Recruit;
99
import org.ject.support.domain.recruit.repository.RecruitRepository;
10+
import org.ject.support.external.email.domain.EmailTemplate;
1011
import org.ject.support.external.email.service.SesEmailSendService;
1112
import org.springframework.stereotype.Service;
1213

@@ -41,7 +42,7 @@ public void remindApply(Long recruitId) {
4142

4243
// 필터링한 지원자들에게 리마인드
4344
emailSendService.sendBulkTemplatedEmail(
44-
EMAIL_SEND_GROUP,
45+
EmailTemplate.REMIND_APPLY,
4546
targetEmails,
4647
Map.of("deadline", DateTimeUtil.formatWithDayOfWeek(recruit.getEndDate())));
4748
}
Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package org.ject.support.external.email.controller;
22

33
import io.swagger.v3.oas.annotations.Operation;
4+
import io.swagger.v3.oas.annotations.Parameter;
5+
import io.swagger.v3.oas.annotations.Parameters;
6+
import io.swagger.v3.oas.annotations.media.ExampleObject;
7+
import io.swagger.v3.oas.annotations.media.Schema;
48
import io.swagger.v3.oas.annotations.tags.Tag;
9+
import org.ject.support.external.email.domain.EmailTemplate;
510
import org.springframework.web.bind.annotation.RequestParam;
611

712
@Tag(name = "Email", description = "이메일 API")
@@ -10,5 +15,15 @@ public interface EmailAuthApiSpec {
1015
@Operation(
1116
summary = "인증 번호 발송",
1217
description = "지정된 이메일로 인증 번호를 발송합니다.")
13-
void sendAuthEmail(@RequestParam String sendGroupCode, @RequestParam String email);
18+
@Parameters({
19+
@Parameter(
20+
name = "sendGroupCode", description = "이메일 템플릿",
21+
schema = @Schema(allowableValues = {"AUTH_CODE", "PIN_RESET"}),
22+
examples = {
23+
@ExampleObject(name = "AUTH_CODE", summary = "이메일 인증 코드 안내", value = "AUTH_CODE"),
24+
@ExampleObject(name = "PIN_RESET", summary = "PIN 재설정 인증 코드 안내", value = "PIN_RESET")
25+
},
26+
required = true)
27+
})
28+
void sendAuthEmail(@RequestParam EmailTemplate sendGroupCode, @RequestParam String email);
1429
}

src/main/java/org/ject/support/external/email/controller/EmailAuthController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.ject.support.external.email.controller;
22

33
import lombok.RequiredArgsConstructor;
4+
import org.ject.support.external.email.domain.EmailTemplate;
45
import org.ject.support.external.email.service.EmailAuthService;
56
import org.springframework.security.access.prepost.PreAuthorize;
67
import org.springframework.web.bind.annotation.PostMapping;
@@ -18,7 +19,7 @@ public class EmailAuthController implements EmailAuthApiSpec {
1819
@Override
1920
@PostMapping("/send/auth")
2021
@PreAuthorize("permitAll()")
21-
public void sendAuthEmail(@RequestParam String sendGroupCode, @RequestParam String email) {
22+
public void sendAuthEmail(@RequestParam EmailTemplate sendGroupCode, @RequestParam String email) {
2223
emailAuthService.sendAuthCode(sendGroupCode, email);
2324
}
2425
}
Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,16 @@
11
package org.ject.support.external.email.domain;
22

3-
import jakarta.annotation.PostConstruct;
4-
import java.io.IOException;
5-
import java.util.Arrays;
6-
import java.util.List;
7-
import java.util.Set;
8-
import java.util.stream.Collectors;
93
import lombok.AllArgsConstructor;
104
import lombok.Getter;
11-
import org.ject.support.common.exception.GlobalErrorCode;
12-
import org.ject.support.common.exception.GlobalException;
13-
import org.springframework.core.io.Resource;
14-
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
15-
import org.springframework.core.io.support.ResourcePatternResolver;
165

176
@Getter
187
@AllArgsConstructor
198
public enum EmailTemplate {
20-
ACCEPTANCE("email-template", "ject notification"),
21-
REJECTION("email-template", "ject notification"),
22-
AUTH_CODE("auth-code-email-template", "젝트 이메일 인증 코드 안내"),
23-
PIN_RESET("pin-reset-email-template", "젝트 PIN 재설정 인증 코드 안내"),
24-
REMIND_APPLY("remind-apply-email-template", "젝트 지원서 접수 마감일 안내");
9+
AUTH_CODE("email-auth-template", "젝트 이메일 인증 코드 안내", "email_auth"),
10+
PIN_RESET("pin-reset-template", "젝트 PIN 재설정 인증 코드 안내", "pin_reset"),
11+
REMIND_APPLY("remind-apply-template", "젝트 지원서 접수 마감일 안내", "remind_apply");
2512

2613
private final String templateName; // template file name
2714
private final String subject; // email subject
28-
29-
@PostConstruct
30-
private void validateFileName() throws IOException {
31-
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
32-
List<String> templateFileNames = Arrays.stream(values()).map(EmailTemplate::getTemplateName).toList();
33-
34-
Set<String> actualFileNames = Arrays.stream(resolver.getResources("classpath:/templates/*.html"))
35-
.map(Resource::getFilename)
36-
.collect(Collectors.toSet());
37-
38-
for (String templateFileName : templateFileNames) {
39-
if (!actualFileNames.contains(templateFileName + ".html")) {
40-
throw new GlobalException(GlobalErrorCode.TEMPLATE_NOT_FOUND);
41-
}
42-
}
43-
}
15+
private final String tag; // email tag value
4416
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.ject.support.external.email.dto;
22

3+
import org.ject.support.external.email.domain.EmailTemplate;
4+
35
import java.util.List;
46
import java.util.Map;
57

68
public record SendManualBulkTemplatedEmailRequest(
7-
String sendGroupCode,
9+
EmailTemplate sendGroupCode,
810
List<String> toList,
911
Map<String, String> content) {
1012
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package org.ject.support.external.email.dto;
22

3+
import org.ject.support.external.email.domain.EmailTemplate;
4+
35
import java.util.Map;
46

57
public record SendManualTemplatedEmailRequest(
6-
String sendGroupCode,
8+
EmailTemplate sendGroupCode,
79
String to,
810
Map<String, String> content) {
911
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import org.ject.support.common.util.CodeGeneratorUtil;
6+
import org.ject.support.external.email.domain.EmailTemplate;
67
import org.springframework.data.redis.core.RedisTemplate;
78
import org.springframework.stereotype.Service;
89

@@ -20,18 +21,18 @@ public class EmailAuthService {
2021
private final SesEmailSendService emailSendService;
2122
private final RedisTemplate<String, String> redisTemplate;
2223

23-
public void sendAuthCode(String sendGroupCode, String toAddress) {
24+
public void sendAuthCode(EmailTemplate sendGroupCode, String toEmail) {
2425
String authCode = CodeGeneratorUtil.generateDigitCode(AUTH_CODE_LENGTH);
25-
sendAuthCodeEmail(sendGroupCode, toAddress, authCode);
26-
storeAuthCode(toAddress, authCode);
26+
sendAuthCodeEmail(sendGroupCode, toEmail, authCode);
27+
storeAuthCode(toEmail, authCode);
2728
}
2829

29-
private void sendAuthCodeEmail(String sendGroupCode, String toAddress, String authCode) {
30-
emailSendService.sendTemplatedEmail(sendGroupCode, toAddress, Map.of("auth-code", authCode));
31-
log.info("인증 번호 전송 - email: {}, code: {}", toAddress, authCode);
30+
private void sendAuthCodeEmail(EmailTemplate sendGroupCode, String toEmail, String authCode) {
31+
emailSendService.sendTemplatedEmail(sendGroupCode, toEmail, Map.of("auth-code", authCode));
32+
log.info("인증 번호 전송 - toEmail: {}, code: {}", toEmail, authCode);
3233
}
3334

34-
private void storeAuthCode(String toAddress, String authCode) {
35-
redisTemplate.opsForValue().set(toAddress, authCode, Duration.ofSeconds(EXPIRE_TIME));
35+
private void storeAuthCode(String toEmail, String authCode) {
36+
redisTemplate.opsForValue().set(toEmail, authCode, Duration.ofSeconds(EXPIRE_TIME));
3637
}
3738
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.ject.support.external.email.service;
22

3+
import org.ject.support.external.email.domain.EmailTemplate;
4+
35
import java.util.List;
46
import java.util.Map;
57

@@ -8,10 +10,10 @@ public interface EmailSendService {
810
/**
911
* 단건 templated email 전송 (template)
1012
*/
11-
void sendTemplatedEmail(String sendGroupCode, String to, Map<String, String> params);
13+
void sendTemplatedEmail(EmailTemplate sendGroupCode, String to, Map<String, String> params);
1214

1315
/**
1416
* 대량 templated email 발송
1517
*/
16-
void sendBulkTemplatedEmail(String sendGroupCode, List<String> toList, Map<String, String> params);
18+
void sendBulkTemplatedEmail(EmailTemplate sendGroupCode, List<String> toList, Map<String, String> params);
1719
}

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

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.RequiredArgsConstructor;
55
import org.ject.support.common.util.Map2JsonSerializer;
66
import org.ject.support.external.email.domain.EmailSendGroup;
7+
import org.ject.support.external.email.domain.EmailTemplate;
78
import org.ject.support.external.email.exception.EmailErrorCode;
89
import org.ject.support.external.email.exception.EmailException;
910
import org.ject.support.external.email.repository.EmailSendGroupRepository;
@@ -40,21 +41,18 @@ public class SesEmailSendService implements EmailSendService {
4041
private String from;
4142

4243
@Override
43-
public void sendTemplatedEmail(String sendGroupCode, String to, Map<String, String> params) {
44-
// 전송 그룹 정보 조회
45-
EmailSendGroup sendGroup = getSendGroup(sendGroupCode);
46-
44+
public void sendTemplatedEmail(EmailTemplate sendGroupCode, String toEmail, Map<String, String> params) {
4745
// 이메일 콘텐츠 구성
4846
EmailContent emailContent = EmailContent.builder()
49-
.template(getTemplate(sendGroup.getTemplateName(), params))
47+
.template(getTemplate(sendGroupCode.getTemplateName(), params))
5048
.build();
5149

5250
// 이메일 그룹 식별용 태그 설정
53-
MessageTag messageTag = getMessageTag(sendGroup.getCode());
51+
MessageTag messageTag = getMessageTag(sendGroupCode.getTag());
5452

5553
// 단건 이메일 요청 생성
5654
SendEmailRequest emailRequest = SendEmailRequest.builder()
57-
.destination(getDestination(to))
55+
.destination(getDestination(toEmail))
5856
.content(emailContent)
5957
.fromEmailAddress(from)
6058
.emailTags(messageTag)
@@ -65,17 +63,14 @@ public void sendTemplatedEmail(String sendGroupCode, String to, Map<String, Stri
6563
}
6664

6765
@Override
68-
public void sendBulkTemplatedEmail(String sendGroupCode, List<String> toList, Map<String, String> params) {
69-
// 전송 그룹 정보 조회
70-
EmailSendGroup sendGroup = getSendGroup(sendGroupCode);
71-
66+
public void sendBulkTemplatedEmail(EmailTemplate sendGroupCode, List<String> toList, Map<String, String> params) {
7267
// 이메일 콘텐츠 구성
7368
BulkEmailContent content = BulkEmailContent.builder()
74-
.template(getTemplate(sendGroup.getTemplateName(), params))
69+
.template(getTemplate(sendGroupCode.getTemplateName(), params))
7570
.build();
7671

7772
// 이메일 그룹 식별용 태그 설정
78-
MessageTag messageTag = getMessageTag(sendGroup.getCode());
73+
MessageTag messageTag = getMessageTag(sendGroupCode.getTag());
7974

8075
// 수신자 리스트를 초당 전송량만큼 분할하여 전송
8176
Lists.partition(toList, rateLimiter.getRateLimitPerSecond())

0 commit comments

Comments
 (0)