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);
}
}
반응형