글 목적


<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초의 시간을 필요로 함

회원가입에 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();
    }
		//... 생략

}

성능 향상에서 신경써야 할 부분


스레드 풀 커스터마이징

<aside> 💡

기본적으로 runAsync는 공용 ForkJoinPool을 사용한다. 사용자 정의 Executor를 통해 스레드 풀을 제어할 수 있다.

선택 방법: new ThreadPoolExecutor()