✔✔ 프론트 엔드 인증 & 인가 처리
(event.api202407, event-app202407)


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
public class EventUser {
@Id
@GenericGenerator(strategy = "uuid", 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;
// 비밀번호 notnull 하지 않는 이유 : SNS 로그인한 회원, 인증번호만 받고
// 회원가입 완료하지 않은 사람처리를 위해
@Column(length = 500)
private String password;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
@Builder.Default // 초기화
private Role role = Role.COMMON; // 권한 초기값 common
private LocalDateTime createAt; // 회원가입 시간
// 이메일 인증을 완료했는지 여부
// 엔터티에 boolean 타입을 사용하면 실제 DB에는 0, 1로 저장됨에 주의 !
@Setter
@Column(nullable = false)
private boolean emailVerified;
}
1-2. 이메일 검증이 저장될 Entity 테이블 생성
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 = "uuid", name = "uuid-generator")
@GeneratedValue(generator = "uuid-generator")
@Column(name = "ev_user_id")
private String id;
@Column(nullable = false)
private String verificationCode; // 인증 코드
@Column(nullable = false)
private LocalDateTime expiryDate; // 인증 만료시간
// 1:1 관계 = 메인 테이블인 user 엔터티를 FK 로 갖기 !
@OneToOne
@JoinColumn(name = "ev_user_id", referencedColumnName = "ev_user_id") // PK -> FK
private EventUser eventUser;
}
엔터티에 맞는 두 Repository 인터페이스 생성하기
package com.study.event.api.event.repository;
import com.study.event.api.event.entity.EventUser;
import org.springframework.data.jpa.repository.JpaRepository;
public interface EventUserRepository extends JpaRepository<EventUser, String> {
// query method 로 jpql 생성
boolean existsByEmail (String email);
}
EventUserService 회원 클래스 추가
package com.study.event.api.event.service;
import com.study.event.api.event.entity.EventUser;
import com.study.event.api.event.repository.EventRepository;
import com.study.event.api.event.repository.EventUserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class EventUserService {
private final EventUserRepository eventUserRepository;
// 이메일 중복 확인 처리
public boolean checkEmailDuplicate (String email) {
// 랜덤 이메일 데이터 넣어서 postman으로 중복 확인하기 !
EventUser user = EventUser.builder()
.email("abc@def.com" + (int) (Math.random() * 10))
.build();
eventUserRepository.save(user);
boolean exists = eventUserRepository.existsByEmail(email);
log.info("Checking email {} is duplicate : {}", email, exists);
return exists;
}
}