Email & 주소 API

Let's Just Go·2022년 8월 1일
0

Spring

목록 보기
17/26

Spring

Email API

Setting

  • Email 인증 라이브러리 설정 방법

    • maven repository에서 다운

    • JavaMail API (compat)의 1.4.7 버전 사용

    • spring-context-support의 스프링 버전과 똑같이 사용

      • 간단한 설정을 통해 메일 라이브러리를 사용할 수 있도록 도와줌
    • Spring의 다양한 설정이 들어있는 spring 폴더 안에 spring-configuration file 생성

      • 생성한 파일의 namespace에서 context클릭
      • 해당 파일에서 email 인증 설정 진행
    • 파일을 나눴음으로 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>

Class 생성

  • 실제 이메일을 보낼 수 있도록 Class 생성
    • 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();
      		}
      		
      	}
      }

Controller

  • Controller
    • 메일 전송 요청이 왔을 때 위에서 작성한 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

  • 행정 안전부 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();
      }
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글