개발 일지/취하여 프로젝트

4주 차: 알림 기능 찾아 삼만리 Day 20 - 아니, 이메일 안에 토글을 못 넣는 건 계획에 없었습니다만?

writingforever162 2025. 3. 6. 21:19

[알림 기능 찾아 삼만리 링크 1주 차: (1) (2)]

[알림 기능 찾아 삼만리 링크 2주 차: (3) (4) (5) (6) (7) (8) (9) (10)]

[알림 기능 찾아 삼만리 링크 3주 차: (11) (12) (13) (14) (15) (16) (17) (18) (19)]

package com.project.cheerha.common.email.format;

import com.project.cheerha.domain.notification.entity.Notification;
import java.util.List;

public class NotificationFormat {

    public static String[] createEmailNotification(List<Notification> notificationList) {
        // 이메일 제목
        String subject = "📢 새로운 맞춤 채용 공고가 도착했어요!";

        // 이메일 본문 생성
        StringBuilder content = new StringBuilder();

        content.append("<h1>🚀 새로운 채용 공고가 준비됐어요! 🎉</h1>");
        content.append("<p>맞춤형 채용 공고가 도착했답니다! 💼</p>");
        content.append("<p>아래 링크에서 확인해보세요! ⬇️</p>");
        content.append("<ul>");

        int count = 0;

        // 알림(Notification) 목록을 이메일 내용에 추가
        for (Notification notification : notificationList) {
            if (count < 3) {
                content.append("<li>👉 <a href=\"")
                    .append(notification.getJobOpeningUrl())
                    .append("\" target=\"_blank\">")
                    .append("채용 공고 자세히 보기</a></li>");
            }
            count++;
        }

        // 3개 이상 채용 공고가 있을 때 토글 형식으로 추가
        if (notificationList.size() > 3) {
            content.append("<details>");
            content.append("<summary><b>👉 숨겨진 채용 공고 보기</b></summary>");
            content.append("<ul>");

            // 3개 이상 추가로 존재하는 채용 공고 나열
            for (int i = 3; i < notificationList.size(); i++) {
                Notification notification = notificationList.get(i);
                content.append("<li>👉 <a href=\"")
                    .append(notification.getJobOpeningUrl())
                    .append("\" target=\"_blank\">")
                    .append("채용 공고 자세히 보기</a></li>");
            }

            content.append("</ul>");
            content.append("</details>");
        }

        content.append("</ul>");
        content.append("<p>행운을 빕니다! 🙌</p>");

        return new String[]{subject, content.toString()};
    }
}

원래 계획은 사용자가 고른 기술 키워드와 채용 공고 속 기술 키워드와 많이 겹치는 순으로 나열한 다음 그 중 TOP 1~3을 보여주고, 그 아래 '더보기'와 같이 처리하여 나머지 채용 공고 목록을 전부 보여주고 싶었다. 만약 인기 있는 기업인데 기술 키워드가 적게 겹쳐서 목록에서 제외될 수도 있었으니까.

 

사실 여기서 문제가 터질 줄은 상상도 못 했는데…….

세상에, 버튼이고 토글이고 전혀 동작하지 않았다. 처음에는 <details>와 <summary> 같은 HTML 태그를 사용해서 토글을 구현하려고 했으나 실패했고, 그다음에는 CSS로 문제를 해결하려고 했으나 결과는 똑같았다. 어떻게 해도 문제가 해결되지 않았다. 

 

원인을 찾아본 결과, 이메일 클라이언트에서는 대부분 토글이나 버튼 같은 동적 콘텐츠를 차단하는 보안 제한이 있어서 이러한 문제가 발생했다. 사실상 토글이나 버튼을 구현하기는 불가능한 셈이었다.

이 문제 때문에 오밤중에 이메일만 10건 넘게 보냈다. 반쯤 감긴 눈으로 모니터를 뚫어져라 쳐다보다가 결국 차선책을 택했다.

 

아쉬운 대로 채용 공고를 20개만 선정하여 이메일 알림으로 전송하기로 했다. 

마음 같아서는 '채용 공고 자세히 보기'가 아니라 각 채용 공고의 제목을 추출해서 변수처럼 반영하고 싶었는데, 이 부분 또한 지금 개발 일정에서는 우선순위가 아니었기에 나중에 기회가 된다면 도전하기로 했다. 아쉬운 대로 문제를 해결한 다음에는 미뤄둔 고민을 이어서 했다.

 

'그래, 한 이메일 안에 채용 공고는 일단 스무 개만 뽑아서 보내주자.'

 

'잠시만, 근데 기술 키워드가 겹치는 순 말고 다른 선정 기준은 없나?'

 

Day 21에서 계속…….