Spring/[P] AI 기반 사용자 맞춤형 메뉴와 맛집 추천

[Springboot] 이메일로 임시 비밀번호 전송 개발하기 (2) controller, repository, service

alsruds 2024. 8. 22. 18:15

🗂️ src/main/java

  L  📁 apiPayload

  L  📁 config

  L  📂 controller

        L UserController

  L  📂 domain

        L 📁 common

        L 📁 enums

        L User

  L  📂 dto

        L 📂 request

              L NewPasswordDto

        L 📁 response

  L  📁 jwt

  L  📂 repository

        L UserRepository

  L  📂 service

        L UserService

        L UserServiceImpl

 

🗂️ src/main/resources

  L application.properties

  L application.yml

 

🐘 build.gradle

 

 

SMTP 서버를 이용하여 클라이언트에게 임시 비밀번호를 전송해보자 ❕

 

UserController : 임시 비밀번호를 받을 메일 주소를 받아 서비스 코드 로직으로 넘겨준다

@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class UserController {

    private final UserService userService;

    @PostMapping("/new-pw")
    public ApiResponse<SuccessStatus> sendNewPasswordEmail(@Valid @RequestBody NewPasswordDto dto) throws Exception {
        return ApiResponse.onSuccess(userService.sendNewPasswordEmail(dto));
    }
}

 

UserRepository : 사용자 검증

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}

 

UserServiceImpl : 필요한 정보를 세팅하여 SMTP 서버로 보내준다

@Service
@Transactional
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
    private final JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String from;

    public SuccessStatus sendNewPasswordEmail(NewPasswordDto dto) throws Exception {

        Optional<User> user = userRepository.findByEmail(dto.getEmail());
        if (user.isPresent()) {
            String tempPassword = generateRandomPassword(10);

            SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
            simpleMailMessage.setTo(dto.getEmail());
            simpleMailMessage.setFrom(from);
            simpleMailMessage.setSubject("[BABAL] 임시 비밀번호 안내");
            simpleMailMessage.setText("임시 비밀번호 : " + tempPassword);

            try {
                user.get().updatePassword(passwordEncoder.encode(tempPassword));
                javaMailSender.send(simpleMailMessage);
            } catch (Exception e) {
                e.printStackTrace();
                throw new MessagingException("이메일 전송 실패");
            }
            return SuccessStatus._OK;
        } else {
            throw new GeneralException(ErrorStatus.MEMBER_NOT_FOUND);
        }
    }

    public String generateRandomPassword(int length) {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        SecureRandom random = new SecureRandom();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < length; i++) {
            int randomIndex = random.nextInt(characters.length());
            sb.append(characters.charAt(randomIndex));
        }

        return sb.toString();
    }
}

  L  sendNewPasswordEmail : 사용자 이메일로 원하는 내용 전송하는 메서드

  L  generateRandomPassword : 랜덤으로 임시 비밀번호를 생성하는 메서드

 


2024.08.20 - [Spring/[P] AI 기반 사용자 맞춤형 메뉴와 맛집 추천] - [Springboot] 로그인 전 비밀번호 재설정 설계하기

 

[Springboot] 로그인 전 비밀번호 재설정 설계하기

📂 /user  L 회원 가입  L 회원 탈퇴  L 로그인   L 로그아웃  L 비밀번호 재설정 (로그인 전) ⬅️⬅️⬅️   L 비밀번호 재설정 (로그인 후)  🔧 디자인  🔧 필요한 데이터  L email 🔧 HTTP

alsrudalsrudalsrud.tistory.com

 

2024.08.21 - [Spring/[P] AI 기반 사용자 맞춤형 메뉴와 맛집 추천] - [Springboot] 로그인 전 비밀번호 재설정 개발하기 (1) build.gradle, application.yml, dto

 

[Springboot] 로그인 전 비밀번호 재설정 개발하기 (1) build.gradle, application.yml, dto

🗂️ src/main/java   L  📁 apiPayload   L  📁 config   L  📂 controller        L UserController   L  📂 domain        L 📁 common        L 📁 enums        L User   L  📂 dto        L 📂 request       

alsrudalsrudalsrud.tistory.com