생성자 주입을 하면서 생겼던 문제(Null)

2023. 7. 23. 14:26· 오류해결
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;

이렇게 필드 주입으로 돼있다. 근데 뭔가 이상하지 않은가?..

 

@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
'오류해결' 카테고리의 다른 글
  • 스프링부트 3.x에서 자바11 라이브러리 찾으려는 오류
  • CHAT GPT API 사용량 초과 에러
  • 인텔리제이 테스트 에러(Execution failed for task ':test'.)
  • You may have an infinite update loop in a component render function.(무한루프)
indeep
indeep
백준 - https://www.acmicpc.net/user/esu08259 깃허브 - https://github.com/qkrrlgus114
indeep
불편한 게 싫어
indeep
글쓰기방명록관리자
전체
오늘
어제
  • 분류 전체보기 (183)
    • 알고리즘문제 (11)
      • 백준 (10)
      • swea (1)
    • CS지식 (27)
      • HTTP 웹 지식 (4)
    • 일상 (2)
    • 스프링 강의(인프런) (4)
    • JAVA 강의(인프런) (11)
    • JAVA (8)
    • 오류해결 (31)
    • Vue (5)
    • 싸피 (4)
    • 스프링 개념 (2)
    • git 관련 (1)
    • 면접 (4)
    • 기타 (16)
    • 프로젝트 (45)
      • RESTAPI 추천 서비스 (34)
      • 씈크럼 프로젝트 (11)
    • 독서 (3)
    • 행사 || 컨퍼런스 (4)
    • 회고 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

hELLO · Designed By 정상우.v4.2.2
indeep
생성자 주입을 하면서 생겼던 문제(Null)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.