CRUD 형식으로 회원가입을 구현하고 이메일 인증을 해보면 좋을듯 하여 이메일 인증 기능을 만들어 보았습니다.
💡 참고!
글쓴이 환경
IDE: IntelliJJDK: JDK-21Java: 17Spring Boot: 3.0.0 이상
패키지 구조(mail)
├── EmailCheckDto.java
├── EmailConfig.java
├── EmailController.java
├── EmailRequestDto.java
├── EmailService.java
├── ErrorResult.java
├── ExControllerAdvice.java
└── RedisUtil.java
구글 계정관리 편집
- 구글에서 프로필을 눌러
Google 계정관리를 누른다
- 검색창에서
앱 비밀번호를 검색한다
앱 이름을 입력하고만들기버튼을 누른다

- 생성된 앱 비밀번호를 따로 저장한다
- 구글메일 > 전체설정 > 전달 및 POP/IMAP 에 들어가서 아래와 같이 설정을 변경한다.

- 변경사항을 저장한다
🖥️ 구현
build.gradle
build.gradle 에 아래 내용을 추가해야 합니다
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework:spring-context-support:5.3.9'
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'javax.mail:mail:1.4.7'
application.properties
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=####@gmail.com
spring.mail.password=#### #### #### ####
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.ssl.protocols=TLSv1.2
💡 주의사항!
TLSv1.2는 네트워크 프로토콜 설정인데,JDK 버전과 맞아야 한다.
저는JDK 21이상의 버전을 사용하고 있어TLSv1.2로 설정했습니다..!!
버전이 다를 시 오류가 나므로 이 부분을 꼭 맞춰주어야 한다.
EmailConfig
내 구글 계정을 연결 해줄 설정을 등록하는 곳이다.
개인 정보가 들어있으므로, application.properties 에 username과 앱 비밀번호를 작성하고 @Value 어노테이션을 사용해서 가져와서 사용할 것이다.
@Configuration
public class EmailConfig {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.port}")
private int port;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.properties.mail.smtp.auth}")
private boolean auth;
@Value("${spring.mail.properties.mail.smtp.starttls.enable}")
private boolean starttlsEnable;
@Value("${spring.mail.properties.mail.smtp.starttls.required}")
private boolean starttlsRequired;
@Value("${spring.mail.properties.mail.smtp.ssl.trust}")
private String sslTrust;
@Value("${spring.mail.properties.mail.smtp.ssl.protocols}")
private String sslProtocols;
@Bean
public JavaMailSender mailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
mailSender.setDefaultEncoding("UTF-8");
mailSender.setJavaMailProperties(getMailProperties());
return mailSender;
}
private Properties getMailProperties() {
Properties properties = new Properties();
properties.put("mail.smtp.auth", auth);
properties.put("mail.smtp.starttls.enable", starttlsEnable);
properties.put("mail.smtp.starttls.required", starttlsRequired);
properties.put("mail.smtp.ssl.protocols", sslProtocols);
return properties;
}
}
mailSender
@Bean
public JavaMailSender mailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
mailSender.setDefaultEncoding("UTF-8");
mailSender.setJavaMailProperties(getMailProperties());
return mailSender;
}
mailSender 메서드는 어떤 통신을 사용해서, 어떤 포트로, 보내는 사람의 이메일, 앱 비밀번호, 인코딩 방법 을 설정하여 mailSender 객체를 만든다.
getMailProperties
private Properties getMailProperties() {
Properties properties = new Properties();
properties.put("mail.smtp.auth", auth);
properties.put("mail.smtp.starttls.enable", starttlsEnable);
properties.put("mail.smtp.starttls.required", starttlsRequired);
properties.put("mail.smtp.ssl.protocols", sslProtocols);
return properties;
}
getMailProperties 메서드는 통신 방법 에 대한 설정을 작성하여 properties 객체를 만든다.
EmailService
주석을 참고해주세요!
@Service
public class EmailService {
@Autowired
private JavaMailSender javaMailSender;
private int authNumber;
// 6자리로 이루어진 무작위의 수 반환
public void makeRandomNumber() {
Random rnd = new Random();
String randomNumber = "";
for (int i = 0; i < 6; i++) {
randomNumber += Integer.toString(rnd.nextInt(10));
}
authNumber = Integer.parseInt(randomNumber);
}
// 메일을 어디서(setFrom), 어디로(toEmail), 인증번호를 어떤 형식(html)로 보내는지 작성
public String joinEmail(String email) {
makeRandomNumber();
String setFrom = "####@naver.com"; // 보내는 사람 이메일 작성
String toEmail = email; // 받는 사람 이메일
String title = "DunnShop 회원가입 인증번호 메일입니다."; // 메일 제목 작성
// 메일 내용 작성(html 형식으로 작성)
String content ="";
content+= "<div style='margin:20px;'>";
content+= "<h2 style='color:#1C1B1A;'> 안녕하세요 DunnShop 입니다! </h2>";
content+= "<p>아래 코드를 복사하여 입력해주세요.<p><br>";
content+= "<p>제한시간은 5분입니다. 5분 이내에 완료해주시길 바랍니다!<p>";
content+= "<br>";
content+= "<p>감사합니다.<p>";
content+= "<br>";
content+= "<div align='center' style='border:1px solid black; font-family:Sans-serif';>";
content+= "<h3 style='color:#a9b9eb;'>회원가입 인증 코드입니다.</h3>";
content+= "<div style='font-size:130%'>";
content+= "CODE : <strong>";
content+= authNumber+"</strong><div><br/> ";
content+= "</div>";
mailSend(setFrom, toEmail, title, content);
return Integer.toString(authNumber);
}
// 메일 전송하기
public void mailSend(String setFrom, String toEmail, String title, String content) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
// 메시지와 관련된 설정 작성
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
// 이메일을 보내는 사람 주소 설정
helper.setFrom(setFrom);
// 이메일을 받는 사람 주소 설정
helper.setTo(toEmail);
// 메일 제목 작성
helper.setSubject(title);
// 메일 내용 설정, html 로 작성했기 때문에 true 로 설정해야함
helper.setText(content, true);
javaMailSender.send(message);
// 이메일 서버에 연결할 수 없음 or 잘못된 이메일 주소 or 인증오류 발생
} catch (MessagingException e) {
throw new RuntimeException(e);
}
// 5분동안 인증번호가 유효하게 -> 5분이 지나면 인증번호 유효하지 않음!
redisUtil.setDataExpire(Integer.toString(authNumber), toEmail, 60*5L);
}
}
makeRandomNumber
무작위의 6자리 수를 만들기 위해 만든 함수이다.
Random 을 사용해서 무작위의 authNumber 를 만들었다
joinEmail
joinEmail 메서드는 보내는 사람, 받는 사람, 메일 제목, 메일 내용을 작성해서 mailSend 메서드를 사용해서 메일을 보낼 수 있게 객체를 만드는 메서드이다.
메일 내용은 content 변수를 통해 저장했는데, 예쁘게 꾸미고자 길게 작성하였다 ㅎㅎ
mailSend
javaMailSender 를 통해서 메시지를 보냈다.
EmailController
@RestController
@RequiredArgsConstructor
public class EmailController {
private final EmailService emailService;
// json 으로 넘어온 이메일로 인증번호 보내기
@PostMapping("/email")
public String mailSend(@RequestBody @Valid EmailRequestDto emailRequestDto) {
System.out.println("인증 이메일 : " + emailRequestDto.getEmail());
return emailService.joinEmail(emailRequestDto.getEmail());
}
// 인증번호 확인하기
@PostMapping("/email/check")
public String AuthCheck(@RequestBody @Valid EmailCheckDto emailCheckDto) {
Boolean checked = emailService.CheckAuthNum(emailCheckDto.getEmail(), emailCheckDto.getCode());
if (checked) {
return "ok";
} else {
throw new NullPointerException("잘못됨!");
}
}
}
EmailRequestDto
@Data
public class EmailRequestDto {
@Email
@NotEmpty(message = "이메일을 입력해주세요!")
private String email;
}
EmailRequestDto 클래스를 사용해서 보내고 싶은 사람의 이메일 주소를 받는다.
여기까지 구현이 완료되면 6자리의 수가 메일로 보내는 것에 성공한 것이다.
이렇게 postman 을 사용해서 확인할 수 있고,

네이버 메일에 들어가서 확인할 수 있다.

'개발 > BE(Java&Spring Boot)' 카테고리의 다른 글
| [Java&Spring Boot] Postgresql 설치하고 Spring Boot 와 연동하기 (0) | 2025.02.26 |
|---|---|
| [Spring Boot + RabbitMQ] 비동기 메시지 큐를 활용한 리뷰 평점 최적화 (0) | 2025.02.25 |
| [Spring Boot] IoC, DI 알아보기 (0) | 2025.02.12 |
| [JAVA] 배열(Array) 정렬하기 (0) | 2024.12.31 |
