팀 프로젝트에서는 회원 관리를 하기 위해서 이메일 인증을 해야 회원가입이 가능하게 했다. 어떻게 구현할지 고민하다가 Email에 Token을 함께 전송해서 Token이 일치할 시에 회원 활성화하는 방법으로 설정했다.
처음에는 EmailToken을 회원 테이블에 넣어서 관리를 했었다.
그런데 어쩐지 찜찜하기도 하고 가독성이 별로라고 생각돼서 아예 EmailToken 테이블을 따로 관리하는 걸로 바꿨다.
EmailToken 테이블
User 테이블 (local)
public class EmailToken {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column
private String verificationToken;
@Column
private LocalDateTime verificationTokenTime;
@Column
private boolean expired;
private LocalDateTime expirationDate;
private long userId;
@Builder
public EmailToken(long id, long userId, String verificationToken, LocalDateTime verificationTokenTime, LocalDateTime expirationDate) {
this.id = id;
this.userId = userId;
this.verificationToken = verificationToken;
this.verificationTokenTime = verificationTokenTime;
this.expirationDate = expirationDate;
this.expired = false;
}
public static EmailToken generateVerificationToken(User user) {
EmailToken emailToken = EmailToken.builder()
.userId(user.getId())
.verificationToken(UUID.randomUUID().toString())
.verificationTokenTime(LocalDateTime.now())
.expirationDate(LocalDateTime.now().plusMinutes(5L))
.build();
return emailToken;
}
public void expiredToken() {
this.expired = true;
}
}
public class EmailService {
private final JavaMailSender javaMailSender;
public void sendEmail(ResponseMessage emailMessage) throws MessagingException{
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
mimeMessageHelper.setTo(emailMessage.getTo());
mimeMessageHelper.setSubject(emailMessage.getSubject());
mimeMessageHelper.setText(emailMessage.getMessage());
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
public class ResponseMessage {
private String to;
private String subject;
private String message;
}