실전 프로젝트에서 유저의 이메일로 인증번호를 보내 해당 인증번호를 입력받아 확인하여 회원가입, 비밀번호 변경을 진행했다.
그런데 이메일을 발송하고 완료했다는 응답을 프론트에 보내기까지 평균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.47s | 3.96s | 489ms |