Search
Duplicate
🔫

메일 알람 날짜가 표기되지 않는 문제

분야
BE
ISSUE
주제
BE
Alarm
심각도
낮음🤒
제보자
sunhwang
담당자
작성자
상태
처리 완료
이슈링크(optional)
작성일자
2024/01/01 06:15
공개여부
공개
글감

문제 상황

어떤 것을 하려다가 문제가 발생했는가?
발생한 환경, 프로그램
발생한 문제(에러)

원인

예전 javaMailSender 템플릿에서는 반납일자를 따로 언급하지 않았고, 대여기간 확인하라는 멘트로 대신했다.
변경 이후 대여기간을 표시해주려고 메일 템플릿은 바꾸었으나, 내부 로직 수정이 이루어 지지 않았던게 문제였다.
현재 대여중인 대여기록을 가져와서, OverdueManager에 넘긴다.
OverdueManager에서, 우리가 설정 해놓은 시간에 따라 연체 임박(SOON_OVERDUE) 혹은 연체 상태(OVERDUE) 로 분류하고, 두 상태일 경우에는 유저에게 알람을 보낸다.
여기서 연체 임박일 경우에, LentExpirationImminentAlarm 객체를 생성하는데, 이 객체에는 expireDate 가 없고, OverdueManager에서 접근할 수 있는 정보인 연체일자(daysAfterFromExpireDate) 만 있다.
연체가아닌, 임박 이므로 반납일 하루전일 경우 -1, 이틀전일경우 -2 이런식으로 저장된다.

왜?

기존 로직

위에서 만든 Alarm 객체에서 overdueDays 를 가져오고, 메일에 보낼 context에 overdueDays 라는 이름으로 설정을 해준다.

메일 보내는 로직

수신인, 제목등을 설정하고,
핵심 부분은 templateEngine.process 부분이다.
template 위치를 지정해주고, context 를 넣어주면, javaMailSender 라이브러리로 만들어진 메시지를 보낸다.
참고로 template 는 resouces 폴더에, html 로 이렇게 미리 만들어 놓고, 프로젝트 루트 디렉토리로부터 경로를 mailDto.getTemplate() 하면 가져오는것이다.
mailDto.getTemplate() 한 내용은 아래와 같다.
문제의 그 부분이다.
우리는 overdueDays로 context를 만들어줬는데, expireDate 를 찾고 있다. 따라서 빈 값으로 나올 수 밖에 없었다.

최종 해결

일단 LentExpirationImminentAlarm 객체에서, expireDate 를 계산하도록 했다.
왜 이렇게 했는지는 리펙토링 브렌치에서 수정중에 있어서다 (위에 “왜” 참고) 나중에 아예 가져올때, expiredAt 을 가져와서 ActiveLentHistory 객체에서 반환하도록 바꾸는게 더 좋을것 같다.
context 를 expireDate 라는 이름으로 변경해줬다. (template에서 사용하는 변수명)
이제 날짜가 잘 나온다.

참고자료

없음