메일 자동화
이번 프로젝트를 진행하면서 가장 중점적으로 다뤄야할 부분이었다.
기존 플로우에서 사람이 하기에 가장 공수가 많이 드는 작업이라 효율적인 처리가 필요했다.
메일 발송 자동화에서의 큰 목표는 다음과 같았다.
- 메일 제목과 본문 내용은 해당 업체에 맞게 작성되어야 한다.
- xlsx 템플릿을 해당 업체 정보에 맞게 커스텀하게 구성한뒤, pdf로 변환하여 첨부해야 한다.
- “이 모든 작업이 버튼 클릭 한두번 만으로 자동화가 되어야 한다.”
기본적으로 제공받은 파일은 4개가 있었다.
- 통장 사본 이미지 파일
- 회사 사업자 등록증 pdf 파일
- 서비스 이용료 납부 안내 xlsx 파일
- 메일 템플릿 html
선제 조건

메일 전송을 위한 조건은 다음과 같다.
- 메일 템플릿을 기준으로 내용을 작성을 해야한다. 지정할 변수는 제목과 본문에 하나씩 있다.
- 메일 제목 – 카카오톡 비즈메세지 서비스 이용대급 미납 안내드립니다_{업체명}
- 본문 – 납부 및 제출 기한 : {yyyy.mm.dd(E)}
- 통장사본과 사업자 등록증 파일은 디폴트로 첨부를 해야한다.
- 3번 파일에서 특정 cell 을 해당 미납 업체에 맞춰서 수정해야한다.
- 문서 번호
- 문서 생성 날짜
- 수신자
- 청구월
- 미납 금액
- 납부 기한
- 수정한 xlsx 파일을 pdf로 변환하여 첨부를 해야한다.
기술 선정
신규 프로젝트였기 때문에 스택은 자유롭게 선정할 수 있었다.
(서버에 운영 중인 Java 버전이 있어서, JDK는 tar로 묶어 함께 배포하는 방식으로 처리했다)
- Java 17
- Spring 3.5.0
- MyBatis
- MySQL
- Java-Mail
- Apache POI
- Libre-Office
MyBatis는 기존 테이블과의 결합을 용이하게 하기 위해 선택했다.
JPQL로 DTO Projection을 하거나, QueryDSL을 사용하는 방법도 고려해볼 수 있었지만,
기존 시스템이 MyBatis 기반이라 참고할 수 있는 쿼리가 많았다.
또한 사내 대부분의 시스템이 JPA를 사용하지 않고 있어, 향후 인수인계 시에도 MyBatis가 더 수월할 것이라 판단했다.
나아가, 메일 발송을 위해 Java-Mail을, 엑셀의 cell 값을 수정하기위해 Apache POI 라이브러리를 추가했고,
엑셀을 pdf로 변환하기 위해 Aspose를 도입했었다.
(그러나 무료 라이센스로 사용하니 pdf 상단에 빨간색으로 텍스트가 떴다.)

결국 Libre-Office로 교체해서 테스트를 해보고 정상 동작하는 것을 확인했다.
그러나 서버에 설치할 수 있는 권한은 없었기에, AppImage로 업로드해서 포터블하게 활용했다.
(WAS 내에서 headless 옵션을 붙여서 프로세스 빌더로 처리했다)
그러나 pdf 산출물을 살펴보니 글자가 다 깨져있었고, 아니나 다를까 폰트가 없어서 깨지는 이슈가 있었다.
(맥이라 윈도우 폰트가 없다. 리눅스 서버에도 당연히 없었다.)
결국 추가로 Malgun 폰트까지 함께 업로드 해주어야 했다.
ERD

기존 데이터베이스에 추가된 테이블은 다음과 같다.
- 미납 업체 목록에서 추가한 채권목록은 ‘AUTOBOND’ 테이블에 저장한다.
- 메일 발송에 첨부하기위해 생성된 파일은 ‘AUTOBOND_DOCUMENT_FILE’ 테이블에 로그로 남긴다.
- 동일한 조건의 파일을 매번 새로 생성하지 않기 위해, 생성 이력을 저장하는 로그 테이블을 활용했다.
- 이를 통해 기존에 생성된 파일이 존재하는 경우에는 재활용이 가능하도록 구성했다.
- pk는 16자리의 해시값과 확장자를 활용하여 복합키로 지정했는데, 해당 해시는 다음 값들을 기반으로 생성된다.
(이를 통해 해당 조건 마다의 고유성을 보장했다.)- 사이트 아이디
- 문서 생성일
- 청구월
- 납부기한
- 미납 금액
- 동일한 조건의 파일을 매번 새로 생성하지 않기 위해, 생성 이력을 저장하는 로그 테이블을 활용했다.
- 최종적인 메일 및 알림톡 발송 로그는 ‘AUTOBOND_SEND_LOG’ 테이블에 로그를 저장한다.
추가로, 첨부되는 static한 이미지 및 pdf 파일과 템플릿 xlsx 파일은(3종) ‘./autobond/data/src/’ 경로에 저장했고,
파생된 파일은 ‘./autobond/data/doc/{hash}/’ 디렉토리에 xlsx, pdf 파일을 각각 저장하도록 했다.
(IDC 서버라 S3를 쓸 수 없어서 서버 업로드를 할 수 밖에 없었다.)
발송 플로우
최종적으로 개발한 메일 발송 플로우는 다음과 같다.
- 클라이언트 측에서 ‘사이트 아이디’, ‘청구월’, ‘발송대상’ 을 json 으로 담아서 api 서버로 POST 요청을 전송한다.
- 서버는 DB에서 AUTOBOND 테이블을 조회하여 해당 채권을 특정한다.
- Java Mail을 html 템플릿을 기반으로 작성한다. 제목과 본문을 해당 업체에 맞게 구성한다.
- 해당 채권의 컬럼 값들을 기준으로 xlsx, pdf 파일이 존재하는지 로그 테이블을 조회한다. (존재한다면 해당 경로의 파일을 활용한다)
- 파일 및 디렉토리가 존재하지 않는다면 src 경로에 있는 xlsx 템플릿을 가져온다.
- 해당 엑셀 템플릿에서 enum으로 지정해놓은 cell에 apache-poi를 통해 미납업체에 맞는 정보를 기입한 다음 해당 hash 값의 디렉토리에 저장한다.
- 해당 xlsx 파일 생성 로그를 AUTOBOND_DOCUMENT_FILE 테이블에 남긴다.
- 생성된 xlsx 파일을, Libre-office를 process builder를 통해 pdf로 변환하여 해당 hash 값의 디렉토리에 저장한다.
- 해당 pdf 파일 생성 로그를 AUTOBOND_DOCUMENT_FILE 테이블에 남긴다.
- 메일의 attachmentPart에 해당 첨부파일을 등록한다.
- 발송 대상에게 메일을 전송한다.
- AUTOBOND_SEND_LOG에 발송 로그를 저장한다.
- 클라이언트 측에 발송 결과 및 발송 시간을 전달한다.
결과
단체 메일 발송

타겟 메일 발송

수신 결과
