2023.08.04.금.TIL

heeh·2023년 8월 4일

TIL

목록 보기
58/82
post-thumbnail

2023.08.04.금.TIL

  • 익셉션을 통으로 보내주는게 아니라 어떤 익셉션이 발생했는지 종류를 나눠주고 보여주는 것이 좋음
    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()));
            }
  • 아이디, 이메일 중복이나 없는 것을 확인하는…
  • 회원가입, 트라이&캐치문이 작동 되기 전에 이메일 중복을 먼저 -> 프론트엔드, 이메일 중복 등 확인이 되지 않으면 다음으로 넘어가지 않게 해야 함
  • 백엔드, 포스트맨에서만 확인하기 때문에 모두 예외처리를 해주는 것이 효율적
  • 인증키와 유저가 입력한 인증키(authNum)를 비교와 이를 위한 테이블 만들기
  • 클래스 다시 정의, 정리하기
    • UserServiceImpl -> UserService 컴포넌트 받아서 사용할 수 있게끔
    • EmailServiceImpl 컴포넌트해서 Bean으로 만듦
    • Bean은 Static 같은 것으로 생각! 어디든지 편하게 사용할 수 있다
    • Bean으로 등록하면 인스턴스화 필요 없이 사용할 수 있다
  • 인증 성공 시 회원가입 완료, 인증 실패 시 실패
  • 패키지(그룹파일) 묶어서 말고 풀어서 보기 설정
    • 톱니바퀴 - TreeAppearance - CompactMiddle Packages
  • 풀리퀘스트 - 리졸브 컨플릭츠 : 바뀐 내용 확인
  • 이슈 만들고 → 리모트 디벨롭 체크아웃 → 로컬에 생긴 디벨롭 업데이트 → 업데이트 된 디벨롭에서 feature/이슈번호/{기능 설명} 브랜치를 생성
  • 글로벌익셉션핸들러….. → 익셉션 하나 씩 수정하는 것이 아니라 한 번에 관리 할 수 있다
  • Request - body, pharam, query…?

이메일 인증번호 검증

  • https://gilssang97.tistory.com/60 참고
    → JPA를 쓰지 않고 있다 ㅜ ㅇ ㅜ
  • EmailVerify
  • entity 조언 EmailVerification 엔티티에 추가된 두 가지 필드는 이메일 인증 정보를 저장하는 데 사용됩니다.
    1. verificationCode:

      • 이 필드는 이메일 인증에 사용되는 인증 번호를 저장합니다.
      • @Column(nullable = false) 어노테이션이 붙어있으므로, 이 필드는 데이터베이스에서 NULL 값을 가질 수 없습니다. 따라서 항상 인증 번호를 가지고 있어야 합니다.
    2. expirationDateTime:
      - 이 필드는 이메일 인증의 유효 기간을 저장합니다. 즉, 인증 번호의 유효 시간이 언제까지인지를 나타냅니다.
      - @Column(nullable = false) 어노테이션이 붙어있으므로, 이 필드도 데이터베이스에서 NULL 값을 가질 수 없습니다.
      - 일반적으로 인증 코드는 일정 시간 이후에 만료되도록 하기 위해 사용합니다. 예를 들어, 15분 또는 30분 후에 인증 코드가 만료되도록 설정할 수 있습니다.
      - LocalDateTime은 Java 8에서 도입된 클래스로, 날짜와 시간 정보를 가지고 있습니다. 데이터베이스에서는 날짜와 시간을 TIMESTAMP 타입으로 저장할 수 있습니다.

      따라서 EmailVerification 엔티티는 이메일 주소(email), 인증 번호(verificationCode), 그리고 인증 코드의 유효 기간(expirationDateTime)을 저장하게 됩니다. 이 정보를 활용하여 사용자가 회원가입 시 입력한 인증 번호가 유효한지 확인하고, 만료되지 않았는지 확인하여 인증 절차를 완료할 수 있습니다.

  • 인스턴스화
    • 추상화 되어있는 것을 실제화/구체화 시켜줌
    • 휴먼이라는 객체는 추상화
  • public class EmailVerificationRequestDto
    @Getter
    @Setter
    public class EmailVerificationRequestDto {
        private String userEmail;
        private int verificationCode;
    
        public EmailVerificationRequestDto(String userEmail, int verificationCode) {
            this.userEmail = userEmail;
            this.verificationCode = verificationCode;
        }
    • 인증 코드가 A, B, C에게 메일로 갔다고 해보자
      • private String userEmail; 로 누구의 메일인지 체크하여 Request
      • private int verificationCode; 로 어떤 코드인지 체크하여 Request
  • emailVerification.isPresent()Optional<T> 객체에서 값이 존재하는지 여부를 확인하는 메서드
    • Optional<T>는 Java 8부터 도입된 클래스로, 값이 있을 수도 있고 없을 수도 있는 값을 감싸는 래퍼 클래스
    • 이 클래스를 사용하는 주된 목적은 null을 방지하고, null 체크를 간편하게 수행하기 위함
  • isPresent() 메서드는 Optional<T> 객체에 값이 존재하면 true를 반환하고, 값이 없으면 false를 반환
    • emailVerification.isPresent()emailVerification 변수에 값이 있는지 확인하는 조건문에서 사용
  • public void VerificationCodeCheck 설명
    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("유효하지 않은 이메일입니다.");
            }
    1. Optional<EmailVerification> emailVerification = emailVerificationRepository.findByEmail(userEmail);

      • emailVerificationRepository에서 findByEmail 메서드를 호출하여 사용자가 입력한 이메일 주소(userEmail)를 기반으로 이메일 인증 정보(EmailVerification)를 찾습니다.
      • findByEmail 메서드는 이메일 인증 정보가 존재하면 해당 정보를 Optional로 감싸서 반환하고, 존재하지 않으면 빈 Optional을 반환합니다.
    2. if (emailVerification.isPresent()) { ... } else { ... }

      • emailVerification.isPresent()를 사용하여 emailVerification 객체에 값이 있는지 여부를 확인합니다.
      • 값이 존재하면 (즉, 이메일 인증 정보를 찾은 경우), if 블록 안의 코드를 실행합니다.
      • 값이 존재하지 않으면 (즉, 이메일 인증 정보를 찾지 못한 경우), else 블록 안의 코드를 실행합니다.
    3. EmailVerification verification = emailVerification.get();

      • emailVerification.get()을 사용하여 emailVerification 객체에 감싸진 이메일 인증 정보(EmailVerification)를 가져옵니다.
      • get() 메서드는 Optional 객체의 값을 반환합니다. 하지만 이전에 isPresent()를 사용하여 값이 있는지 확인했으므로, 이 곳에서는 값이 반드시 존재하게 됩니다.
    4. if (verification.getVerificationCode() != userEnteredVerificationCode) { ... }

      • verification.getVerificationCode()를 사용하여 이메일 인증 정보의 인증 코드를 가져옵니다.
      • 사용자가 입력한 인증 코드(userEnteredVerificationCode)와 저장된 인증 코드를 비교하여 일치하지 않으면, 잘못된 인증 번호로 간주하고 예외를 던집니다.
    5. if (verification.getExpirationDateTime().isBefore(LocalDateTime.now())) { ... }

      • verification.getExpirationDateTime()를 사용하여 이메일 인증 정보의 인증 코드 유효 기간(expirationDateTime)을 가져옵니다.
      • 현재 시간(LocalDateTime.now())과 비교하여 인증 코드가 만료되었으면, 인증 시간이 만료되었다고 간주하고 예외를 던집니다.
    6. 인증이 성공하면, User 객체를 생성하여 회원 정보를 저장합니다. userRepository.save(user)를 사용하여 데이터베이스에 사용자 정보를 저장합니다.

    7. 인증이 실패하면, 잘못된 이메일 주소를 입력했다고 예외를 던집니다.

      이렇게 하여, 이메일 인증 과정을 통해 사용자가 올바른 인증 번호를 입력하고, 인증 코드가 만료되지 않았을 때만 사용자 정보를 저장할 수 있도록 처리하고 있습니다.

    • isBefore 설명
      • isBefore 메서드는 LocalDateTime 객체의 시간이 주어진 LocalDateTime 객체보다 이전인지 여부를 확인하는 메서드. 즉, 시간 비교를 수행할 때 사용
      • isBefore 메서드는 LocalDateTime 객체의 시간 비교를 수행할 때 주로 사용되지만, 다른 시간과 날짜 객체 간의 비교에도 사용할 수 있음
      • isBefore 예제
        • 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보다 이전 시간입니다.
          }
profile
공부하자개발하자으쌰으쌰

0개의 댓글