SpringBoot

회원가입 시 입력받은 이메일로 인증링크 전송

똑똑한망치 2024. 3. 27. 21:49
728x90
반응형

🎈 회원가입 시 이메일을 입력받아 해당 이메일로 인증 링크를 발송하는 기능을 구현 계획

 

인증 링크 구성

- http://localhost:8080/user/verified/ + 해당 사용자의 id를 이용하여 생성된 token 사용

 

Token Entity

@Entity
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@AuditOverride(forClass = BaseEntity.class)
public class Token extends BaseEntity{

  @Id
  @GeneratedValue(generator = "uuid2")
  @GenericGenerator(name = "uuid2", strategy = "uuid2")
  private String id;

  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "user_id")
  @Setter
  private User user;

  @Setter
  private LocalDateTime expirationDate;
}

 

 

TokenService.java

@Service
@RequiredArgsConstructor
public class TokenService {

  private final TokenRepository tokenRepository;

  // 만료 시간은 5분으로 설정
  private final long EMAIL_TOKEN_EXPIRATION_TIME_VALUE = 5L;

  public Token createToken(User user) {
    Token token = new Token();
    token.setUser(user);
    token.setExpirationDate(LocalDateTime.now().plusMinutes(EMAIL_TOKEN_EXPIRATION_TIME_VALUE));
    return tokenRepository.save(token);
  }
}

 

 

 

EmailSendService.java

@Service
@Slf4j
@RequiredArgsConstructor
public class EmailSendService {

  private final JavaMailSender javaMailSender;

  public void sendEmail(String receiverEmail, Token token) {
    MimeMessage message = javaMailSender.createMimeMessage();
    try {
      MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");

      // 메일 수신자 설정
      messageHelper.setTo(receiverEmail);

      // 메일 제목 설정
      messageHelper.setSubject("회원가입 인증 메일");

      // 메일 내용 설정
      // HTML 적용됨(setText = true 이기 때문에)
      String linkAddress = "<a href=http://localhost:8080/user/verified/"+token.getId()+">인증 링크</a>";
      messageHelper.setText(linkAddress, true);

      // 메일 전송
      javaMailSender.send(message);

    } catch (Exception e) {
      log.info(e.toString());
    }
  }
}

 

 

SignUpApplication.java

@Service
@RequiredArgsConstructor
@Slf4j
public class SignUpApplication {
  private final UserService userService;
  private final TokenService tokenService;
  private final EmailSendService emailSendService;

  public UserDto signup(SignUpForm signUpForm) {
    if(userService.isExistLoginId(signUpForm.getLoginId())) {
      throw new CustomException(ErrorCode.ALREADY_REGISTERD_ID);
    }

    if(userService.isExistEmail(signUpForm.getEmail())) {
      throw new CustomException(ErrorCode.ALREATY_REGISTERD_EMAIL);
    }

    // signupform을 통해 입력받은 user 정보 저장
    User user = userService.save(signUpForm);
    
    // user 정보를 사용하여 token 생성
    Token token = tokenService.createToken(user);
    
    // 생성된 token 정보를 인증 링크에 포함시켜 전송
    emailSendService.sendEmail(signUpForm.getEmail(), token);

    return UserDto.entityToDto(user);
  }
}
반응형