94일차 - JPA (이메일 중복확인, 이메일 인증 처리)

Yohan·2024년 7월 11일
0

코딩기록

목록 보기
136/156
post-custom-banner
  • EventUser
package com.study.event.api.event.entity;

/*
  회원가입 요청 흐름

  1st request: 이메일 중복확인 요청
  1차: 이메일을 입력 -> 디바운싱을 통해 1.5초 뒤 서버로 이메일 중복확인 검증
   -> 중복이 아니라고 판단되면 서버에서는 해당 이메일로 인증메일 발송

  2nd request: 인증코드 검증 요청
  2차: 인증코드 입력 -> 디바운싱을 통해 1.5초 뒤 서버로 인증코드 전송 검증
   -> 만료시간 이내이고 인증코드가 일치한다면  -> 일치하지 않는다면 인증코드 재발송

  3rd request: 회원가입 완료 요청
  3차: 비밀번호 입력 -> 검증에 통과한다면 회원가입을 완료


   첫번째 테이블 : 회원 기본정보 테이블
   두번째 테이블 : 인증코드 정보 테이블 (인증코드, 만료시간)
*/

import lombok.*;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter
@ToString
@EqualsAndHashCode(of="id")
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "tbl_event_user")
public class EventUser {

    @Id
    @GenericGenerator(strategy = "uuid2", name = "uuid-generator")
    @GeneratedValue(generator = "uuid-generator")
    @Column(name = "ev_user_id")
    private String id; // 회원 계정이 아니고 랜덤문자 PK

    @Column(name = "ev_user_email", nullable = false, unique = true)
    private String email; // 회원 계정

    // Not Null을 하지 않는 이유: SNS 로그인한 회원, 인증번호만 받고 회원가입 완료하지않은 사람처리
    @Column(length = 500)
    private String password;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    @Builder.Default
    private Role role = Role.COMMON; // 권한

    private LocalDateTime createAt; // 회원가입 시간

    // 이메일 인증을 완료했는지 여부
    // 엔터티에 boolean타입을 사용하면 실제 DB에는 0, 1로 저장됨에 주의
    @Setter
    @Column(nullable = false)
    private boolean emailVerified;
}
  • EmailVerification
package com.study.event.api.event.entity;

import lombok.*;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter
@ToString
@EqualsAndHashCode(of = "id")
@NoArgsConstructor
@AllArgsConstructor
@Builder

@Entity
@Table(name = "tbl_email_verification")
public class EmailVerification {

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

    @Column(nullable = false)
    private String verificationCode; // 인증 코드

    @Column(nullable = false)
    private LocalDateTime expiryDate; // 인증 만료시간

    @OneToOne
    @JoinColumn(name = "event_user_id", referencedColumnName = "ev_user_id")
    private EventUser eventUser;

    /*
        ALTER TABLE tbl_email_verification
        ADD CONSTRAINT fk_dfsd_dfsdsf
        FOREIGN KEY (event_user_id)
        REFERENCES tbl_event_user (ev_user_id)
     */

}

회원가입 순서

  1. 이메일 중복확인 (이메일이 중복되지 않았네?)
  2. 이메일 코드 검사
  • 인증 이메일 발송, 인증 코드 체크
  1. 로그인
  • 패스워드 암호화

  • 이메일 보내고

  • 이메일로 온 코드 확인해서 true

profile
백엔드 개발자
post-custom-banner

0개의 댓글