๐Ÿ“• Spring Framework/Spring Project

2022.05.25 ใ€ŒEmail ์ธ์ฆใ€

GroovyArea 2022. 5. 25. 23:12
์—ด์‹ฌํžˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค๊ฐ€ ์ดˆ๊ธฐ ๊ตฌ์ƒํ•œ 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๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด๋‹ค.

๋งŒ์•ฝ ์„œ๋น„์Šค์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ‰์ฆํ•ด ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•  ๋• ์—„์ฒญ๋‚˜๊ฒŒ ๋ฉ”์ผ์„ ๋ฐ›๋Š” ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์„๊นŒ?

์ด๊ฒƒ์ผ ๊ฒฝ์šฐ๋ฅผ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด๋ณด์ž.

๊ณ ๋ฏผํ•œ ์‚ฌํ•ญ์€ ๋น„๋™๊ธฐ ๋ฐฉ์‹??

๋ฐ˜์‘ํ˜•