package com.b210.damda.util.emailAPI.service;
import java.util.Random;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.b210.damda.domain.entity.EmailSendLog;
import com.b210.damda.domain.entity.User;
import com.b210.damda.util.emailAPI.repository.EmailSendLogRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
public class EmailServiceImpl implements EmailService {
@Autowired
JavaMailSender emailSender;
EmailSendLog emailSendLog;
EmailSendLogRepository emailSendLogRepository;
public static final String ePw = createKey();
private MimeMessage createMessage(String to)throws Exception{
System.out.println("보내는 대상 : "+ to);
System.out.println("인증 번호 : "+ePw);
MimeMessage message = emailSender.createMimeMessage();
message.addRecipients(RecipientType.TO, to);//보내는 대상
message.setSubject("(담다) 비밀번호 재설정 이메일입니다.");//제목
String msgg="";
msgg+= "<div style='margin:20px;'>";
msgg+= "<h1> 안녕하세요 담다입니다. </h1>";
msgg+= "<br>";
msgg+= "<p>아래 코드를 복사해 입력해주세요<p>";
msgg+= "<br>";
msgg+= "<p>감사합니다.<p>";
msgg+= "<br>";
msgg+= "<div align='center' style='border:1px solid black; font-family:verdana';>";
msgg+= "<h3 style='color:blue;'>회원가입 인증 코드입니다.</h3>";
msgg+= "<div style='font-size:130%'>";
msgg+= "CODE : <strong>";
msgg+= ePw+"</strong><div><br/> ";
msgg+= "</div>";
message.setText(msgg, "utf-8", "html");//내용
message.setFrom(new InternetAddress("damdaCop@gmail.com","담다"));//보내는 사람
return message;
}
public static String createKey() {
StringBuffer key = new StringBuffer();
Random rnd = new Random();
for (int i = 0; i < 8; i++) { // 인증코드 8자리
int index = rnd.nextInt(3); // 0~2 까지 랜덤
switch (index) {
case 0:
key.append((char) ((int) (rnd.nextInt(26)) + 97));
// a~z (ex. 1+97=98 => (char)98 = 'b')
break;
case 1:
key.append((char) ((int) (rnd.nextInt(26)) + 65));
// A~Z
break;
case 2:
key.append((rnd.nextInt(10)));
// 0~9
break;
}
}
return key.toString();
}
@Override
public String sendSimpleMessage(String to)throws Exception {
// TODO Auto-generated method stub
MimeMessage message = createMessage(to);
try{//예외처리
emailSender.send(message);
}catch(MailException es){
es.printStackTrace();
throw new IllegalArgumentException();
}
return ePw;
}
@Override
public Long registTempKey(String key, String email, User user) {
EmailSendLog build = emailSendLog.builder()
.email(email)
.verificationCode(key)
.user(user)
.build();
EmailSendLog save = emailSendLogRepository.save(build);
System.out.println(save);
return save.getEmailSendLogNo();
}
}
위 코드는 스프링부트를 이용해서 인증메일을 전송하는 ServiceImpl이다.
registTempKey에서 인증번호, email, 해당 유저를 받아서 DB에 인증번호 전송 기록을 남기는 메서드를 정의해놨다.
문제는
EmailSendLog save = emailSendLogRepository.save(build);
여기서 문제가 발생했다.
분명 build를 찍으면 빌더를 사용해서 생성이 잘 됐는데 repo로 save를 하는 순간 NullPointerException이 뜨고 말았다...(자바의 천적)
하나하나 출력해보면서 널이 있는지 없는지 다 체크하는데 save 이전에는 전부 필요한 값이 잘 들어있었다.
chatGPT에게도 모든 소스를 주면서 분석을 시켰는데 찾아내지를 못했다
3시간 정도 걸렸나...의심되는 부분이 @Autowired였다.
기존에는 필드 주입과 설정자 주입은 권장하지 않는 방식으로 알고 있어서 거의 모든 소스를 생성자 주입으로 진행했었다.
그런데 위의 소스를 보면
@Autowired
JavaMailSender emailSender;
EmailSendLog emailSendLog;
EmailSendLogRepository emailSendLogRepository;
JavaMailSender emailSender;
EmailSendLog emailSendLog;
EmailSendLogRepository emailSendLogRepository;
이렇게 필드 주입으로 돼있다. 근데 뭔가 이상하지 않은가?..
@Autowired로 필드 주입을 해주려면 각각 붙여줘야 한다....(진짜 멍청하게 3시간 날렸다)
그래서 그냥 기존에 쓰던 생성자 주입으로 바꿨더니 저장이 잘 되는 걸 볼 수 있었다..
메일도 너무 잘 오고
바로 기록이 DB에도 쌓이는 걸 확인할 수 있었다.
@Autowired를 다시 상기시키는 시간이 될 것 같다.///
반응형
'오류해결' 카테고리의 다른 글
스프링부트 3.x에서 자바11 라이브러리 찾으려는 오류 (0) | 2023.12.15 |
---|---|
CHAT GPT API 사용량 초과 에러 (2) | 2023.08.30 |
인텔리제이 테스트 에러(Execution failed for task ':test'.) (0) | 2023.06.27 |
You may have an infinite update loop in a component render function.(무한루프) (0) | 2023.05.25 |