본문 바로가기
Project

JavaMailSender , 구글 SMTP 사용한 비밀번호 찾기 기능 구현 - 임시 비밀번호 이메일로 전송

by 샴페인맛있다 2024. 12. 10.

🔹 이메일과 핸드폰 번호로 회원 정보를 찾아, 임시 비밀번호를 이메일로 전송 하는 로직을 구현

    🔸 JavaMailSender , 구글 SMTP 사용.

 

1. 회원 정보 검증:

   ▪ 사용자가 입력한 이메일(아이디)과 핸드폰 번호가 데이터베이스에 등록된 정보와 일치할 경우,

     해당 이메일로 임시 비밀번호를 전송.

      일치하지 않을 경우,  "check your details." 라는 경고 메시지를 띄움.

 

2. 임시 비밀번호 생성 및 이메일 전송:

   ▪  임시 비밀번호는 랜덤으로 생성되며, 구글 SMTP와 JavaMailSender를 사용해 등록된 이메일 주소로 전송.

   ▪  전송된 임시 비밀번호는 데이터베이스에 저장되어, 이후 로그인 시 사용됨.

 

3. UI 및 사용자 피드백:

   ▪  회원 정보가 정확하게 입력되었을 경우,

    "임시 비밀번호가 이메일로 전송되었습니다"는 모달 창을 띄워 사용자에게 알림.

   ▪  회원 정보가 일치하지 않으면 경고창을 띄우고, 입력한 데이터를 초기화함.

 


🔹 데이터 흐름 요약

1. 프론트엔드:

    ▪  사용자가 이메일 및 전화번호를 입력 → findPasswordHandler 호출 → API 요청 전송.

 

2. 백엔드:

    ▪   컨트롤러: 요청 수신 → UserDTO를 서비스 계층으로 전달.

    ▪   서비스:

        - email과 phoneNumber로 DB에서 Member 조회.

        - 임시 비밀번호 생성 → 암호화 → 회원 정보 업데이트.

        - 이메일 발송.

        - 회원 email 반환.

    ▪   리포지토리: DB에서 Member 엔티티 조회 및 업데이트. 

 

3. 응답:

프론트엔드로 회원 email 반환.

성공 시 사용자 정보 업데이트, 실패 시 오류 메시지 표시.

 


🔹 Spring Boot에서 JavaMailSender 사용을 위한 초기 설정

1️⃣ build.gradle에 의존성 추가


2️⃣ application.property에 SMTP 서버 설정 추가.

개인 정보는 모자이크 처리

  • spring.mail.host & spring.mail.port: Gmail SMTP 서버 정보.
  • spring.mail.username: 이메일 발송에 사용할 Gmail 계정.
  • spring.mail.password: Gmail 앱 비밀번호 (계정 비밀번호가 아닌 앱 비밀번호 사용 ,  구글 2단계 인증 후 앱 비밀번호 발급 가능. ).
  • spring.mail.properties.mail.smtp.starttls.enable: TLS를 사용하여 보안 연결 활성화.
  • admin.email, admin.name: 관리자 이메일과 이름. 발신자 정보로 활용됨. ( 구글 정책상 admin.email은 지정 불가했으나 남겨둠. )

🔹 Frontend (React)

 

FindPasswordComponent 일부

  • input 창에 입력 한 정보가 handleChange 함수를 통해서 UserInfo에 저장.
  • 사용자가 Next 버튼을 클릭하면 findPasswordHandler 함수가 실행 됨.

FindPasswordComponent 일부
FindPasswordComponent 일부

 

📌 findPasswordHandler 

  • 사용자가 입력한 이메일과 전화번호 정보를 userInfo 객체로 정리.
  • findPassword API 호출을 통해 서버로 해당 정보를 전송.

myPageApi

 

📌 findPassword 

  • axios.post를 사용하여 POST 방식으로 백엔드 /findpassword 엔드포인트에 요청을 보냄.
  • 요청 본문에 userInfo 객체(이메일과 전화번호 포함)를 전달.
  • 서버 응답:
    • 성공: 서버로부터 반환된 데이터를 반환하여 처리.
    • 실패: 오류 메시지를 반환하여 알림.

🔹 Backend - Spring Boot (Java)

MyPageController

 

1️⃣ Controller (@PostMapping("/findpassword"))

  • 프론트엔드에서 전달된 UserDTO를 받아 서비스 계층으로 전달.
  • 서비스 계층에서 처리 후 반환된 Email을 HTTP 응답으로 반환.

2️⃣ Service (findPasswordAndSendEmail 메서드) 와 Repository (MemberRepository)

 

MemberServiceImpl

 

📌 findPasswordAndSendEmail 메서드 실행 흐름

 

① 이메일과 전화번호가 저장된 UserDTO를 매개변수로 받음.

이메일과 전화번호로 회원 정보 조회 (memberRepository.findByEmailAndPhoneNumber)

MemberEntity


MemberRepository

  • Repository (MemberRepository):
    • DB의 member table에서 email과 phoneNumber로 회원 조회.
    • JpaRepository 상속시, Member엔티티의 변수 이름으로 쿼리 메서드 생성가능.  → findByEmailAndPhoneNumber 메서드를 통해 조회된 Member 엔티티 반환.

③ 임시 비밀번호 생성 및 암호화 후 회원 정보 업데이트.

MemberServiceImpl에 선언된 makeTempPassword

 

   ▪  StringBuffer 를 사용하여 임시 비밀번호를 문자(char)로 하나씩 추가하여 랜덤한 문자의 10자리 임시 비밀번호 생성.

   ▪  임시 비밀번호 생성 과정에서 StringBuffer를 사용하여 메모리 낭비를 줄임.

MemberEntity 에 선언된 changePw로 엔티티의 password 변경
findPasswordAndSendEmail 메서드에서 임시 비밀번호 생성 및 암호화 후 회원 정보 업데이트 처리 코드


④ 이메일 발송 (sendTemporaryPasswordEmail).

MemberServiceImpl에 선언된 sendTemporaryPasswordEmail

 

   ▪ MimeMessage : MIME 형식의 이메일을 작성하기 위한 JavaMail API 클래스.

   ▪ MimeMessageHelper : MimeMessage를 쉽게 설정할 수 있는 유틸리티 클래스.

     - HTML 본문, 첨부파일,  다중 수신자 등을 간단히 처리.


⑤ 업데이트된 Member를 기반으로 email 정보를 반환.