life is egg

이메일 비동기처리 본문

개인공부/삽질

이메일 비동기처리

삶은계란진재혁 2023. 3. 17. 17:57

상황

1.이메일 인증버튼 클릭시 이메일 발송 알럿창이 3초 이상있다가 나타남

2.클라이언트는 이를 기달리기 힘들다..! 나도 3초이상 기다리기 힘들다 ... 이는 중복요청으로 넘어 가게 된다..

3.이유를 찾아보자..~!

인증 번호 발송을 누르면 3초이상의 시간이 걸린다.!

 

 

원인분석..

하나의 쓰레드를 사용하기 때문에 라는 생각을 했다

현재 인증번호 발송 버튼을 클릭시 요청이오면

  1. JavaMailSender를 통해 이메일을 발송
  2. 발송이 정상적으로 완료
  3. 완료요청을 받으면 그제서야 클라쪽으로 200요청을 보낸다..

이과정이 3초이상 걸리고.. 여기서 문제가 있다고 생각 이메일을 비동기 처리해줘서

하나의 쓰레드는 발송과정을 처리하고 다른 쓰레드를 이용해서 바로 클라쪽으로 200요청을 보내는 식으로 처리했다

이때 사용한

스프링 부트에서 지원하는 어노테이션 @Async

 

장점및 주의사항.. 참조 ! 

 

https://velog.io/@gillog/Spring-Async-Annotation%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

[Spring] @Async Annotation(비동기 메소드 사용하기)

java.util.concurrent.ExecutorService을 활용해서 비동기 방식의 method를 정의 할 때마다, 위와 같이 Runnable의 run()을 재구현해야 하는 등 동일한 작업들의 반복이 잦았다. With @Async @Async Annotati

velog.io

    @Override
    @Async
    public void sendSimpleMessage(String to) throws CustomException, Exception {
        // TODO Auto-generated method stub
        String ePw = createKey();
        authCodes.put(to, ePw); // 이메일과 인증 코드를 Map에 저장
        authCodeExpirationTimes.put(to, LocalDateTime.now().plusMinutes(2)); // 2분 뒤에 만료되도록 현재 시간 + 2분을 저장
        MimeMessage message = createMessage(to,ePw);
        try {//예외처리

            emailSender.send(message);
        } catch (MailException es) {
            es.printStackTrace();

Async 사용할꺼다 이말이다 ~ 

@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling
@EnableAsync
public class Final8TeamProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(Final8TeamProjectApplication.class, args);
    }
}

 

그 결과

 

3.3s->25ms ! 99.25%감소

응답시간이 확실하게 빨라졌다

 

여기서 예외처리만 주의하게 해주면 된다..

 

만약 이것도 저것도 싫다면 프론트단에게 던지자...!

 

이메일이 안오면 다시요청...

Comments