✔✔ 프론트 엔드 인증 & 인가 처리

(event.api202407, event-app202407)

Untitled

Untitled

  1. 회원 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
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;
    }
}