본문 바로가기
📕 Spring Framework/Spring Project

2022.05.25 「Email 인증」

by GroovyArea 2022. 5. 25.
열심히 프로젝트를 하다가 초기 구상한 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는 생각보다 오래 걸리는 작업이다.

만약 서비스의 규모가 커지면서 사용자가 급증해 트래픽이 증가할 땐 엄청나게 메일을 받는 시간이 증가하지 않을까?

이것일 경우를 한번 고민해보자.

고민한 사항은 비동기 방식??

반응형