목 차
1. 기능을 만드는 이유.
2. 사전 설정[구글&네이버 SMTP 설정]
3. properties 설정
4. emailconfig 생성
5. contorller 생성
6. service 생성
진행하고 있는 사이드 프로젝트에서 회원가입 시, 이메일로 회원을 관리하려고 합니다.
이 회원가입을 진행하는 과정에 있어서 인증기능을 추가하려고 이메일 인증을 구현하고자 합니다.
{500이랑 400을 몇번을 봤는지 모르겠는....}
🩻 네이버 메일 -> 환경 설정 -> POP3/SMTP 설정.
🩻 POP3/SMTP 설정. -> POP3/SMTP 사용함 체크 -> 설정 사항 체크 -> 저장 클릭.
🩻 구글 초기 화면에서, 우측 상단 계정을 클릭 -> Google 계정 관리 클릭.
🩻 상단 검색창에 '앱 비밀번호'를 검색 후 아래 검색결과를 클릭.
🩻 생성할 앱 비밀번호 이름을 임의로 입력 후 '만들기 버튼' 클릭.
🩻 생성된 앱 비밀번호를 복사하거나 캡처하여 별도로 보관합니다.
properties에 위처럼 추가해주고,
implementation 'org.springframework.boot:spring-boot-starter-mail'
build.gradle에는 위의 코드를 추가해줍니다.
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;
}
}
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));
}
}
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;
}
}