[TIL] - 실전 프로젝트 - 3

장동희·2023년 4월 4일
0

TIL

목록 보기
16/16

비밀번호 찾기 기능 구현

비밀번호 찾기 기능

  1. 비밀번호를 그냥 찾으면 보안상 문제가 많이 될거같아서 등록된 이메일로 임시 비밀번호를 보내는 기능을 구현했다. 구현하기 위해서 우선 의존성을 추가해줘야했다.
implementation 'org.springframework.boot:spring-boot-starter-mail'
  1. 그리고 application.yml 파일에 내용을 추가했다.
spring:
     mail:
    	host: smtp.naver.com
    	port: 465
   	 	username: 본인의 네이버 계정 @naver.com
    	password: 본인의 네이버 계정 비밀번호
    	properties:
      	mail.smtp.auth: true
      	mail.smtp.starttls.enable: true
  1. 임시 비밀번호를 이메일로 보내기 위해서 우선 유저의 이메일로 인풋으로 받는 이메일값을 대조하여 같을 때 보내주기 위한 서비스
public MailDto checkFindPw(CheckFindPwRequestDto checkFindPw) {
        String email = checkFindPw.getEmail();
        User user = userRepository.findByEmail(email).orElseThrow(()->new CustomException(EMAIL_NOT_FOUND));
        if (user.getEmail() != null && user.getEmail().equals(email)){
            String str = getTempPassword();
            MailDto dto = new MailDto();
            dto.setAddress(email);
            dto.setTitle("MannaZan 임시비밀번호 안내 이메일 입니다.");
            dto.setMessage("안녕하세요. MannaZan 임시비밀번호 안내 관련 이메일 입니다." + " 회원님의 임시 비밀번호는 "
                    + str + " 입니다." + "로그인 후에 비밀번호를 변경을 해주세요");
            updatePassword(str, email);
            return dto;
        }
        return null;
    }
  1. 임시 비밀번호를 만들기
public String getTempPassword(){
        char[] charSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
                'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
        String str = "";

        // 문자 배열 길이의 값을 랜덤으로 10개를 뽑아 구문을 작성함
        int idx = 0;
        for (int i = 0; i < 10; i++) {
            idx = (int) (charSet.length * Math.random());
            str += charSet[idx];
        }
        return str;
    }
  1. 처음 회원가입 할 때 passwordEncoder로 암호화했기 때문에 업데이트할떄도 똑같은 방식으로 진행하였다.
public void updatePassword(String str, String email){
        String pw = passwordEncoder.encode(str);
        User user = userRepository.findByEmail(email).get();
        user.update(pw, email);
    }
  1. 메일을 전송하는 서비스
public void mailSend(MailDto mailDto) {
        System.out.println("전송 완료!");
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(mailDto.getAddress());
        message.setSubject(mailDto.getTitle());
        message.setText(mailDto.getMessage());
        message.setFrom(FROM_ADDRESS);
        message.setReplyTo(FROM_ADDRESS);
        mailSender.send(message);
    }

오류

제일 오류가 많이 발생했던 부분은 6. 메일을 전송하는 부분이였다. mailSender 부분에서 자꾸 Consider defining a bean of type 'org.springframework.mail.javamail.JavaMailSender' in your configuration. 오류가 발생했다. 이 오류는 Configuration을 찾지 못해 생긴 오류였다. 그래서 해결책으로 @Autowired 어노테이션을 달아주었더니 자동주입을 할 수 없다는 오류가 발생했다. 그래서 JavaMailSender 타입의 bean을 새로 등록하면 된다는 생각을 하였다. config를 관리하는 디렉터리에 mail이라는 디렉터리를 만들고 MailConfig.java를 만들어주었다. 그랬더니 해결이 되었다. 그래서 생각했다 이건 yml파일의 값을 읽지 못해서 발생하는것이라고 생각하였고 처음에는 yml파일의 이름을 mailApplication.yml로 설정하였는데 application.yml로 수정하고 MailConfig.java를 지웠더니 정상적으로 작동하였다.

0개의 댓글