끝을 보는 용기

Day 134 - 취업을(취업을 위하여) 프로젝트 24%, 이메일 전송하기에 성공하다

writingforever162 2025. 2. 17. 23:23

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. 첫 이메일 전송에 성공했다.  

(1) 알림 기능 찾아 삼만리 Day 1 링크

(2) 알림 기능 찾아 삼만리 Day 2 링크

(3) 알림 기능 찾아 삼만리 Day 3 링크

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);
        }
    }
}

이 정도면 꽤 괜찮은 성공 아닌가. 실시간 알림 기능도 구현해야 하지만, 큰 산 하나 넘은 만큼 오늘은 보람이라는 사치를 조금 누려도 되지 않을까 싶었다. 얼마나 어디서 헤맸는지부터 어떤 고민과 생각으로 무슨 결정을 내렸는지 등등, 매일 매일 개발하고 기록하기가 절대 쉽진 않지만, 서비스를 잘 만들고 싶은 욕심을 마음껏 낼 수 있는 지금이 나쁘지 않다. 좋다고 하지 않은 이유는 짧은 시간 안에 생각을 빠르게 전환하기 쉽지 않은 점은 사실이니까. 기술에 끌려다니지 말자고 작업 전 거듭 다짐하지만 주변에서 '이런 기술을 썼다더라' 소문이 들려오면 조바심이 나는 점도 사실이니까.

 

어쩌면 지금이야말로 수많은 사람 속에서 튈 수 있는 나만의 강점을 찾아낼 수 있는 적기일지도 모른다.

 

기록하기를 정말 좋아한다든지,

 

사용자 관점에서 고민한다든지,

 

기타 등등.

 

내일은 오늘보다 더 깊이 생각하는 개발자가 되어야겠다.