Spring Batch 이용한 API 호출횟수 집계 - 4. 이메일로 보내기

Kim Dong Kyun·2023년 6월 15일
1

Spring Batch

목록 보기
4/6

개요

  1. .txt 파일 저장 너무 좋아. 근데 실제 통계자료를 활용하려면 어쨋든 이걸 사용하는 사람 (담당하는 사람) 에게 넘겨야 할 거 아님?
  2. 메일로 보낸다고 가정하고, 메일로 보내는 법을 한번 시도해보자

0. Gmail 세팅

참고 블로그. 여길 보시는 게 더 낫습니다!

의존성 추가 + Gmail 과의 연동은 위의 블로그에서 참조했다.


1. MailService 작성

@RequiredArgsConstructor
@Service
public class MailService {
    private final JavaMailSender mailSender;
    public void sendEmailWithAttachment(String receiverEmail
    , String subject, String body, String filePath)
            throws MessagingException {

        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);

        helper.setTo(receiverEmail);
        helper.setSubject(subject);
        helper.setText(body);

        File attachment = new File(filePath); 
        // 패스에 이미 저장해놓은 텍스트 파일임 ( 먼저 실행된 Job에서 생성됨 )
        
        helper.addAttachment(attachment.getName(), attachment);

        mailSender.send(message);
    }
}
  • JavaMailSender 객체를 의존주입 받아서 사용한다
  • MailSender 객체에서 제공하는 .createMimeMessage() 매서드로 매세지를 만드는데, MimeMessageHelper 객체를 가져와서 메시지의 세부 내용을 가공할 수 있다.
  1. MimeMessageHelper 설정
  • helper.setTo(받는 사람) : 받는 사람의 이메일 주소 "reciever@gmail.com" 과 같은 형식
  • helper.setSubject(제목) : 보낼 이메일의 제목
  • helper.setText(내용) : 보낼 이메일의 내용
  • helper.addAttachment(첨부파일 이름, 첨부 파일 객체) : 이름, 객체를 설정해서 첨부 파일을 넣을 수 있다(이름 = 메일 수신 시 보일 이름)
  1. mailSender.send(message)

2. 해당 서비스를 의존주입 후 Job에 추가

위에 작성한 코드는 이메일을 보내는 "기능" 이므로, Job 으로 설정해서 자동화 하면 더 좋을 것 같다. 의존 주입해서, 자동 발송해보자

  • 지난 시간 사용한 JobCaller 클래스를 사용한다.
@RequiredArgsConstructor
@Component
public class JobCaller {
    private final JobLauncher jobLauncher;
    private final Job simpleJob1; // bean으로 등록되어 있기 때문에 의존 주입 받을 수 있다.
    private final MailService mailService;
    @Value("${output.file.path}")
    private String outputFilePath;

    @Scheduled(cron = "0 * * * * *")
    public void runApiCallJob() throws JobParametersInvalidException,
            JobExecutionAlreadyRunningException,
            JobRestartException, JobInstanceAlreadyCompleteException, MessagingException {
        JobParameters jobParameters = new JobParametersBuilder()
                .addDate("date", new Date())
                .toJobParameters();

        jobLauncher.run(simpleJob1, jobParameters);

          String receiverEmail = "receiver@naver.com"; // 받는 사람 이메일 주소
        String subject = "테스트 : 제목"; // 제목
        String body = "테스트를 위해서 발송됩니다"; // 내용

        // 파일 만들 때 시간 저장하던 놈들. 시간을 찍어주기 위해서 사용한다
        LocalDate currentDate = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM_dd");
        String formattedDate = currentDate.format(formatter);

        String filePath = outputFilePath + "/movie_" + formattedDate + ".txt"; // 파일 경로
        mailService.sendEmailWithAttachment(receiverEmail, subject, body, filePath);
    }
}
  • 저번 시간 만든 파일의 형식은 movie_yyyy_MM_dd.txt 와 같은 형식이므로, 해당 디렉토리 + 정확한 파일 이름을 만들어준다.

  • 의존 주입 받은 서비스에서 우리가 만들어준 sendEmailWithAttachment 매서드를 사용, 메일을 보내준다.

위와 같이 보낸 편지로 잘 가는 모습

더불어 네이버 메일로 발신했는데, 수신자는 어떻게 보일까?

이런 식으로, 우리가 작성한 파일 이름과 함께 잘 도착하고 있는 모습.


그런데, Docker에 올리면 어떻게되나요?

Docker 에 올리게 되면 루트 디렉토리에 대한 설정을 다시 해야 할거고, 따라서 파일 저장 / 저장한 파일 이메일 전송 등에서 문제가 있을 것이 분명하다.

그렇다면 컨테이너 환경에서의 설정은 어떻게 할까? - 그것은 잠시 후에 포스팅 하도록 하겠습니다...

0개의 댓글