🔹 이메일과 핸드폰 번호로 회원 정보를 찾아, 임시 비밀번호를 이메일로 전송 하는 로직을 구현
🔸 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)
- input 창에 입력 한 정보가 handleChange 함수를 통해서 UserInfo에 저장.
- 사용자가 Next 버튼을 클릭하면 findPasswordHandler 함수가 실행 됨.
📌 findPasswordHandler
- 사용자가 입력한 이메일과 전화번호 정보를 userInfo 객체로 정리.
- findPassword API 호출을 통해 서버로 해당 정보를 전송.
📌 findPassword
- axios.post를 사용하여 POST 방식으로 백엔드 /findpassword 엔드포인트에 요청을 보냄.
- 요청 본문에 userInfo 객체(이메일과 전화번호 포함)를 전달.
- 서버 응답:
- 성공: 서버로부터 반환된 데이터를 반환하여 처리.
- 실패: 오류 메시지를 반환하여 알림.
🔹 Backend - Spring Boot (Java)
1️⃣ Controller (@PostMapping("/findpassword"))
- 프론트엔드에서 전달된 UserDTO를 받아 서비스 계층으로 전달.
- 서비스 계층에서 처리 후 반환된 Email을 HTTP 응답으로 반환.
2️⃣ Service (findPasswordAndSendEmail 메서드) 와 Repository (MemberRepository)
📌 findPasswordAndSendEmail 메서드 실행 흐름
① 이메일과 전화번호가 저장된 UserDTO를 매개변수로 받음.
② 이메일과 전화번호로 회원 정보 조회 (memberRepository.findByEmailAndPhoneNumber)
- Repository (MemberRepository):
- DB의 member table에서 email과 phoneNumber로 회원 조회.
- JpaRepository 상속시, Member엔티티의 변수 이름으로 쿼리 메서드 생성가능. → findByEmailAndPhoneNumber 메서드를 통해 조회된 Member 엔티티 반환.
③ 임시 비밀번호 생성 및 암호화 후 회원 정보 업데이트.
▪ StringBuffer 를 사용하여 임시 비밀번호를 문자(char)로 하나씩 추가하여 랜덤한 문자의 10자리 임시 비밀번호 생성.
▪ 임시 비밀번호 생성 과정에서 StringBuffer를 사용하여 메모리 낭비를 줄임.
④ 이메일 발송 (sendTemporaryPasswordEmail).
▪ MimeMessage : MIME 형식의 이메일을 작성하기 위한 JavaMail API 클래스.
▪ MimeMessageHelper : MimeMessage를 쉽게 설정할 수 있는 유틸리티 클래스.
- HTML 본문, 첨부파일, 다중 수신자 등을 간단히 처리.
⑤ 업데이트된 Member를 기반으로 email 정보를 반환.
'Project' 카테고리의 다른 글
AntDesign Calendar를 이용한 투어 예약 기능 구현 (1) | 2024.12.17 |
---|---|
PortOne(Iamport)포트원 이용한 결제 기능 구현 (2) - React , SpringBoot (1) | 2024.12.17 |
PortOne(Iamport)포트원 이용한 결제 기능 구현 (1) - 초기 설정 (0) | 2024.12.10 |