본문 바로가기
기록해보기

E-mail인증 처리2

by titlejjk 2023. 9. 8.

다음으로 Service 인터페이스와 구현 클래스를 작성해 보겠습니다. 

package com.project.user.service.email;

import com.project.user.dao.EmailVerificationMapper;
import com.project.user.dto.EmailVerificationDto;
import lombok.RequiredArgsConstructor;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Random;

@Service
@RequiredArgsConstructor
public class EmailVerificationServiceImpl implements EmailVerificationService{

    //EmailVerificationMapper의존성 추가
    private final EmailVerificationMapper emailVerificationMapper;

    //JavaMailSender 의존성 추가
    private final JavaMailSender mailSender;

    @Override
    public void sendVerificationEmail(String userEmail) {
        //랜덤 인증 코드 생성
        Random random = new Random();
        String verificationCode = String.format("%04d", random.nextInt(10000));

        //만료 시간생성(현재시간 + 10분)
        LocalDateTime expiryDate = LocalDateTime.now().plusMinutes(10);

        //Database에 저장
        EmailVerificationDto emailVerificationDto = EmailVerificationDto.builder()
                .userEmail(userEmail)
                .verificationCode(verificationCode)
                .expiryDate(expiryDate)
                .build();
        //builder로 저장된 값들을 db에 저장
        emailVerificationMapper.insertEmailCode(emailVerificationDto);

        //저장후 이메일 전송
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(userEmail);
        message.setSubject("인증 이메일 입니다");
        message.setText("발급된 인증코드입니다 : " + verificationCode);
        mailSender.send(message);
    }

    @Override
    public boolean verifyEmail(String userEmail, String verificationCode) {
        EmailVerificationDto storedDto = emailVerificationMapper.findEmailCodeByUserEmail(userEmail);

        if(storedDto != null && storedDto.getVerificationCode().equals(verificationCode)){
            //인증 성공 후 DB에서 인증 코드 삭제
            emailVerificationMapper.deleteEmailCode(userEmail);
            return true;
        }
        return false;
    }
}

"sendVerificationEmail"이 메서드는 사용자에게 이메일을 전송하는 역할을 합니다. 랜덤 인증 코드를 생성한 후 만료 날짜를 설정 후 데이터베이스에 저장합니다.
그리고 "verifyEmail"의 메서드를 통해 사용자가 입력한 인증 코드를 검증합니다. 데이터베이스에서 해당 이메일의 인증 코드를 찾아 사용자가 입력한 코드와 비교한 후에 인증이 성공하면 해당 코드를 데이터베이스에서 삭제하는 코드입니다.

 

ServiceImpl을 모두 구현했으니 다음으로 Controller를 만들어보겠습니다.

이 클래스에서 사용자로부터 이메일 인증을 위한 요청을 받고, 이메일을 전송하며 인증 코드를 검증하는 로직입니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/email")
public class EmailController {

    @Autowired
    private EmailService emailService;

    // 이메일 전송 API
    @PostMapping("/send")
    public String sendEmail(@RequestParam String email) {
        String code = emailService.generateVerificationCode();
        emailService.sendEmail(email, "Email Verification", "Your verification code is: " + code);
        // 코드를 데이터베이스에 저장하는 로직 추가
        return "Email sent successfully.";
    }

    // 인증 코드 검증 API
    @PostMapping("/verify")
    public String verifyCode(@RequestParam String email, @RequestParam String code) {
        // 데이터베이스에서 해당 이메일의 코드를 가져오는 로직 추가
        boolean isVerified = emailService.verifyCode(code, "storedCode"); // storedCode는 데이터베이스에서 가져온 코드
        if (isVerified) {
            return "Email verified successfully.";
        } else {
            return "Invalid verification code.";
        }
    }
}

 

 

'기록해보기' 카테고리의 다른 글

E-mail인증 처리  (0) 2023.09.08
MQTT를 사용한 프로젝트 진행해보기 2  (0) 2023.08.28
MQTT를 사용한 프로젝트 진행해보기 1  (0) 2023.08.28
메서드 분리와 DRY의 원칙  (0) 2023.08.27
Follow 기능 구현  (0) 2023.08.24

댓글