Email 인증 라이브러리 설정 방법
maven repository에서 다운
JavaMail API (compat)의 1.4.7 버전 사용
spring-context-support의 스프링 버전과 똑같이 사용
Spring의 다양한 설정이 들어있는 spring 폴더 안에 spring-configuration file 생성
파일을 나눴음으로 web.xml에 param-value에 경로를 넣어야함
properties 파일을 생성해서 인증 메일을 보낼 메일의 정보를 입력
설정 Code
bean 등록 및 property 설정
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:property-placeholder
location="classpath:/db-config/email.properties" />
<!-- 이메일에 대한 정보가 있는 properties에 접근 -->
<!-- 이메일 인증 관련 bean 등록 -->
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- set메서드로 의존성 주입 -->
<property name="host" value="smtp.naver.com" />
<!-- smtp.naver.com -->
<!-- 사용자에게 인증 메일을 보내는 메일 주소의 플랫폼 -->
<property name="port" value="587" />
<!-- 메일 주소 플랫폼의 포트 번호 -->
<property name="username" value="${email.account}" />
<!-- 보낼 사용자 계정의 아이디 -->
<property name="password" value="${email.password}" />
<!-- 보낼 사용자 계정의 비밀번호 -->
<!-- properties 파일을 사용해서 value에 넣어줌 위치는 db-config에 있음 -->
<property name="javaMailProperties">
<!-- 네이버 -->
<props>
<prop key="mail.smtp.starttls.enable">true</prop>
<prop key="mail.smtp.auth">true </prop>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.debug">true</prop>
<prop key="mail.smtps.ssl.trust">*</prop>
<prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>
</props>
</property>
</bean>
</beans>
xml에서 작성한 설정을 가지고 와서 실제 메일을 보낼 수 있는 메서드 작성
controller와 생성한 Class 연동 진행
package com.spring.myweb.util;
import java.util.Random;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
@Service
public class MailSendService {
@Autowired
private JavaMailSender mailSender;
// JavaMailSender라는 타입의 값을 Container에서 자동으로 찾아서 의존성 주입
private int authNum;
// 인증 번호
// 난수 발생
public void makeRandomNumber() {
// 난수의 범위 : 111111 ~ 999999
Random r = new Random();
int checkNum = r.nextInt(888888) + 111111;
System.out.println("난수 : " + checkNum);
authNum = checkNum;
}
// 회원 가입 시 사용할 이메일 양식
public String joinEmail(String email) {
makeRandomNumber();
// 난수 생성
String setFrom = "mkr0410@naver.com";
// email-config에서 입력한 이메일 주소
// 보내는 이메일 주소
String toMail = email;
// 수신받을 이메일
String title = "회원가입 인증 이메일 입니다.";
String content = "홈페이지를 방문해주셔서 감사합니다."+
"<br><br>" +
"인증번호는 " + authNum + "입니다." +
"<br>" +
"해당 인증 번호를 인증번호 확인란에 기입하여 주세요.";
// 이메일 내용
mailSend(setFrom, toMail, title, content);
return Integer.toString(authNum);
// 정수를 문자열로 변경해서 리턴
}
// 이메일 전송 메서드
public void mailSend(String setFrom, String toMail, String title, String content) {
try {
MimeMessage message = mailSender.createMimeMessage();
// 기타 설정들을 담당할 MimeMesageHelper 객체를 생성
// 생성자의 매개값으로 MimeMessage 객체, bool, 문자 인코딩 설정
// bool 타입에서 true 매개값을 전달하면 MultiPart(이미지, 오디오도 같이) 형식의 메세지 전달 가능
// 값을 전달하지 않으면 단순 텍스트만 사용
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setFrom(setFrom);
helper.setTo(toMail);
helper.setSubject(title);
helper.setText(content, true);
// true를 해야 html 형식으로 전송
mailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
메일 전송 요청이 왔을 때 위에서 작성한 Class의 객체를 불러와서 사용자에게 메일을 보내는 로직 진행
매개값으로 보낼 email 주소를 받음
@Autowired
private MailSendService mailService;
// 이메일 인증
@GetMapping("/mailCheck")
@ResponseBody
// 비동기로 진행
public String mailCheck(String email) {
// email : userJoin에서 비동기로 보낸 파라미터 값
System.out.println("이메일 인증 요청 들어옴");
System.out.println("인증 이메일 : " + email);
// 받은 이메일을 MailSendService에서 전송 등의 로직을 진행
return mailService.joinEmail(email);
}
행정 안전부 API 신청
https://www.juso.go.kr/addrlink/openApi/apiReqst.do 에서 신청
function goPopup() {
// 사용자가 주소 찾기 버튼을 누르면 절대경로로 팝업창을 오픈
var pop = window.open("${pageContext.request.contextPath}/resources/popup/jusoPopup.jsp", "pop",
"width=570,height=420, scrollbars=yes, resizable=yes");
//
}
function jusoCallBack(roadFullAddr, roadAddrPart1, addrDetail,
roadAddrPart2, engAddr, jibunAddr, zipNo, admCd, rnMgtSn,
bdMgtSn, detBdNmList, bdNm, bdKdcd, siNm, sggNm, emdNm, liNm,
rn, udrtYn, buldMnnm, buldSlno, mtYn, lnbrMnnm, lnbrSlno, emdNo) {
// 콜백 방식으로 받아온 데이터를 가입 폼에 자동 완성
document.getElementById('addrBasic').value = roadAddrPart1;
document.getElementById('addrDetail').value = addrDetail;
document.getElementById('addrZipNum').value = zipNo;
}
카카오 API
https://postcode.map.daum.net/guide 에서 사용 가능
인증 키 없이 쉽게 사용 가능
API를 통해 받아온 데이터를 내가 설정한 페이지에 넣어주면 끄읏
// 다음 주소 api 사용
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
function searchAddress() {
new daum.Postcode({
oncomplete: function(data) {
// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다.
// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
var addr = '';
// 주소 변수
var extraAddr = '';
// 참고항목 변수
//사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
addr = data.roadAddress;
} else { // 사용자가 지번 주소를 선택했을 경우(J)
addr = data.jibunAddress;
}
/* // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
if(data.userSelectedType === 'R'){
// 법정동명이 있을 경우 추가한다. (법정리는 제외)
// 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
extraAddr += data.bname;
}
// 건물명이 있고, 공동주택일 경우 추가한다.
if(data.buildingName !== '' && data.apartment === 'Y'){
extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
}
// 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
if(extraAddr !== ''){
extraAddr = ' (' + extraAddr + ')';
}
// 조합된 참고항목을 해당 필드에 넣는다.
document.getElementById("sample6_extraAddress").value = extraAddr;
} else {
document.getElementById("sample6_extraAddress").value = '';
}
안씀 그래서 주석 처리
*/
// 우편번호와 주소 정보를 해당 필드에 넣는다.
document.getElementById('addrZipNum').value = data.zonecode;
document.getElementById('addrBasic').value = addr;
// 커서를 상세주소 필드로 이동한다.
// 내가 지정한 곳에 값을 넣어줌
document.getElementById('addrDetail').focus();
}
}).open();
}