반응형
01. 라이브러리 빌드처리
- pom.xml 변경
- 메일 보내는 프로그램 ex) 결제 인증을 메일로 받아서 하기
02. [핵심관심모듈]
EmailSendBean.java
package xyz.itwill07.aop;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.JavaMailSender;
import lombok.Setter;
//Java Mail 기능을 구현하기 위해서는 spring-context-support 라이브러리와 javax.mail 라이브러리가 프로젝트에 빌드되도록 처리 - 메이븐 사용 : pom.xml
//=> 지금 우리는 메일 보내는 기능만 구현할 것임 - setter만 필요함, 보낼 때 다음, 네이버(메일전달기능 유료) 말고 구글(무료-gmail) 이용할 것
//메일 전송 기능을 제공하는 클래스 - 메일 서버의 SMTP 서비스를 사용하여 메일 전송
// => 메일 서버(Mail Server) : 메일을 송수신하는 서비스를 제공하는 컴퓨터
// => SMTP(Simple Message Transfer Protocol - 보냄) 서비스로 메일을 보내고 POP3(Post Office Protocol 3 - 받아서 사용자에게 전달 후 재요청시 재전달못함)
//서비스나 IMAP(Internet Message Access Protocol - 받아서 사용자에게 전달 후 재요청시 재전달가능) 서비스로 메일을 받아 사용자에게 전달
// => 여기서 메일 받는 기능을 만들지 못하는 이유 - POP3 나 IMAP 이용하려면 사용자 정보가 필요함
// => 즉, DNS 서버 지정, 사용자 지정.. 등 환경 세팅할 부분이 많고 돈 내야함 - 그냥 다음에서 들어가서 보면되지 굳이 outlook 기능까지 할 필요는..!
@Setter
public class EmailSendBean {
//메일을 전송하는 서비스(SMTP)를 제공하는 서버의 정보가 저장된 JavaMailSender 객체를 저장하기 위한 필드 선언
private JavaMailSender javaMailSender;
public void sendMail(EmailMessage emailMessage) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
InternetAddress[] toAddress = new InternetAddress[1];
toAddress[0] = new InternetAddress(emailMessage.getRecipient());
mimeMessageHelper.setTo(toAddress);
mimeMessageHelper.setSubject(emailMessage.getSubject());
mimeMessageHelper.setText(emailMessage.getMessage());
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
log.error("Email send error to.'{}'", emailMessage.getRecipient(), e);
e.printStackTrace();
throw new RuntimeException(e);
}
}
//메일을 전송하는 메소드 : 메일을 받는 사람의 이메일 주소, 제목, 내용을 매개변수로 전달받아 저장하고 메일을 받는 사람의 이메일 주소를 반환
public String sendEmail(String email, String subject, String content) throws Exception {
//JavaMailSender.createMimeMessage() : MimeMessage 객체를 생성하여 반환하는 메소드
//MimeMessage 객체 : 메일 전송 관련 정보를 저장하기 위한 객체
// => MimeMessage 객체를 이용하면 첨부파일 보내기, 다수에게 보내기, 참조해서 보내기 .. 등등 다양한 프로그램 만들 수 있음
MimeMessage message = javaMailSender.createMimeMessage();
//message.setFrom("라재희"); //보내는이 이름 설정
//message.setFrom(new InternetAddress("jhla456@naver,com", "라재희")); //보내는이의 주소와 이름 설정
//MimeMessage.setSubject(String subject) : 전송할 메일의 제목을 변경하는 메소드
message.setSubject(subject);
//MimeMessage.setText(content) : 전송할 메일의 내용(텍스트 메세지)을 변경하는 메소드
//message.setText(content);
//MimeMessage.setText(Object o, String type) : 전송할 메일의 내용을 변경하는 메소드
// => type 매개변수에 문서의 형식(MimeType)을 전달하여 저장
message.setContent(content, "text/html; charset=utf-8");
//MimeMessage.setContent(Multipart multipart) 이용해 파일첨부도 가능
//MimeMessage.setRecipient(RecipientType type, Address address) : 받는 사람의
//이메일 주소 관련 정보를 변경하는 메소드
// => RecipientType : 메일 수신 사용자를 구분하기 위한 상수값 전달
// => Address : 이메일 주소가 저장된 Address 객체를 전달
//InternetAddress : 이메일 주소를 저장하기 위한 클래스 - Address 추상 클래스를 상속받은 자식클래스
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(email));
//MimeMessage.setRecipients(RecipientType type, Address[] addresses) : 받는 사람의
//이메일 주소 관련 정보를 변경하는 메소드 - 다수의 메일을 전송하는 메소드
//InternetAddress.parse(String emailList) : 문자열로 전달된 이메일 주소 목록을 Address 객체 배열로 반환
//message.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(email));
//JavaMailSender.send(MimeMessagee message) : 메일을 보내는 서비스를 이용하여
//메일을 전송하는 메소드
javaMailSender.send(message);
System.out.println("[메세지] 메일을 성공적으로 전송 하였습니다.");
return email; //Advice가 사용하기 위해 반환해줌
}
}
03. [횡단관심모듈] : Advice클래스
EmailSendAdvice.java
package xyz.itwill07.aop;
import org.aspectj.lang.JoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//횡단관심모듈 - Advice 클래스
public class EmailSendAdvice {
//기록하기 위한 Logger 객체
private static final Logger logger=LoggerFactory.getLogger(EmailSendAdvice.class);
//메일을 전송하기 전에 삽입되서 실행될 명령 작성 - Before Advice 메소드
//=> [받는 사람의 이메일 주소]와 [제목]을 얻어와 저장하기 위해 JoinPoint 매개변수 필요
public void accessLog(JoinPoint joinpoint) {
//타겟메소드(sendEmail)의 매개변수에 저장된 값(객체)를 반환받아 저장
String email=(String)joinpoint.getArgs()[0]; //받는 사람의 이메일 주소
String subject=(String)joinpoint.getArgs()[1]; //메일제목
logger.info(email+"님에게 <"+subject+"> 제목의 이메일을 전송합니다.");
}
//메일 전송이 성공한 경우 삽입되서 실행될 명령 작성 - After Returning 메소드
//=> 타겟메소드(sendEmail)의 반환값(받는 사람의 이메일 주소)을 얻어와 저장하기 위해 매개변수 필요
public void successLog(String email) {
logger.info(email+"님에게 메일을 성공적으로 전송하였습니다. ");
}
//예외가 발생되어 메일 전송이 실패한 경우 삽입되서 실행될 명령 작성 - After Throwing 메소드
//=> 타겟메소드(sendEmail)의 명령 실행 시 발생된 예외(Exception)를 얻어와 저장하기 위한 매개변수 필요
public void errorLog(Exception exception) {
logger.error("이메일 전송 실패 = "+exception.getMessage());
}
}
04. 💖Spring Bean Configuration File
[07-4_email.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>"
xsi:schemaLocation="<http://www.springframework.org/schema/beans> <http://www.springframework.org/schema/beans/spring-beans.xsd>
<http://www.springframework.org/schema/aop> <http://www.springframework.org/schema/aop/spring-aop.xsd>">
<!-- 1. JavaMailSenderImpl 등록 -->
<!-- => 구글의 SMTP 서비스를 제공받기 위해서 계정의 2단계 보안 인증 후 앱 비밀번호를 발급받음 -->
<!-- => 구글 계정 관리에서 보안 메뉴에 앱 비밀번호를 생성하여 사용 -->
<!-- JavaMailSender 인터페이스를 상속받은 JavaMailSenderImpl 클래스를 Spring Bean으로 등록 -->
<!-- => SMTP 서비스를 제공하는 메일 서버의 정보를 JavaMailSenderImpl 객체 필드에 저장되도록 값 주입 -->
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl" id="javaMailSender">
<!-- host 필드 : SMTP 서비스를 제공하는 메일 서버의 이름을 전달하여 저장 [Gmail 서버가 제공하는 컴퓨터 이름 : smtp.gmail.com]-->
<property name="host" value="smtp.gmail.com"/>
<!-- port 필드 : SMTP 서비스를 제공하는 메일 서버의 PORT 번호를 전달하여 저장 -->
<!-- [25]가 기본이지만 -> ssl(인증서 사용)을 이용하므로 [467] 이용했지만 -> 지금은 tsl(메일암호화)을 이용하므로 [587]이용 : 보안강화 -->
<property name="port" value="587"/>
<!-- username 필드 : SMTP 서비스를 제공하는 메일 서버의 접속 사용자 이름(아이디)을 전달하여 저장 -->
<property name="username" value="jaeheela"/>
<!-- password 필드 : SMTP 서비스를 제공하는 메일 서버의 접속 사용자 비밀번호를 전달하여 저장 -->
<!-- => 사용자 비밀번호 대신 앱 비밀번호를 필드에 저장 -->
<property name="password" value="#########"/>
<!-- javaMailProperties 필드 : SMTP 서비스를 제공하는 메일 서버의 메일 전송 관련 부가적인 정보를 Properties 객체로 전달하여 저장 -->
<property name="javaMailProperties">
<props>
<!-- <prop key="mail.smtp.ssl.enable">false</prop> --> <!-- ssl에 문제발생 시 추가하기 : 사이트가 신뢰할 수 있도록 만드는 것임, 그 후 이 코드 삭제하기 -->
<prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop><!-- [ssl - 안전한 메일이라는 인증서 같은 개념] : gmail 서버로 보낼거야 -->
<prop key="mail.smtp.starttls.enable">true</prop><!-- [starttls - 암호화처리해서 보낼게] : 신뢰할 수 있는 거야 -->
<prop key="mail.smtp.auth">true</prop><!-- [auth] : 사용자 인증 필요해 -->
</props>
</property>
</bean>
<!-- 2. EmailSendBean 등록 -->
<!-- 핵심관심모듈로 작성된 클래스를 Spring Bean으로 등록 -->
<!-- => javaMailSender 필드에 JavaMailSender 객체가 저장되도록 의존성 주입 -->
<bean class="xyz.itwill07.aop.EmailSendBean" id="emailSendBean">
<property name="javaMailSender" ref="javaMailSender"/>
</bean>
<!-- 3. EmailSendAdvice 등록 -->
<!-- 횡단관심모듈로 작성된 클래스를 Spring Bean으로 등록 -->
<bean class="xyz.itwill07.aop.EmailSendAdvice" id="emailSendAdvice"/>
<!-- 4. Advice 설정 -->
<aop:config>
<aop:aspect ref="emailSendAdvice">
<aop:before method="accessLog" pointcut="execution(* sendEmail(..))"/>
<aop:after-returning method="successLog" pointcut="execution(* sendEmail(..))" returning="email"/>
<aop:after-throwing method="errorLog" pointcut="execution(* sendEmail(..))" throwing="exception"/>
</aop:aspect>
</aop:config>
</beans>
05. 실행프로그램
EmailSendApp.java
package xyz.itwill07.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class EmailSendApp {
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("07-4_email.xml");
EmailSendBean bean = context.getBean("emailSendBean",EmailSendBean.class);
System.out.println("======================================================");
//bean.sendEmail("jhla456@naver.com", "메일 전송 테스트", "JavaMail 기능을 사용하여 전달된 이메일입니다.");
bean.sendEmail("jhla456@naver.com", "메일 전송 테스트", "<h1>JavaMail 기능을 사용하여 전달된 이메일입니다.</h1>");
System.out.println("======================================================")z
((ClassPathXmlApplicationContext)context).close();
}
}
반응형
'framework > spring AOP(관점지향)' 카테고리의 다른 글
[springAOP] 8. 어노테이션기반의 AOP 만들어 사용하기 | Advisor 클래스 (0) | 2024.07.31 |
---|---|
[springAOP] 6. 스키마기반의 AOP 만들어 사용하기 | ExecutionTimeApp프로그램 (0) | 2024.07.31 |
[springAOP] 5. 스키마기반의 AOP 만들어 사용하기 | Advice클래스의 매개변수 (0) | 2024.07.31 |
[springAOP] 4. 스키마기반의 AOP 만들어 사용하기 | Advice클래스 (0) | 2024.07.30 |
[springAOP] 3. AOP 만들기 전 설정할 것 (0) | 2024.07.30 |