[ 사이드 프로젝트_백엔드 : 자프링(Java+SpringBoot) ] 사이드 프로젝트 - 웨더핏 _ 이메일 인증 기능 만들기_01

0
post-thumbnail

[ 사이드 프로젝트_백엔드 : 자프링(Java+SpringBoot) ] 사이드 프로젝트 - 웨더핏 _ 이메일 인증 기능 만들기_01

목 차

1. 기능을 만드는 이유.
2. 사전 설정[구글&네이버 SMTP 설정]
3. properties 설정
4. emailconfig 생성
5. contorller 생성
6. service 생성

Ⅰ. 기능을 만드는 이유.

진행하고 있는 사이드 프로젝트에서 회원가입 시, 이메일로 회원을 관리하려고 합니다.

이 회원가입을 진행하는 과정에 있어서 인증기능을 추가하려고 이메일 인증을 구현하고자 합니다.

 {500이랑 400을 몇번을 봤는지 모르겠는....}
 
 
 

Ⅱ. 사전 설정[구글&네이버 SMTP 설정]

1. 네이버 POP3/SMTP 설정.

※네비어 메일 아웃룩 연동하는 방법 : POP3/SMTP 사용설정.

🩻 네이버 메일 -> 환경 설정 -> POP3/SMTP 설정.

🩻 POP3/SMTP 설정. -> POP3/SMTP 사용함 체크 -> 설정 사항 체크 -> 저장 클릭.

2. 구글 SMTP를 위한 앱 비밀번호 설정.

※구글 이메일로 인증을 위한 smtp서비스를 사용하기 위해서 앱 비밀번호를 설정합니다.

🩻 구글 초기 화면에서, 우측 상단 계정을 클릭 -> Google 계정 관리 클릭.

🩻 상단 검색창에 '앱 비밀번호'를 검색 후 아래 검색결과를 클릭.

🩻 생성할 앱 비밀번호 이름을 임의로 입력 후 '만들기 버튼' 클릭.

🩻 생성된 앱 비밀번호를 복사하거나 캡처하여 별도로 보관합니다.

Ⅲ. properties 설정 & build.gradle.


properties에 위처럼 추가해주고,

implementation 'org.springframework.boot:spring-boot-starter-mail'

build.gradle에는 위의 코드를 추가해줍니다.

Ⅳ. emailconfig 생성

package TestFile.practice.config;



import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;


@Configuration
public class EmailConfig {
    

    @Bean
    public JavaMailSender gmailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("smtp.gmail.com");
        mailSender.setPort(587);
        mailSender.setUsername("이메일입력");
        mailSender.setPassword("앱 비밀번호  입력");

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        
        return mailSender;
    }

    @Bean
    public JavaMailSender naverSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("smtp.naver.com");
        mailSender.setPort(465);
        mailSender.setUsername("이메일입력");
        mailSender.setPassword("비밀번호입력");

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.trust", "smtp.naver.com");
        
        return mailSender;
    }
}

Ⅴ. contorller 생성

package TestFile.practice.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;
import java.util.Random;


import TestFile.practice.dto.UserReqDTO;
import TestFile.practice.dto.UserResDto;
import TestFile.practice.service.AuthService;
import TestFile.practice.service.EmailService;

@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
public class AuthController {
    private final AuthService authService;
    private final EmailService emailService;



   //인증용 이메일 인증 코드 전송
   @PostMapping("/email/verify")
   public ResponseEntity<String> sendVerificationEmail(@RequestBody Map<String, String> request) {
       String email = request.get("email");
       if (email == null || email.isEmpty()) {
           return ResponseEntity.badRequest().body("이메일 주소를 입력해주세요.");
       }

       //인증코드 생성 6자리
       String verificationCode = String.format("%06d", new Random().nextInt(1000000));

       // 네이버 인증 로직 추가
       if (email.endsWith("@naver.com")) {
           // 네이버 이메일 인증 코드 전송 로직
           try {
               emailService.sendEmail(email, "WeatherFit 회원가입 인증 코드", "인증 코드: " + verificationCode);
               return ResponseEntity.ok(verificationCode);
           } catch (Exception e) {
               return ResponseEntity.internalServerError().body("이메일 전송에 실패했습니다.");
           }
       }

       //gmail 이메일 인증 코드 전송
       try {
           emailService.sendEmail(email, "WeatherFit 회원가입 인증 코드", "인증 코드: " + verificationCode);
           return ResponseEntity.ok(verificationCode);
       } catch (Exception e) {
           return ResponseEntity.internalServerError().body("이메일 전송에 실패했습니다.");
       }
    }
  


    //user 이메일 중복 확인
    @PostMapping("/isunique")
    public ResponseEntity<Boolean> isUnique(@RequestBody Map<String, String> dataMap) {
        int type = Integer.parseInt(dataMap.get("type"));
        return ResponseEntity.ok(authService.checkUnique(type,dataMap.get("data")));
    }


    //user 회원 가입
    @PostMapping("/join")
    public ResponseEntity<UserResDto> join(@RequestBody UserReqDTO userReqDto) {
        return ResponseEntity.ok(authService.join(userReqDto));
    }
}

Ⅵ. service 생성

package TestFile.practice.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;

@Slf4j
@Service
@RequiredArgsConstructor
@Transactional
public class EmailService {
    @Qualifier("gmailSender")
    private final JavaMailSender gmailSender;
    
    @Qualifier("naverSender")
    private final JavaMailSender naverSender;

    //gmail 이메일 전송
    public void sendEmail(String toEmail, String subject, String text) {
        SimpleMailMessage emailForm =  createEmailForm(toEmail,subject,text);

        emailForm.setTo(toEmail);
        emailForm.setSubject(subject);
        emailForm.setText(text);

        gmailSender.send(emailForm);


    }
    // naver 이메일 전송
    public void sendEmailByNaver(String to, String subject, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject(subject);
        message.setText(text);
        naverSender.send(message);
    }


    //보낼 이메일 형식 생성
    private SimpleMailMessage createEmailForm(String toEmail, String title, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(toEmail);
        message.setSubject(title);
        message.setText(text);
        return message;
    }
}

0개의 댓글

관련 채용 정보