본문 바로가기
Today I learned

2021 02 04 - Email Template 수정

by soheemon 2021. 2. 4.

메일 템플릿 수정건

설명


ASIS 코드는 템플릿을 문자열로 통째로 만들어놓고, 조건에 따라 replace하는 구조다.   
코드에 마크업이 섞여있어서 로직을 파악하기 어렵고 유지보수가 거의 불가능한 구조였다.  

// AS-IS의 코드..

String mailTemplateBase = 
"<html>" +
"MEMBER_NAME" +
"MEMBER_AGE" +
"MEMBER_GENDER"
"</html>";

if(isNotEmpty(memberName)){
	mailTemplateBase.replace("MEMBER_NAME", "<span><p>소희</p></span>");	// 마크업 코드가 박혀있음..
}else{
	mailTemplateBase.replace("MEMBER_NAME", "");	// 데이터가 없으면 일일히 빈 문자열로 대체해줘야 했다. 때문에 쓸데없이 가독성이 떨어진다!
}

if(isNotEmpty(memberName)){
	mailTemplateBase.replace("MEMBER_AGE", "<span><p>31</p></span>");
}else{
	mailTemplateBase.replace("MEMBER_AGE", "");
}

if(isNotEmpty(memberName)){
	mailTemplateBase.replace("MEMBER_GENDER", "<span><p>F</p></span>");
}else{
	mailTemplateBase.replace("MEMBER_GENDER", "");
}


메일 디자인 템플릿이 새로 바뀌면서 로직을 통째로 들어내고 다시 작성해야만 했다.

 

메일 전송구조


웹서버에서 바로 전송하는것이 아닌, 외부 메일 솔루션을 이용해서 메일을 발송하고 있다.
JAVA로 웹메일 템플릿을 만들어서 DB에 문자열로 넣어놓으면, 주기적으로 웹메일에서 데이터를 긁어가는 배치가 돌고, 메일솔루션에서 메일을 발송하게 된다.

 

JAVA로 DOM 컨트롤하기 - JSoup

- 간단한 주요 메서드 설명

메서드 이름 동작설명 그외
Jsoup.parse(String htmlTemplate) htmlTemplate를 받아서 Document객체를 반환한다.  html 문법에 맞지 않으면 자동으로 고쳐주는등 우리가 알던 js 돔조작과는 차이가 있다. 상당히 (내게는 쓸데없이) 친절한 동작을 하고있으니 자세한 내용은 공식 문서를 참고한다. 
 jsoup.org/cookbook/cleaning-html/whitelist-sanitizer
Element Document.getElementById('idValue') 응. 우리가 아는 그 getElementById.  
Element.append(String htmlTemplate) 응 우리가 아는 그 append  
Element orderItemElement = new Element(Tag.valueOf("tr"), ""); Element 생성자. createElement라고 생각하면 된다. soheemon.tistory.com/entry/2021-01-06-Jsoup-%EC%9A%B0%EC%97%AC%EA%B3%A1%EC%A0%88%EA%B8%B0-JSoup%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-String-to-Element?category=880552

개발 목표

마크업코드와 서비스 로직을 완전히 분리하자. + replace는 데이터를 꽂아줄때만!

DOM으로 조작하자.
기존 로직은 템플릿을 문자열로 만든 후, 순서없이 replace하는 구조여서 로직을 따라가기가 어려웠기 때문.. 코드의 가독성을 높혀보자.

 

class orderHTMLTemplate {
	String getBaseTemplate () {
        StringBuilder sb = new StringBuilder();
    	sb.append("<html>");
        sb.append("<table id=\"base_template\"> </table>")
        sb.append("</html>");
    };
    
    String getOrderInfoHtml(){
    	StringBuilder sb = new StringBuilder();
    	sb.append("<tr>");
        sb.append("<td> ORDER_INFO_NAME</td>")
        sb.append("</tr>");
    }
}

orderHTMLTemplate html = new orderHTMLTemplate();
String baseHTML = html.getBaseTemplate();				// HTMLTemplate에서 전체 큰 틀을 가져온다.

Document resultHtmlDocHtml = Jsoup.parse(baseHTML);		// 큰 틀을 파싱!

Element baseTemplate = resultHtmlDocHtml.getElementById("base_template");
String name = request.getRequestProperty("name", "");
String nameHtml = html.getOrderInfoHtml().replace("name", name);	//replace는 데이터를 꽂아넣을때만!
baseTemplate.append(nameHtml);			// base_template에 getOrderInfoHtml를 append!

 

회고

- 왜 JSP에서 JSTL을 사용해서 전송하도록 로직을 변경하지 않았을까 하는 아쉬움.

마크업 코드들을 JAVA에서 String으로 관리하려고 하니까 번거로워서 화가 났었다. JSoup 사용도 사실 그렇게 가독성이 높은것이 아니라서..

시간이 더 있었다면 JSP에서 전송하도록 변경했을텐데..

'Today I learned' 카테고리의 다른 글

2021 02 08  (0) 2021.02.08
2021 02 08 - sql 소소한 정리  (0) 2021.02.08
2021 02 03 - 검색시스템  (0) 2021.02.03
2020 01 06 - Appium  (0) 2021.01.06
2021 01 06 - Jsoup 우여곡절기 (JSoup을 이용한 String to Element)  (0) 2021.01.06

댓글