얼마전에 모 고객사의 서버에 이메일 발송 기능을 구축할 일이 있었다.
요구사항 중에서 전 직원에 대하여 이메일을 발송하는 기능이 있었다.
그래서 기능을 개발한 뒤 운영서버에 반영하고 테스트를 해봤는데,
java.lang.OutOfMemoryError: Java heap space 오류 메시지가 자꾸 발생했다.
나는 다급해져서 구글링을 하기 시작했다.
그러나 java의 heap space를 늘려보라는 내용만 찾을 수 있었다.
하지만 내가 작업하는 서버는 고객사의 서버이고,
나는 heap space를 늘릴 권한이 없었다.
직원들이 퇴근한 시간에 작업을 하고 있었기 때문에 (아오 야근.. -_-)
권한 있는 담당자에게 요청할 수 있는 여지도 없었다.
그렇지만 약 1300명 정도 되는 전체 직원에 대하여 이메일을 발송하는 기능을 안 만들 수는 없었다.
그래서 내가 생각한 트릭은 아래와 같다.
"100명 정도씩 나눠서 발송하는 건 어떨까?"
그래서 아래와 같은 구조로 코드를 수정하였더니 전 직원에 대하여 메일 발송이 정상적으로 이루어졌다.
for(int idx = 0; idx < emailList.size() ; idx++){
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailList.get(idx))); //수신인 설정
if(( idx != 0 && idx % 100 == 0) || idx == emailList.size() - 1) {
/* idx를 100으로 나눈 나머지가 0이거나(idx가 100의 배수일 때)
idx 가 이 반복문 안에서 가장 큰 숫자일 때 작동*/
Transport.send(msg); //send emails
msg.setRecipients(Message.RecipientType.TO, new Address[]{}); //기존에 설정된 수신인 목록을 초기화
}
}
나의 경험을 그냥 혼자만 가지고 싶지 않아서,
아래와 같이 stackoverflow에도 답변을 남겼고
이렇게 내 블로그에도 기록을 남겨본다.
https://stackoverflow.com/a/70119748/12716141
추가)
1. 웹개발자 단톡방에서 메시지큐 기능을 사용해보는 것이 어떻냐는 조언을 받았습니다. 메시지큐(Message Queue) 기능은 대용량의 데이터를 송수신할 경우에 유용하다고 합니다. 안그래도 제가 적용한 기능 관련하여 추가 요청사항이 들어와서 수정을 해야 하니, 메시지큐를 적용할 수 있는지, 적용한다면 어떻게 적용할지 검토해볼 생각입니다. 추후에 필요시 관련 포스팅도 올릴 수 있도록 하겠습니다.