728x90
반응형

이전 글에서 엑셀 데이터를 읽어와 DB에 저장하기

 

때로는 현업과 아님 타 부서에서 엑셀 데이터를 어드민 페이지에서 볼 수 있게 해달라고 한다면,

그리고 엑셀 파일에 수백 가지의 데이터가 있다면,

어떻게 하겠습니까? 

수 작업으로 데이터에 저장하기는 어려운 일입니다

 

그래서 엑셀을 업로드해서 자바에서 읽을 수 있는 방법을 모색해보았습니다

 

자세한 사항이 알고 싶으시면 아래의 링크를 클릭하시면 됩니다

 

 

2022.08.05 - [IT_Web/Java] - Java 엑셀 데이터 읽어오기 및 다중 insert 한방에 하기

 

Java 엑셀 데이터 읽어오기 및 다중 insert 한방에 하기

오늘은 엑셀 데이터를 업로드해서 자바에서 데이터를 받아서 insert를 하든 아니면 다시 그 데이터를 다시 조합해서 웹에 다시 전달하는 등 핸들링하는 방법을 알아보겠습니다 그리고 클래스명

tantangerine.tistory.com

 

메일 보내기 앞서 Velocity란? 무엇인가?

메일을 보내기 위해서는 HTML 태그가 필요하며

head태그와 body에 각종 태그를 삽입하여 템플릿을 만들어서 

일정한 코드를 삽입해서 로고나 이미지를 보여줄 수 있습니다

하지만 태그만 필요한 것이 아닌 DB에서 관리하는 데이터들도

같이 범용성 있게 노출시켜야 합니다

그러기 위해서 vm파일에 데이터를 같이 합성하여 사용하기 위해

velocity를 사용합니다

 

 

velocity 설정 및 추가하기

Velocity를 활용하기 위해 pom.xml에 추가합니다

 

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
    <scope>system</scope>
    <systemPath>${webapp.lib}/velocity-1.7.jar</systemPath>
</dependency>

 

 

bean과 필요한 값을 설정합니다

로그인 및 비밀번호와 패스워드를 설정합니다

그리고 메일을 보낼 서비스단도 추가합니다

 

 

<!-- smtp 메일전송 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="host" value="mail.######.net"/> 
    <property name="port" value="25" /> 
    <property name="username" value="xxxxxx@naver.net"/> 
    <property name="password" value="#####"/> 
    <property name="javaMailProperties"> 
        <props> 
          <prop key="mail.smtp.auth">true</prop>
          <prop key="mail.debug">true</prop>
          <prop key="mail.smtp.auth.mechanisms">LOGIN</prop>
        </props> 
    </property> 
</bean>

<bean id="mailer" class="kr.co.xxxxxx.common.mail.Mailer">
    <property name="velocityEngine" ref="velocityEngine" /><!--velocityEngine bean참조 -->
</bean>

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
    <property name="resourceLoaderPath" value="WEB-INF/mailtemplate/"/>
</bean>

 

 

위의 코드에 "WEB-INF/mailtemplate/"를 확인할 수 있습니다

그 저장소에는 mailtemplate.vm이 지정되어있습니다

아래와 같이 설정되어 메일 형식을 지정하여 보낼 수 있습니다

 

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title></title>
</head>
<body>
  <!-- header -->
  <table width="600" border="0" align="center" cellpadding="0" cellspacing="0" style="text-align:left;font-size:16px;font-family:Malgun Gothic, '맑은고딕', Dotum, '돋움', Tahoma, Helvetica Neue, Helvetica, sans-serif;background-color:#fff;margin:0 auto">
    <tbody>
      <tr><td height="100">&nbsp;</td></tr>
      <tr>
        <td>
          <table width="600" border="0" align="center" cellpadding="0" cellspacing="0">
          <tbody>
          <tr>
            <td width="139" align="left"><a href="#"><img src="images/logo.png" alt="autobell" border="0"/></a></td>
            <td width="133">&nbsp;</td>
          </tr>
          </tbody>
          </table>
        </td>
      </tr>
    </tbody>
  </table>
  <!-- //header -->

  <!-- content -->
  <table width="600" border="0" align="center" cellpadding="0" cellspacing="0" style="text-align:left;font-size:16px;font-family:Malgun Gothic, '맑은고딕', Dotum, '돋움', Tahoma, Helvetica Neue, Helvetica, sans-serif;background-color:#fff;margin:0 auto">
    <tbody>
      <tr><td height="70">&nbsp;</td></tr>  
      <tr>
        <td>
          <table width="600" border="0" align="left" cellpadding="0" cellspacing="0" style="text-align:left;font-size:16px;font-family:Malgun Gothic, '맑은고딕', Dotum, '돋움', Tahoma, Helvetica Neue, Helvetica, sans-serif;background-color:#fff">
            <tbody>
            <!-- title -->
            <!-- //title -->

            <!-- text type1 -->
            <tr><td height="50">&nbsp;</td></tr>
            <tr>
              <td style="color:#222;font-size:18px;line-height:1.6">
                '${NAME}'님
            </td>
            </tr>
            <!-- //text type1 -->

            <!-- text type1 -->
            <tr><td height="50">&nbsp;</td></tr>
            <tr>
              <td style="color:#222;font-size:18px;line-height:1.6">
                번호 : '${NO}'<br />
                성명 : '${NAME}' <br />
                도착예정시간 : '${TIME}'<br />
                연락처: '${PHONE}'
              </td>
            </tr>
            <!-- //text type1 -->

            <!-- design line -->
            <tr><td height="56">&nbsp;</td></tr>
            <tr>
              <td>
                <table width="600" border="0" align="left" cellpadding="0" cellspacing="0">
                  <tbody>
                    <tr>
                      <td height="1" width="72" style="border-top:1px solid #d8d8d8">&nbsp;</td>
                      <td height="1">&nbsp;</td>
                    </tr>
                  </tbody>
                </table>
              </td>
            </tr>
            <!-- //design line -->

            <!-- text type2 -->
            <tr><td height="40">&nbsp;</td></tr>
            <tr>
              <td style="color:#222;font-size:14px;line-height:1.6">
            </td>
            </tr>
            <!-- //text type2 -->

            <!-- link -->
            <tr><td height="25">&nbsp;</td></tr>
            <tr>
              <td>
              </td>
            </tr>
            <!-- //link -->
            </tbody>
          </table>
        </td>
      </tr>
      <tr><td height="56">&nbsp;</td></tr>
    </tbody>
  </table>
  <!-- //content -->

  <!-- footer -->
  <table width="600" border="0" align="center" cellpadding="0" cellspacing="0" style="text-align:left;font-size:16px;font-family:Malgun Gothic, '맑은고딕', Dotum, '돋움', Tahoma, Helvetica Neue, Helvetica, sans-serif;background-color:#fff;margin:0 auto">
    <tbody>
    <tr>
      <td>
        <table width="600" border="0" align="center" cellpadding="0" cellspacing="0" style="text-align:left;font-size:16px;font-family:Malgun Gothic, '맑은고딕', Dotum, '돋움', Tahoma, Helvetica Neue, Helvetica, sans-serif;background-color:#fff;border-top:1px solid #aaa">
          <tbody>
            <tr><td height="30">&nbsp;</td></tr>
            <tr>
              <td style="font-size:14px;color:#777;line-height:1.5"><br />
            </tr>
            <tr><td height="27">&nbsp;</td></tr> 
            <tr>
              <td style="font-size:12px;color:#777;line-height:1.5">본 메일은 발신전용 메일로 회신이 되지 않습니다.<br />
            </tr>
          </tbody>
        </table>
      </td>
    </tr>
    <tr><td height="100">&nbsp;</td></tr>
    </tbody>
  </table>
  <!-- //footer -->
  
</body>
</html>

 

 

그럼 Velocity 설정 및 추가는 끝이 났습니다

이제는 데이터를 저장할 VO를 보며 어떤 데이터를 받을지 지정해봅시다

 

VO가 정의되어있습니다

템플릿을 미리 만들어놓고 적용한다면 true를 할당하여 메일링 값에 적용합니다

그리고 수신자, 발신자, 제목, 내용도 함께 할당되어 

서비스단의 메서드를 호출할 것입니다

 

 

 

public class MailVO {
    private boolean isTemplate = true;  // 템플릿적용 여부
    private String from = "";           // 발신자
    private String to = "";             // 수신자
    private String bcc = "";            // 숨은 참조자
    private String subject = "";        // 제목
    private String contents = "";       // 내용
    private String templateName = "";   // 메일템플릿명
    private String logoImageUrl = "";   // 로고이미지 경로
    private String successYn = "";
    private Map<String, Object> contentsMap; // Mapping Contents
    
    
    ....
}

 

 

아래와 같이 서비스단을 호출하게 됩니다 

로고, 제목, 내용을 정의하여 mailer.sendMail() 호출합니다

 

 

@Override
public void sendMailTemplate(MailVO mailVO) throws Exception {
    try {
        mailVO.setTemplateName(StringUtils.isBlank(mailVO.getTemplateName()) 
                                ? "commonTemplate.vm" 
                                : mailVO.getTemplateName());

        Map<String, Object> contentsMap = new HashMap<String, Object>();
        contentsMap.put("isTemplate", mailVO.isTemplate());
        contentsMap.put("subject", mailVO.getSubject());
        contentsMap.put("logoImageUrl", StringUtils.isBlank(mailVO.getLogoImageUrl()) 
                                        ? "/images/common/h1-logo.svg" 
                                        : mailVO.getLogoImageUrl());
        contentsMap.put("contents", mailVO.getContents());
        if(mailVO.getContentsMap() != null) {
            contentsMap.putAll(mailVO.getContentsMap());
        }
        
        mailVO.setContentsMap(contentsMap);
        mailer.sendMail(mailVO);
    } catch (Exception e) {
        logger.error("[ R E S ]/{} {}", "", StackTraceUtil.getStackTraceString(e));
    }
}

 

 

그리고 mailSender 객체로 MimeMessage의 객체를 만들어서 merge 작업하여

msg.setText()에 값을 정의하여

mailsender.send()로 메일을 발송합니다

 

그렇게 되면 메일 발송은 완료됩니다

 

 

@Autowired
private VelocityEngine velocityEngine;

@Autowired
private JavaMailSender mailSender;

@Autowired
private CommonLogService commonLogService;

public void setVelocityEngine(VelocityEngine velocityEngine) {
    this.velocityEngine = velocityEngine;
}

public void sendMail(MailVO mailVO) {
    MimeMessage msg = mailSender.createMimeMessage();
    mailVO.setSuccessYn("N");
    try {

        String veloTemplate = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, mailVO.getTemplateName(), "UTF-8", mailVO.getContentsMap());
        msg.setText(veloTemplate, "UTF-8", "html");
        if(!mailVO.getBcc().equals("")){
            msg.setRecipients(Message.RecipientType.BCC, mailVO.getBcc());
        }

        mailSender.send(msg);
        mailVO.setSuccessYn("Y");
    } catch (ParseErrorException | MethodInvocationException  e) {
        logger.error("[ R E S ]/{}{}", StackTraceUtil.getStackTraceString(e));
        return;
    } catch (ResourceNotFoundException e) {
        logger.error("[ R E S ]/{}{}", StackTraceUtil.getStackTraceString(e));
        return;
    } catch (MessagingException e) {
        logger.error("[ R E S ]/{}{}", StackTraceUtil.getStackTraceString(e));
        return;
    } catch (MailException e) {
        logger.error("[ R E S ]/{}{}", StackTraceUtil.getStackTraceString(e));
        return;
    } catch (Exception e) {
        logger.error("[ R E S ]/{}{}", StackTraceUtil.getStackTraceString(e));
        return;
    }

    try {
        commonLogService.insertMailLog(mailVO);
    } catch(Exception ex) {
        ex.printStackTrace();
    }

}

 

 

 

 

오늘은 자바를 활용해서 메일을 발송하는 방법을 알아보았습니다

node와 Java의 방식은 정말 다르기에

두 개 중 무엇이 좋다고 할 수 없지만

 

프로젝트 환경과 규모에 따라 다르게 대응하겠지요

그러니 많은 언어를 알고 있다는 것은 큰 장점일 수 있습니다

하지만 구글링만으로도 구현할 수 있다면

괜찮습니다 우선 빨리 구현하고 나서

난중에 다시 복습하면서 왜 이렇게 되는지 알아보는 게 핵심입니다

 

프로젝트 진행할 때는 결과를 빨리 보여주고

개별적으로 다시 코드 리뷰를 하면서 리팩터링과 모듈화 등을 하면서

자기 실력을 쌓아가는 것이 좋을 것 같습니다

 

그럼 다음 글도 기대해주시고

우리들의 IT 대모험은 끝나지 않았으니 힘내시길 바랍니다

 

 

 

 

728x90
반응형

+ Recent posts

Powered by Tistory, Designed by wallel