1. 프로젝트 진행 상황 및 계획
🥇 스프링 이메일(Spring Email)로 이메일 전송 기능 구현하기 (완료)
🥈 이메일 전송 기능 중복 조회 방지하기 (진행 중, 2025.02.18 완료 목표)
🥉 실시간 알림 기능 구현 방법 및 각 방법의 장단점 공부하기 (진행 중, 2025.02.23 완료 목표)
4️⃣ API 명세서 수정 및 검토하기 (진행 전, 2025.02.23 완료 목표)
5️⃣ 리드미(README) 틀 완성하기 (진행 전, 2025.02.23 완료 목표)
6️⃣ MVP(최소 기능 제품) 버전 테스트 코드 작성하기 (진행 전, 2025.02.23 완료 목표)
2. 첫 이메일 전송에 성공했다.
package com.project.cheerha.domain.notice.service;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class EmailService {
// JavaMailSender 객체로 이메일을 보낼 수 있음
private final JavaMailSender javaMailSender;
// 이메일 발신자 주소 설정
private static final String SENDER_EMAIL = "발신자의 이메일";
/**
* 수신자에게 이메일을 보내는 메서드
*
* @param recipientEmail 수신자 이메일 주소
* @param jobOpeningUrlList 채용 공고 목록
*/
public void sendMail(
String recipientEmail,
List<String> jobOpeningUrlList
) {
try {
// 새로운 이메일 메시지 객체 생성
MimeMessage message = javaMailSender.createMimeMessage();
// 메시지에 다양한 정보를 설정할 수 있도록 돕는 객체
MimeMessageHelper helper = new MimeMessageHelper(
message,
true,
"UTF-8"
);
helper.setFrom(SENDER_EMAIL);
// 발신자 설정
helper.setTo(recipientEmail);
// 수신자 설정
helper.setSubject("📢 새로운 맞춤 채용 공고가 도착했어요!");
// 이메일 제목 설정
// 이메일 본문 내용 구성
StringBuilder content = new StringBuilder();
content.append("<h1>🚀 새로운 채용 공고가 준비됐어요! 🎉</h1>");
content.append("<p>맞춤형 채용 공고가 도착했답니다! 💼</p>");
content.append("<p>아래 링크에서 확인해보세요! ⬇️</p>");
content.append("<ul>");
// 채용 공고 URL 목록을 리스트 형식으로 출력
for (String url : jobOpeningUrlList) {
content.append("<li>👉 <a href=\"")
.append(url)
.append("\" target=\"_blank\">")
.append("채용 공고 자세히 보기</a></li>");
}
content.append("</ul>");
content.append("<p>행운을 빕니다! 🙌</p>");
// HTML 형식으로 본문 내용 설정
helper.setText(content.toString(), true);
// 이메일 발송
javaMailSender.send(message);
log.info("이메일 전송 완료: {}", recipientEmail);
} catch (MessagingException e) {
log.error("이메일 전송 실패: {}", recipientEmail, e);
}
}
}
이 정도면 꽤 괜찮은 성공 아닌가. 실시간 알림 기능도 구현해야 하지만, 큰 산 하나 넘은 만큼 오늘은 보람이라는 사치를 조금 누려도 되지 않을까 싶었다. 얼마나 어디서 헤맸는지부터 어떤 고민과 생각으로 무슨 결정을 내렸는지 등등, 매일 매일 개발하고 기록하기가 절대 쉽진 않지만, 서비스를 잘 만들고 싶은 욕심을 마음껏 낼 수 있는 지금이 나쁘지 않다. 좋다고 하지 않은 이유는 짧은 시간 안에 생각을 빠르게 전환하기 쉽지 않은 점은 사실이니까. 기술에 끌려다니지 말자고 작업 전 거듭 다짐하지만 주변에서 '이런 기술을 썼다더라' 소문이 들려오면 조바심이 나는 점도 사실이니까.
어쩌면 지금이야말로 수많은 사람 속에서 튈 수 있는 나만의 강점을 찾아낼 수 있는 적기일지도 모른다.
기록하기를 정말 좋아한다든지,
사용자 관점에서 고민한다든지,
기타 등등.
내일은 오늘보다 더 깊이 생각하는 개발자가 되어야겠다.