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();
}