2022.05.25 ใEmail ์ธ์ฆใ
์ด์ฌํ ํ๋ก์ ํธ๋ฅผ ํ๋ค๊ฐ ์ด๊ธฐ ๊ตฌ์ํ wiki๋ฅผ ๋ค์ ๋ณด๊ฒ ๋์๋ค.
ํ์๊ฐ์ ์ ์ด๋ฉ์ผ api๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋๋ฐ ๊ทธ๊ฑธ ๊น๋จน์๋ค.. ๊ทธ๋์ ํ์๊ฐ์ ์ ๋ค์ ๊ฑด๋๋ฆฌ๊ฒ ๋์๋ค.
Java์ MailSender ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ SMTP ๊ตฌ๊ธ ์ด๋ฉ์ผ๋ก ์ด๋ฉ์ผ ์ธ์ฆ ๋ฒํธ๋ฅผ ํด๋ผ์ด์ธํธ ์์ฒญ ์ด๋ฉ์ผ๋ก ๋ณด๋ด์ฃผ๋๋ก ์ค๊ณํ๊ณ ์ธ์ฆ ๋ฒํธ๋ฅผ redis DB์ ์ ์ฅํ์ฌ ๋น๊ตํ๊ณ ํ์๊ฐ์ ์ ์ด๋ฃจ๊ฒ ํ ๊ฒ์ด๋ค.
Mail Sender
// Mail
implementation 'org.springframework.boot:spring-boot-starter-mail'
๋จผ์ ์์กด์ฑ์ ์ถ๊ฐํ๋ค.
Application.yml
์ง๊ธ๊น์ง Properties ํ์ผ์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ, ์ด๋ฒ ๊ธฐํ์ yaml์ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
์ด์ ๋ ์ธ๊ฐ ์นํ์ ์ผ๋ก ๊ฐ๋ ์ฑ์ด ์ข๊ณ Depth ํ์์ผ๋ก ์ค๋ณต๋ ํค์๋๋ฅผ ์ ์ธ์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
=> yml๋ก ํ์ผ ๋ณ๊ฒฝ
=> ์ด๋ฐ ์์ผ๋ก ํํ ๊ฐ๋ฅ, ๊ฐ๋ ์ฑ์ด ํจ์ฌ ์ข์์ก๋ค.
JoinController
ํ์ ๊ฐ์ ์ปจํธ๋กค๋ฌ์์ ๋จผ์ ์ด๋ฉ์ผ์ ๋ฐ์ Service๋ก ์ด๊ดํ๋ค.
/**
* ์ด๋ฉ์ผ ์ธ์ฆ ๋ฒํธ ์ ์ก ์ฒ๋ฆฌ
* @param emailRequestDTO ์ด๋ฉ์ผ
* @return ์ํ์ฝ๋ 200
*/
@PostMapping("/email")
public ResponseEntity<String> authEmail(@RequestBody UserEmailRequestDTO emailRequestDTO) {
userService.sendEmail(emailRequestDTO);
return ResponseEntity.ok().build();
}
UserService
1. ๊ฐ์ฒด๋ฅผ ๋ฐ์ ๋๋ค ํค๋ฅผ ์์ฑํ๋ ๋ฉ์๋
public void sendEmail(UserEmailRequestDTO emailRequestDTO) {
String authKey = String.valueOf(RANDOM_KEY);
sendAuthEmail(emailRequestDTO.getUserEmail(), authKey);
}
2. Mailsender๋ฅผ ํตํด ์ด๋ฉ์ผ ์ ์กํ๋ ๋ฉ์๋ (์ธ์ฆ ํค๋ฅผ redis์ ์ ์ฅํ๋ค)
private void sendAuthEmail(String userEmail, String authKey) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, ENCODE);
helper.setTo(userEmail);
helper.setSubject(SUBJECT);
helper.setText(TEXT + authKey, true);
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
log.error(e.getMessage());
}
redisService.setDataExpire(userEmail, authKey, EXPIRE_DURATION);
}
3. ์ธ์ฆ ํค๋ฅผ ๊ฒ์ฆํ๋ ๋ฉ์๋
public void authEmail(UserJoinDTO joinUser) throws EmailAuthException {
String redisValue = redisService.getData(joinUser.getUserEmail());
if(!joinUser.getAuthKey().equals(redisValue)) {
throw new EmailAuthException("์ธ์ฆ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.");
}
}
๊ฒฐ๊ณผ
์ด๋ฐ์์ผ๋ก ์ ๋์ด์ค๊ณ
ํฌ์คํธ๋งจ์ ํตํด ํ์ ๊ฐ์ ์์ฒญ์ ํ๋ฉด
ํ์ ๊ฐ์ ์ด ์ ์ฒ๋ฆฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ฌธ์ ์
์ด๋ฉ์ผ ์ธ์ธต ์ฒ๋ฆฌ๊น์ง๋ ์ด๋ ต์ง ์๊ฒ ๊ตฌํ์ ํ๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ mailsender๋ ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด๋ค.
๋ง์ฝ ์๋น์ค์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ์ฌ์ฉ์๊ฐ ๊ธ์ฆํด ํธ๋ํฝ์ด ์ฆ๊ฐํ ๋ ์์ฒญ๋๊ฒ ๋ฉ์ผ์ ๋ฐ๋ ์๊ฐ์ด ์ฆ๊ฐํ์ง ์์๊น?
์ด๊ฒ์ผ ๊ฒฝ์ฐ๋ฅผ ํ๋ฒ ๊ณ ๋ฏผํด๋ณด์.
๊ณ ๋ฏผํ ์ฌํญ์ ๋น๋๊ธฐ ๋ฐฉ์??