2017년 3월 14일 화요일

ajax에서 return 값을 json 형태 또는 text 형태로 반환 받았을 경우 한글이 깨지는 경우의 대처 방법

ajax 호출 뒤 결과 메시지의 한글이 ???로 표기되어 나타날 경우, 여러가지 방법을 사용해 봤다.
사용해 본 결과들에 대해서 몇 가지 정리해보면,

@RequestMapping(value = "/upload")
@ResponseBody
public String upload(MultipartHttpServletRequest req, HttpServletRequest request) throws IOException {
 :
 :
  strResult = URLEncoder.encode(strResult, "UTF-8");
 :
 :
  return strResult;
}

Spring의 Controll 단에서 return 되는 문자에 대해서 URLEncoder.encode를 사용해서 문제를 해결했다.
Client단의 ajax success 부분에 문자를 변환해서 처리함.
var Ca = /\+/g;
var fileInfo = decodeURIComponent(data.replace(Ca, " "));

근데 다른 사람의 브라우저에서는 undefined라는 메시지가 나오면서 ajax 결과가 정상적으로 반영되지 않는 문제를 발견했다.
모든 사람의 브라우저가 다 안되는 것이 아니라 몇 몇 브라우저에서 문제가 발생했다.
charset의 문제로 보여지며 utf-8 이 강제로 iso-8859-1 변환되고 있는 것이 아닌가 싶다.

Spring의 Controll 단에서 utf-8로 강제로 변환해서 처리하고 나니 기존의 오류가 나던 브라우저들도 문제 없이 동작함.

@RequestMapping(value = "/upload", produces = "application/text; charset=utf8")
@ResponseBody
public String upload(MultipartHttpServletRequest req, HttpServletRequest request) throws IOException {
 :
 :
}

2017년 3월 10일 금요일

Spring Framework에서 JavaMailSender로 메일 보내기.

Spring의 JavaMailSender를 추가하기 위해서는 spring-context-support jar 파일을 반드시 lib폴더에 추가해야 한다.
또한 javax.mail 관련 jar 파일도 포함 해야 한다.
maven repository에서 가져올 경우

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${version.spring}</version>
</dependency>

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>

상기의 2개를 추가해서 lib폴더에 추가.

아래는 JavaMailSender를 위한 Java Config 설정이다.

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
:
:

@Bean
public static JavaMailSender mailSender() {
JavaMailSenderImpl mailSenderImpl = new JavaMailSenderImpl();
mailSenderImpl.setHost("smtp.naver.com");
mailSenderImpl.setPort(587);
mailSenderImpl.setUsername("사용자 메일 계정");
mailSenderImpl.setPassword("비밀번호");
mailSenderImpl.setDefaultEncoding("UTF-8");

Properties javaMailProps = new Properties();
javaMailProps.put("mail.smtp.auth", true);
javaMailProps.put("mail.smtp.starttls.enable", true);

mailSenderImpl.setJavaMailProperties(javaMailProps);

return mailSenderImpl;
}

Service로 호출을 하기 위해서 먼저 Interface를 정의한다.

package org.uniworks.groupware.service;

/**
 * @author gomoosin
 *
 */
public interface EmailSender {
public <T> boolean emailSender(T report);
}

EmailSender를 구현한 클래스는 아래와 같다.

package org.uniworks.groupware.service.internal;

import javax.mail.internet.MimeMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Service;
import org.uniworks.groupware.service.EmailSender;

/**
 * @author gomoosin
 *
 */
@Service
public class EmailSenderImpl implements EmailSender {
private static final Logger logger = LoggerFactory.getLogger(EmailSenderImpl.class);
@Autowired JavaMailSender javaMailSender;

/* (non-Javadoc)
* @see org.uniworks.groupware.service.EmailSender#emailSender(java.lang.Object)
*/
@Override
public <T> boolean emailSender(T report) {
// TODO Auto-generated method stub
logger.debug("Sending report by email....");
boolean retVal = false;

try {
            final String emailTo = "test01@gmail.com";
            final String emailFrom = "test01@naver.com";
            final String subject = "test subject";
            final String message = (String) report;

            javaMailSender.send(new MimeMessagePreparator() {

                @Override
                public void prepare(MimeMessage paramMimeMessage) throws Exception {
                    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(paramMimeMessage, true, "UTF-8");

                    mimeMessageHelper.setTo(emailTo);
                    mimeMessageHelper.setFrom(emailFrom);
                    mimeMessageHelper.setSubject(subject);
                    mimeMessageHelper.setText(message);

                    /*
                    final File file = new File("test filename");

                    mimeMessageHelper.addAttachment(MimeUtility.encodeText("filename"), new InputStreamSource() {

                        @Override
                        public InputStream getInputStream() throws IOException {
                            // TODO Auto-generated method stub
                            return new FileInputStream(file);
                        }
                    });
*/                  
                };
            });

            retVal = true;
        } catch (Exception e) {
            logger.error("Can't send email... " + e.getMessage(), e);
        }

return retVal;
}

}

위에 만든 Service를 호출해서 테스트한 테스트 케이스는 아래와 같다.

package org.uniworks.groupware.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
import org.uniworks.groupware.common.config.AppConfig;
import org.uniworks.groupware.common.config.BoneCPConfig;

/**
 * @author gomoosin
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
public class EmailSenderTest {
@Autowired private EmailSender emailSender;

@Test
public void emailSenderTest() {
emailSender.emailSender("text message......");
}
}