본문 바로가기
Lecture/Spring

[본격 이메일 보내기 part2] java reflect를 이용한 이메일 템플릿 빈 셋팅

by cusmaker 2013. 4. 22.
반응형


2013/04/22 - [Lecture/Spring] - [본격 이메일 보내기 part1] gmail을 이용한 spring 이메일 발송 기능 설정


cocy입니다.

이번 포스팅에서는 지난 시간에 이어 이메일 발송기능을 구현할건데요, 

이미 저번포스팅에서 이메일이 발송되는것을 확인 하실 수 있었을겁니다.

그럼 이번 포스팅에서는 이를 어떻게 효율적으로 활용할 수 있는지에 관해 생각을 좀 해볼텐데요,



보통 회원들에게 이메일을 발송한다 했을때, 이메일의 내용은 동일하나 안의 회원 정보에 대해서만 내용이 바뀝니다.

그렇다면 이러한 회원정보 빈을 가지고 이메일 템플릿의 내용을 효과적으로 채울 수 있지 않을까 생각해보게되었습니다.

그래서 이번 내용은 스프링이나 웹이라기보다 순수 자바에 가까운 내용입니다.


먼저 회원정보를 넣을 빈을 하나 생성합니다.

package com.email.bean;
 
public class Member {
    private String email;
    private String name;
    private String password;
    private String duty;
    private String department;
    private String phone;
    private String regdate;
     
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getDuty() {
        return duty;
    }
    public void setDuty(String duty) {
        this.duty = duty;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getRegdate() {
        return regdate;
    }
    public void setRegdate(String regdate) {
        this.regdate = regdate;
    }
}


이에 관련한 DAO구성이나 SqlMap은 생략하도록 하겠습니다.


그리고 이메일 템플릿을 저장할 데이터베이스를 생성합니다.

CREATE TABLE "CONF"."EMAIL_TEMPLATE"
 (    "TEMPLATE_ID" NUMBER,
  "SUBJECT" VARCHAR2(200 BYTE),
  "CONTENT" CLOB,
  "REGDATE" VARCHAR2(20 BYTE) DEFAULT sysdate,
  "DESCRIPTION" VARCHAR2(200 BYTE)
 )

그럼 이렇게 생성된 Bean과 DB를 바탕으로 지난 포스팅에서 작성한 컨트롤러의 sendEmailAction을 수정합니다.

@RequestMapping("/send")
public ModelAndView sendEmailAction () throws Exception {
 
    Member user = new Member();     
    user.setEmail("user@email.com");
    user.setPhone("01000001111");
    user.setDepartment("mydepartment");
     
    Email email = new Email();
     
    String reciver = user.getEmail();
    String subject = getEmailTemplateSubjectFromDB();   // 이부분은 디비로부터 이메일 템플릿을
    String content = getEmailTemplateContentFromDB();   // 가져오는 부분으로 작성하셔야 하는 부분입니다.
     
    Class cls = user.getClass();
    Method[] invokeMethod = cls.getMethods();
    for (int i = 0; i < invokeMethod.length; i++) {
        if(invokeMethod[i].getName().contains("get") && invokeMethod[i].invoke(user, null) != null ){
            content = content.replaceAll(invokeMethod[i].getName(), invokeMethod[i].invoke(user, null).toString());
            subject = subject.replaceAll(invokeMethod[i].getName(), invokeMethod[i].invoke(user, null).toString());
        }
    }
     
    email.setReciver(user.getEmail());
    email.setSubject(subject);
    email.setContent(content);
    emailSender.SendEmail(email);
      
    return new ModelAndView("success");
}

소스 설명을 하면 먼저 Member객체를 생성하고, 해당 객체에 값을 셋팅합니다.

이때 값은 @ModelAttribute와 같은 파라미터를 이용하여 폼으로부터 받으면 되겠습니다. 

지금은 강제로 하드코딩하였습니다.


이후 데이터베이스로부터 이메일 템플릿의 제목과 내용을 가져옵니다. 

이 내용도 역시 단순히 데이터베이스에서 CRUD를 하는부분이니 DAO나 Sqlmap과정은 생략하겠습니다.


그럼 주요 코드는 그 다음부터인데요,

해당 빈의 클래스정보를 받아와서 getter에 해당하는 메소드들을 조회합니다.

이중 실행결과가 null이 아닌 겟터 메소드들만을 비교하여

이후 가져온 템플릿에서 겟터의 이름과 일치하는 스트링을 찾으면 

해당 겟터 메소드를 실행하여 값을 치환합니다.


이후 이메일에 내용을 다시 셋팅하고 이메일을 발송합니다.


코드가 약간 난해 할수있어 그림으로 추가 설명 드리겠습니다.

클래스 다이어그램을 그려보면, 


이런 그림이 나오는데요, 이메일을 발송하기위해 좌측의 이메일빈에 데이터베이스로부터 가져온 템플릿을 셋팅하는데요,

셋팅전에 제일 중요한 이메일 템플릿을 어떻게 구성되느냐, 

아까 작성한 Email_Template 테이블에 예를들면 다음과 같은 정보들이 들어가면 됩니다.

Database > Email_Template > subject : [안녕하세요 getName님] 이메일이 발송되었습니다.

Database > Email_Template > contnet : 이메일 내용입니다. 당신의 이름은 getName, 소속은 getDepartment입니다.


그러면 이러한 이메일 템플릿 내용을 바탕으로

우측의 멤버빈의 내용을 셋팅하기위해 컨트롤러에서 자바의 reflect 메소드들을 사용하여 멤버빈의 겟터 정보를 조회합니다.

이후 템플릿 내용에서 겟터 메소드의 이름을 만나면 해당 겟터 메소드를 실행시켜 해당 이메일 템플릿에 내용을 치환합니다.

그리고 나서 이메일이 발송됩니다.


이렇게 되면 템플릿에 관계없이 이메일 템플릿에 겟터정보만 포함하면

원하는 회원정보를 셋팅하여 이메일을 발송할 수 있습니다.

관리자 기능에서 이메일 템플릿을 변경할땐, 

마찬가지로 겟터정보를 조회하여 넣고싶은 회원의 정보를 셀렉트박스와 같은 ui를 제공, 

회원의 정보를 선택하게 한뒤 불특정 회원의 맞춤정보가 셋팅된 이메일을 발송하게됩니다.


그럼 이상으로 포스팅을 마치겠습니다.

궁금하신 사항은 댓글이나 블로그 상단의 JDC에 올려주세요!!