Skip to content

Commit b350b11

Browse files
committed
Ref: 이메일 서비스 개선
1 parent b4f77e2 commit b350b11

File tree

2 files changed

+52
-20
lines changed

2 files changed

+52
-20
lines changed
Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.back.domain.user.service;
22

3+
import jakarta.mail.MessagingException;
4+
import jakarta.mail.internet.MimeMessage;
35
import lombok.RequiredArgsConstructor;
46
import org.springframework.beans.factory.annotation.Value;
57
import org.springframework.mail.SimpleMailMessage;
68
import org.springframework.mail.javamail.JavaMailSender;
9+
import org.springframework.mail.javamail.MimeMessageHelper;
710
import org.springframework.stereotype.Service;
811

12+
// 이메일 전송 서비스
913
@Service
1014
@RequiredArgsConstructor
1115
public class EmailService {
@@ -17,29 +21,41 @@ public class EmailService {
1721
@Value("${frontend.base-url}")
1822
private String FRONTEND_BASE_URL;
1923

24+
// 이메일 인증 메일 전송
2025
public void sendVerificationEmail(String toEmail, String token) {
2126
String subject = "[Catfe] 이메일 인증 안내";
2227
String verificationUrl = FRONTEND_BASE_URL + "/verify-email?token=" + token;
2328

24-
String text = """
25-
안녕하세요, Catfe에 가입해 주셔서 감사합니다.
26-
27-
아래 링크를 클릭하여 이메일 인증을 완료해주세요:
28-
%s
29-
30-
이 링크는 24시간 동안만 유효합니다.
29+
String htmlContent = """
30+
<p>안녕하세요, Catfe에 가입해 주셔서 감사합니다.</p>
31+
<p>아래 버튼을 클릭하여 이메일 인증을 완료해주세요.</p>
32+
<br>
33+
<p>
34+
<a href="%s" style="display:inline-block;padding:10px 20px;
35+
background-color:#4CAF50;color:#fff;text-decoration:none;
36+
border-radius:5px;">이메일 인증하기</a>
37+
</p>
38+
<br>
39+
<p>이 링크는 24시간 동안만 유효합니다.</p>
3140
""".formatted(verificationUrl);
3241

33-
sendEmail(toEmail, subject, text);
42+
sendHtmlEmail(toEmail, subject, htmlContent);
3443
}
3544

36-
private void sendEmail(String toEmail, String subject, String text) {
37-
SimpleMailMessage message = new SimpleMailMessage();
38-
message.setFrom(FROM_ADDRESS);
39-
message.setTo(toEmail);
40-
message.setSubject(subject);
41-
message.setText(text);
42-
43-
mailSender.send(message);
45+
// HTML 이메일 전송 공통 메서드
46+
private void sendHtmlEmail(String toEmail, String subject, String htmlContent) {
47+
try {
48+
MimeMessage message = mailSender.createMimeMessage();
49+
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
50+
51+
helper.setFrom(FROM_ADDRESS);
52+
helper.setTo(toEmail);
53+
helper.setSubject(subject);
54+
helper.setText(htmlContent, true); // true → HTML 모드
55+
56+
mailSender.send(message);
57+
} catch (MessagingException e) {
58+
throw new RuntimeException("이메일 전송 실패", e);
59+
}
4460
}
45-
}
61+
}

src/test/java/com/back/domain/user/service/EmailServiceTest.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package com.back.domain.user.service;
22

3+
import jakarta.mail.internet.MimeMessage;
4+
import jakarta.mail.Session;
5+
import org.junit.jupiter.api.BeforeEach;
36
import org.junit.jupiter.api.DisplayName;
47
import org.junit.jupiter.api.Test;
58
import org.junit.jupiter.api.extension.ExtendWith;
69
import org.mockito.InjectMocks;
710
import org.mockito.Mock;
811
import org.mockito.junit.jupiter.MockitoExtension;
12+
import org.springframework.context.annotation.Profile;
913
import org.springframework.mail.javamail.JavaMailSender;
10-
import org.springframework.mail.SimpleMailMessage;
14+
import org.springframework.test.context.ActiveProfiles;
15+
import org.springframework.test.util.ReflectionTestUtils;
1116

1217
import static org.mockito.Mockito.*;
1318

@@ -20,17 +25,28 @@ class EmailServiceTest {
2025
@InjectMocks
2126
private EmailService emailService;
2227

28+
@BeforeEach
29+
void setup() {
30+
ReflectionTestUtils.setField(emailService, "FROM_ADDRESS", "[email protected]");
31+
ReflectionTestUtils.setField(emailService, "FRONTEND_BASE_URL", "http://localhost:3000");
32+
}
33+
2334
@Test
2435
@DisplayName("이메일 인증 메일 전송 성공")
25-
void sendVerificationEmail() {
36+
void sendVerificationEmail_success() {
2637
// given
2738
String toEmail = "[email protected]";
2839
String token = "sample-token";
2940

41+
// MimeMessage Stub 반환하도록 설정
42+
MimeMessage mimeMessage = new MimeMessage((Session) null);
43+
when(mailSender.createMimeMessage()).thenReturn(mimeMessage);
44+
3045
// when
3146
emailService.sendVerificationEmail(toEmail, token);
3247

3348
// then
34-
verify(mailSender, times(1)).send(any(SimpleMailMessage.class));
49+
verify(mailSender, times(1)).createMimeMessage();
50+
verify(mailSender, times(1)).send(any(MimeMessage.class));
3551
}
3652
}

0 commit comments

Comments
 (0)