<aside> 💡 유저에게 이메일을 보내는 로직 추가 후 회원가입에 13초가 소요, 해당 로직의 시간 단축을 목표로 했다
</aside>
public SignupResDto signUp(SignupReqDto signupReqDto) {
// SignupReqDto 검증
validate(signupReqDto);
// 5자의 무작위 번호 생성 및 중복 검사: 문자, 숫자 포함
String randomNumber = generateNotUsedRandomNumber();
// 이메일 인증 메일 발송
emailService.sendMail(signupReqDto.getEmail(), randomNumber);
// DB에 해당 정보 저장
Hashtag hashtag = hashtagRepoForUser.save(signupReqDto.toHashtagEntity());
return SignupResDto.from(userRepository.save(signupReqDto.toEntity(encoder, randomNumber, hashtag)));
}
회원가입을 진행할 때 회원의 인증 코드가 담긴 메일을 넘겨주는 로직이 추가되면서 문제가 발생, 회원가입을 하는 것에 13초가 걸리는 것은 분명히 문제였다
회원가입에 14초의 시간을 필요로 함
<aside> 💡 회원가입을 진행하면서 이메일이 보내질 때까지 기다릴 필요는 없다는 생각이 들었다. 그렇기에 해당 메서드를 비동기화해 처리하는 방법을 생각
</aside>
public class EmailService {
//...생략
@Transactional
public void sendAsyncMail(String email, String randomNumber) {
CompletableFuture.runAsync(() ->
send(
EmailMessage.builder()
.to(email)
.subject(SUBJECT)
.message(createTemplateMessage(email, randomNumber))
.build()), getAsyncExecutor());
}
private void send(EmailMessage emailMessage) {
//... 생략
}
private Executor getAsyncExecutor() {
return Executors.newCachedThreadPool();
}
//... 생략
}
CompletableFuture.runAsync()
를 통해 send()
메서드를 비동기로 실행한다getAsyncExecutor()
메서드는 비동기 작업 처리를 위한 Executor를 생성하는 메서드로 스레드 풀 크기 및 기타 구성 옵션을 정의할 수 있다<aside> 💡
기본적으로 runAsync
는 공용 ForkJoinPool을 사용한다. 사용자 정의 Executor
를 통해 스레드 풀을 제어할 수 있다.