try {
userService.signup(requestDto);
return ResponseEntity.ok().body(new MsgResponseDto("회원가입 성공", HttpStatus.OK.value()));
} catch (Exception exception) {
return ResponseEntity.badRequest().body(new MsgResponseDto("회원가입 실패", HttpStatus.BAD_REQUEST.value()));
}EmailVerification 엔티티에 추가된 두 가지 필드는 이메일 인증 정보를 저장하는 데 사용됩니다.verificationCode:
@Column(nullable = false) 어노테이션이 붙어있으므로, 이 필드는 데이터베이스에서 NULL 값을 가질 수 없습니다. 따라서 항상 인증 번호를 가지고 있어야 합니다.expirationDateTime:
- 이 필드는 이메일 인증의 유효 기간을 저장합니다. 즉, 인증 번호의 유효 시간이 언제까지인지를 나타냅니다.
- @Column(nullable = false) 어노테이션이 붙어있으므로, 이 필드도 데이터베이스에서 NULL 값을 가질 수 없습니다.
- 일반적으로 인증 코드는 일정 시간 이후에 만료되도록 하기 위해 사용합니다. 예를 들어, 15분 또는 30분 후에 인증 코드가 만료되도록 설정할 수 있습니다.
- LocalDateTime은 Java 8에서 도입된 클래스로, 날짜와 시간 정보를 가지고 있습니다. 데이터베이스에서는 날짜와 시간을 TIMESTAMP 타입으로 저장할 수 있습니다.
따라서 EmailVerification 엔티티는 이메일 주소(email), 인증 번호(verificationCode), 그리고 인증 코드의 유효 기간(expirationDateTime)을 저장하게 됩니다. 이 정보를 활용하여 사용자가 회원가입 시 입력한 인증 번호가 유효한지 확인하고, 만료되지 않았는지 확인하여 인증 절차를 완료할 수 있습니다.
@Getter
@Setter
public class EmailVerificationRequestDto {
private String userEmail;
private int verificationCode;
public EmailVerificationRequestDto(String userEmail, int verificationCode) {
this.userEmail = userEmail;
this.verificationCode = verificationCode;
}emailVerification.isPresent()는 Optional<T> 객체에서 값이 존재하는지 여부를 확인하는 메서드Optional<T>는 Java 8부터 도입된 클래스로, 값이 있을 수도 있고 없을 수도 있는 값을 감싸는 래퍼 클래스isPresent() 메서드는 Optional<T> 객체에 값이 존재하면 true를 반환하고, 값이 없으면 false를 반환emailVerification.isPresent()는 emailVerification 변수에 값이 있는지 확인하는 조건문에서 사용Optional<EmailVerification> emailVerification = emailVerificationRepository.findByEmail(userEmail);
if (emailVerification.isPresent()) {
EmailVerification verification = emailVerification.get();
if (verification.getVerificationCode() != userEnteredVerificationCode) {
throw new IllegalArgumentException("올바른 인증 번호가 아닙니다.");
}
if (verification.getExpirationDateTime().isBefore(LocalDateTime.now())) {
throw new IllegalArgumentException("인증 시간이 만료되었습니다.");
}
// 인증이 성공하면 사용자를 저장할 수 있습니다
User user = new User(userName, userPassword, userEmail, userNick, role);
userRepository.save(user);
} else {
throw new IllegalArgumentException("유효하지 않은 이메일입니다.");
}Optional<EmailVerification> emailVerification = emailVerificationRepository.findByEmail(userEmail);
emailVerificationRepository에서 findByEmail 메서드를 호출하여 사용자가 입력한 이메일 주소(userEmail)를 기반으로 이메일 인증 정보(EmailVerification)를 찾습니다.findByEmail 메서드는 이메일 인증 정보가 존재하면 해당 정보를 Optional로 감싸서 반환하고, 존재하지 않으면 빈 Optional을 반환합니다.if (emailVerification.isPresent()) { ... } else { ... }
emailVerification.isPresent()를 사용하여 emailVerification 객체에 값이 있는지 여부를 확인합니다.EmailVerification verification = emailVerification.get();
emailVerification.get()을 사용하여 emailVerification 객체에 감싸진 이메일 인증 정보(EmailVerification)를 가져옵니다.get() 메서드는 Optional 객체의 값을 반환합니다. 하지만 이전에 isPresent()를 사용하여 값이 있는지 확인했으므로, 이 곳에서는 값이 반드시 존재하게 됩니다.if (verification.getVerificationCode() != userEnteredVerificationCode) { ... }
verification.getVerificationCode()를 사용하여 이메일 인증 정보의 인증 코드를 가져옵니다.userEnteredVerificationCode)와 저장된 인증 코드를 비교하여 일치하지 않으면, 잘못된 인증 번호로 간주하고 예외를 던집니다.if (verification.getExpirationDateTime().isBefore(LocalDateTime.now())) { ... }
verification.getExpirationDateTime()를 사용하여 이메일 인증 정보의 인증 코드 유효 기간(expirationDateTime)을 가져옵니다.LocalDateTime.now())과 비교하여 인증 코드가 만료되었으면, 인증 시간이 만료되었다고 간주하고 예외를 던집니다.인증이 성공하면, User 객체를 생성하여 회원 정보를 저장합니다. userRepository.save(user)를 사용하여 데이터베이스에 사용자 정보를 저장합니다.
인증이 실패하면, 잘못된 이메일 주소를 입력했다고 예외를 던집니다.
이렇게 하여, 이메일 인증 과정을 통해 사용자가 올바른 인증 번호를 입력하고, 인증 코드가 만료되지 않았을 때만 사용자 정보를 저장할 수 있도록 처리하고 있습니다.
isBefore 메서드는 LocalDateTime 객체의 시간이 주어진 LocalDateTime 객체보다 이전인지 여부를 확인하는 메서드. 즉, 시간 비교를 수행할 때 사용isBefore 메서드는 LocalDateTime 객체의 시간 비교를 수행할 때 주로 사용되지만, 다른 시간과 날짜 객체 간의 비교에도 사용할 수 있음LocalDateTime: 일반적인 날짜와 시간 정보를 포함합니다.LocalDateTime dateTime1 = LocalDateTime.of(2023, 8, 5, 12, 0, 0);
LocalDateTime dateTime2 = LocalDateTime.of(2023, 8, 6, 12, 0, 0);
if (dateTime1.isBefore(dateTime2)) {
// dateTime1은 dateTime2보다 이전 시간입니다.
}LocalDate: 날짜 정보 만을 가지며 시간 정보는 없습니다.LocalDate date1 = LocalDate.of(2023, 8, 5);
LocalDate date2 = LocalDate.of(2023, 8, 6);
if (date1.isBefore(date2)) {
// date1은 date2보다 이전 날짜입니다.
}LocalTime: 시간 정보 만을 가지며 날짜 정보는 없습니다.LocalTime time1 = LocalTime.of(12, 0);
LocalTime time2 = LocalTime.of(13, 0);
if (time1.isBefore(time2)) {
// time1은 time2보다 이전 시간입니다.
}ZonedDateTime: 특정 시간대를 고려한 날짜와 시간 정보를 포함합니다.ZonedDateTime zonedDateTime1 = ZonedDateTime.of(dateTime1, ZoneId.of("Asia/Seoul"));
ZonedDateTime zonedDateTime2 = ZonedDateTime.of(dateTime2, ZoneId.of("Asia/Seoul"));
if (zonedDateTime1.isBefore(zonedDateTime2)) {
// zonedDateTime1은 zonedDateTime2보다 이전 시간입니다.
}