이메일 발송 비동기 처리

rara_kim·2023년 2월 22일
0

프로젝트

목록 보기
1/2

문제상황

실전 프로젝트에서 유저의 이메일로 인증번호를 보내 해당 인증번호를 입력받아 확인하여 회원가입, 비밀번호 변경을 진행했다.
그런데 이메일을 발송하고 완료했다는 응답을 프론트에 보내기까지 평균4~5초 걸리다보니 배포 후 유저가 이용했을 때 메일이 발송이 된건지 안된건지 알지 못해 여러번 발송 버튼을 누르게 되는 일이 있었다.
그래서 인증번호를 생성하고 해당 인증번호를 이메일로 발송하는 로직을 뜯어보기로 했다.

의견결정

기존 코드의 경우 영어 대소문자 + 숫자로 조합한 8자리의 인증번호를 생성하도록 하고 있었다.
그런데 우리 프로젝트에서는 인증번호를 Redis에 저장하여 5분간만 유효하도록 관리하고 있었고, 규모가 크지 않은 프로젝트 이기에 불필요하게 복잡한 로직이라고 판단하여 간소화 하기로 결정했다.

  • 기존의 인증번호 생성 로직
public String createKey() {
    StringBuffer key = new StringBuffer();
    Random random = new Random();

    for (int i = 0; i < 8; i++) {
        int index = random.nextInt(3);

        switch (index) {
            case 0:
                key.append((char) ((random.nextInt(26)) + 97));
                break;
            case 1:
                key.append((char) ((random.nextInt(26)) + 65));
                break;
            case 2:
                key.append((random.nextInt(10)));
                break;
        }

	for (int i = 0; i < 6; i++) {    // 인증코드 6자리
        key.append((random.nextInt(10)));
    }
    return key.toString();
}
  • 새로운 인증번호 생성 로직
public String createKey() {
    StringBuilder key = new StringBuilder();
    Random random = new Random();

    for (int i = 0; i < 6; i++) {    // 인증코드 6자리
        key.append((random.nextInt(10)));
    }
    return key.toString();
}

위와 같이 로직을 간소화 하여 테스트를 진행한 결과 기존 코드보다 조금 속도가 향상되었다.(4.47s -> 3.96s)
그러나 실제 사이트에서 테스트를 해보니 체감될 정도로 응답속도가 크게 빨라지지는 않아 추가적인 방법을 찾아보기로 했다.

그러던 중 이메일을 발송하는 메소드를 비동기 방식으로 처리하여 프론트로 보내는 응답속도를 높이기로 했다.
AsyncConfig 클래스에서 관련 설정을 해주고, @Async 어노테이션을 비동기 처리 하고자 하는 메소드에 붙여주어
이메일 발송 메소드가 호출되는 경우 비동기로 처리하도록 했다.

@Async
public void sendSimpleMessage(String email)throws Exception {
    ePw = createKey();
    MimeMessage message = createMessage(email);
    upsert(new EmailConfirm(email,ePw));

    try {   
        emailSender.send(message);
    } catch (MailException e) {
        e.printStackTrace();
        throw new RestApiException(ErrorStatusCode.DELETED_ACCOUNT);
    }
}

문제 해결 결과

위와 같이 인증번호 생성 로직 간소화와 이메일 발송의 비동기 처리를 통해 기존 코드 실행시 4.47s 소요되던 응답 속도가 489ms로 약 827% 향상 되었다.

기존 코드로직 간소화로직 간소화 + 비동기 처리
4.47s3.96s489ms

profile
느리더라도 꾸준하게

0개의 댓글