문제: 편성표를 작성하는데 24시가 넘어가면 다음날이 필요했다.

해결: 편성표 작성하는날 기준(문자형 yyyymmdd) 를 파싱해서 1일 더해주고 리턴해줌.



예>  String 형 '20140815' 를 날짜형으로 변경뒤 1일 더 해주고 다시 String 형으로 변경.



for(int j=0;j<sList.size();j++){

String textDate  = sList.get(j).getProgramming_date();

java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat("yyyyMMdd"); // Date형 객체 생성

try {

java.util.Date date = dateFormat.parse(textDate); // 생성한 객체에 날짜 넣고

Calendar cal = Calendar.getInstance();  

cal.setTime(date);  

cal.add(Calendar.DATE, 1); // 1일 더해준다.

date = cal.getTime(); // 더한값

String resultDate = dateFormat.format(date); // 더한 결과 값을 String 형에 넣어주고.


sList.get(j).setProgramming_date(resultDate); // vo에 넣어줌.


        } catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

    // 가져온 스케쥴 인서트

    systemDAO.insertTommrowSchedule(sList.get(j));

// 현재 년도 가져오기.

   Calendar oCalendar = Calendar.getInstance( );  // 현재 날짜/시간 등의 각종 정보 얻기

   List<Object> years  = new ArrayList<>();

   int thisYear = oCalendar.get(Calendar.YEAR); // 올해

   int beforeYear = oCalendar.get(Calendar.YEAR) - 100; // 올해

   for (int i = thisYear; i > beforeYear; i--){

    years.add(i);

   }


mav.addObject("years",years);


* 객체형

years = getCalender(); //호출

public static List<Object> getCalender(){

Calendar oCalendar = Calendar.getInstance( );  // 현재 날짜/시간 등의 각종 정보 얻기

    List<Object> years  = new ArrayList<>();

    int thisYear = oCalendar.get(Calendar.YEAR); // 올해

    int beforeYear = oCalendar.get(Calendar.YEAR) - 100; // 올해

    for (int i = thisYear; i > beforeYear; i--){

years.add(i);

    }

   return years; //계산후 리턴

}


* 현재날짜에서 DataVo에 입력된 값(생년) 가져와서 현재 나이 구하기.

Calendar oCalendar = Calendar.getInstance( );  // 현재 날짜/시간 등의 각종 정보 얻기

int resultYear = ((oCalendar.get(Calendar.YEAR)) - Integer.valueOf(param.getAge()));



*Java 생일로 나이 구하기

public static int getAgeFromBirthday(Date birthday) {

    Calendar birth = new GregorianCalendar();

    Calendar today = new GregorianCalendar();


    birth.setTime(birthday);

    today.setTime(new Date());


    int factor = 0;

    if (today.get(Calendar.DAY_OF_YEAR) < birth.get(Calendar.DAY_OF_YEAR)) {

        factor = -1;

    }

    return today.get(Calendar.YEAR) - birth.get(Calendar.YEAR) + factor;

}

문제:  관리자 화면단에서 고객 내용에 답변하는 HTML형식의 메일 발송하는데 


   HTML을 알아서 인식하여 적용된 화면을 보여주는 메일 사업자도 있었으나


   사용자가 많은 네이버나 다음메일에서는 적용이 안되고 HTML형식의 태그가 달린 원본글이 그대로 노출되었다.



연구 : sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />"); 

   

   메일 내용에 메타테그 될줄 알았으나... 발송되는 문자열 자체를 


  그냥 통으로 인식해서 문자열 내부에 메타태그를 사용하더라도 인식이 안되는건 당연하다.



해결 :  MimeMessage mimeMessage = mailSender.createMimeMessage();

       MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "utf-8");


          helper.setText(body, true); // *HTML 적용!!


    기존발송시에는  Simple mail 인가 ? 보냈는데 그건 HTML설정하는 부분이 없어 MimeMessage 를 사용하니 잘되었다.





예>

- Controller 단 -


@SuppressWarnings("static-access")

@RequestMapping("/QNAXxxxxxxxx.do")

public ModelAndView qnaModify(HttpServletRequest request, HttpServletResponse response) throws Exception {

log.debug("QnaController qnaModify Start");

ServiceDataVo param = new ServiceDataVo();

bind(request, param);

//leftMenu 값

LeftMenuDataVo leftMenu = new LeftMenuDataVo();

bind(request, leftMenu);

//Session 체크 

if (!"".equals(userInfo(request)) && !isbReturnValue()) {

return new ModelAndView(userInfo(request));

}

LogDataVo logDataVo = util.setLogDataVo(request.getRequestURL().toString(), "U", userInfo.getUserId(), Const.QNA_UPDATE,                 userInfo.getUpperType());

param.setReply_id(userInfo.getUserId());

int updateResult = serviceManageService.getQnaModify(request, param, logDataVo);


param.setCarrigeRetrun("View");

ServiceDataVo result = serviceManageService.getQnaView(param);

// 메일내용

if(updateResult == 1) {

StringBuffer sb = new StringBuffer();

sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");

sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");

sb.append("<head>");

sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");

sb.append("<title>고객센터</title>");

sb.append("</head>");

sb.append("<body style=\"font-family: Arial, '맑은 고딕', 'Malgun Gothic', Dotum, '돋움',sans-serif, Helvetica; font-size:12px; color:#464646; line-height:0;\">");

sb.append("<div style=\"width:100%; padding:20px 0;\">");

sb.append("<div style=\"width:700px; margin:0 auto;\">");

sb.append("<img src=\"http://xxxxxxxxxx.co.kr/images/mail_title.jpg\" width=\"700px\" height=\"80px\" />");

sb.append("<div style=\"padding:30px;\">");

sb.append("<p>여러분의 소중한 의견과 함께 커가는 xxxxx 고객센터입니다.</p>");

sb.append("<p style=\"background-color:#f4f4f4; color:#754c24; border:1px solid #d7d7d7; padding:30px; text-align:center; font-size:18px; font-weight:bold; margin-bottom:50px;\">문의하신 내용에 답변 드립니다.</p>");

sb.append("<p style=\"line-height:1.6em;\">문의하신 질문에 대한 답변입니다.</p>");

sb.append("<div style=\"background:url(http://xxxxxxxxxx.co.kr/images/icon_a.jpg) left 25px no-repeat; border-top:1px solid #d7d7d7; border-bottom:1px solid #d7d7d7; padding:10px 10px 10px 50px; margin-bottom:50px;\">");

sb.append("<p style=\"line-height:1.6em; color:#754c24;\">");

sb.append(result.getReply_body());

sb.append("</p>");

sb.append("</div>");

sb.append("<p style=\"line-height:1.6em;\">고객께서 문의하신 내용입니다.</p>");

sb.append("<<div style=\"background:url(http://xxxxxxxxxxx..co.kr/images/icon_q.jpg) left center no-repeat; border-top:1px solid #d7d7d7; border-bottom:1px solid #d7d7d7; padding:10px 10px 10px 50px;\">");

sb.append("<p style=\"line-height:1.4em; font-weight:bold;\">" + result.getTitle() + "</p>");

sb.append("<p style=\"font-size:11px; color:#636363;\">" + result.getRegistration_date_time() + "</p>");

sb.append("</div>");

sb.append("<div style=\"padding:20px 50px; line-height:1.6em; border-bottom:1px solid #d7d7d7;\">");

sb.append(result.getBody());

sb.append("</div>");

sb.append("</div>");

sb.append("<div style=\"font-size:11px; color:#636363; background-color:#f4f4f4; line-height:1.3em; padding:20px 30px; margin-top:50px;\">");

sb.append("본 메일은 발신 전용이므로 메일로 문의 시 확인이 불가능합니다.<br />");

sb.append("다른 궁금하신 사항은  웹사이트(<a href=\"http://xxxxxxxkr\" target=\"_blank\">www.smartmedia.co.kr</a>)의 FAQ에서 확인 또는 Q&amp;A에서 문의해 주세요.<br />");

sb.append("Copyrjght 2014 dfsdfdf All rights reserved.");

sb.append("</div>");

sb.append("</div>");

sb.append("</div>");

sb.append("</body>");

sb.append("</html>");

mailService.send("문의하신 내용에 답변 드립니다.", sb.toString(), Const.WEBMASTER_EMAIL_ID, result.getEmail());

}

FileInformationVo fileDataVo = new FileInformationVo();

fileDataVo.setLinkType(Const.QNA_LINK);

fileDataVo.setLinkID(param.getBbs_id());

fileDataVo.setReplayYN("Y");

List<FileInformationVo> file = systemService.getFileInfoList(fileDataVo);

ModelAndView mav = new ModelAndView();

mav.addObject("qna",result);

mav.addObject("userInfo", userInfo);

mav.addObject("leftMenu", leftMenu);

mav.addObject("file", file);

mav.addObject("param", param);

mav.setViewName("serviceManage/ows/qnaView.do");

return mav;

}



----------------------------------------



package com.osp.common.util;


import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeUtility;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.mail.MailException;

import org.springframework.mail.SimpleMailMessage;

import org.springframework.mail.javamail.JavaMailSender;

import org.springframework.mail.javamail.MimeMessageHelper;

import org.springframework.stereotype.Service;


import com.osp.common.exception.DoException;



@Service("MailService")

public class MailServiceImpl implements MailService {


private static final Logger log = LoggerFactory.getLogger(MailServiceImpl.class);

private JavaMailSender  mailSender;

private SimpleMailMessage messageSource;

public void setMailSender(JavaMailSender mailSender) {

this.mailSender = mailSender;

}

public void setMessageSource(SimpleMailMessage messageSource) {

this.messageSource = messageSource;

}


@Override

public void send(SimpleMailMessage arg0) throws MailException {

}


@Override

public void send(SimpleMailMessage[] arg0) throws MailException {

}


public boolean send(String subject, String body, String fromUser, String toUser) throws DoException{

log.debug("Mail Send !!");

try{

    MimeMessage mimeMessage = mailSender.createMimeMessage();

MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "utf-8");

helper.setText(body, true); //***HTML 적용

helper.setTo(toUser);

helper.setSubject(subject);

helper.setFrom("support@smartmedia.co.kr");

mailSender.send(mimeMessage);

return true;

        } catch (MailException e) {

            e.printStackTrace();

            return false;

        } catch (Throwable e) {

            e.printStackTrace();

            return false;

        }


}


public boolean sendFileAttach(String subject, String body, String fromUser, String toUser, String FileName ) throws MailException{

MimeMessage message = mailSender.createMimeMessage();

try{

MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");

messageHelper.setSubject(subject);

messageHelper.setText(body, true);

messageHelper.setFrom(fromUser);

            //messageHelper.setTo(new InternetAddress(member.getEmail(), member.getName(), "UTF-8"));

messageHelper.setTo(new InternetAddress(toUser, "KBS", "UTF-8"));

            DataSource dataSource = new FileDataSource("c:\\통합 문서1.xlsx");

            messageHelper.addAttachment(MimeUtility.encodeText("통합 문서1.xlsx", "UTF-8", "B"), dataSource);

            mailSender.send(message);

            return true;

        } catch (MailException e) {

            e.printStackTrace();

            return false;

        } catch (Throwable e) {

            e.printStackTrace();

            return false;

        }

}

}



---------------------------


servlet-osp.xml        //  발송만 잘되게 설정을 맞게 해주면된다.



<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:jee="http://www.springframework.org/schema/jee" xmlns:context="http://www.springframework.org/schema/context"

.....

생략

<!-- SET default mail properties -->    // 메일 발신 입력

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">

<property name="host" value="dsmtp.naver.com" />

<property name="port" value="587" />

<property name="username" value="support@xxxxxxxxxx.co.kr" />

<property name="password" value="xxxxxxxx" />  

<property name="javaMailProperties">

<props> 

<prop key="mail.transport.protocol">smtp</prop>

<prop key="mail.smtp.auth">true</prop>

<prop key="mail.smtp.starttls.enable">true</prop>

   <prop key="mail.smtp.EnableSSL.enable">true</prop>

   <prop key="mail.mime.charset">UTF-8</prop>

<prop key="mail.debug">true</prop>

</props>

</property>

</bean>

 <!-- You can have some pre-configured messagess also which are ready to send -->

 

    <bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage">

        <property name="to" value=""></property>

        <property name="from" value="sport@xxxxxxxxxx.co.kr"></property>

        <property name="subject" value="FATAL - Application crash. Save your job !!"/>

    </bean>

    

    <bean id="MailService" class="com.sp.common.util.MailServiceImpl">

    <property name="mailSender"><ref bean="mailSender"/></property>

    <property name="messageSource"><ref bean="mailMessage"/></property>

    </bean>


</beans>

자바에서의 인스턴스란?



자바에서 인스턴스라는 말이 자주나오는데 그냥 코딩을 하는데 실질적으로 


들어가는 내용이라기보다 전반적으로 알고있어야 하는 부수적인 내용이라고 

생각하고 그냥 나올때마다 아 ~ 인스턴스를 생성하는구나 하고

넘어만 가다가 오늘 아침에 문득 아니근데 인스턴스가 뭔데? 라는 의문이 들어서

검색해 보았다. 

class A {

}

클래스가 있다면 이 클래스를 사용하는 클래스에서는 

A a = new A(); 이런식으로 클래스 선언을 할 것이다. 

바로 이것이 클래스를 인스턴스화 시킨 것이다.

a라는 객체를 사용하기전에 그것이 무엇인지 정의해 놓는 것이다. 이렇게 해야만

실질적으로 정의되어있는 내용을 메모리에 올려서 사용할 수 있기 때문이다.

정리 해보면 A라는 클래스를 사용하려면 A a = new A(); 라고 선언을 하지만

이는 단순히 A클래스를 a객체로 만들어 사용하기 위해서라는 이유 이 외에

메모리를 확보하고 쓸 수 있게 하는 인스턴스화 작업이 밑바탕 되어있는 것이다.


+ Recent posts