<aside> 🤓 비동기 처리가 필요한 부분과 그렇지 않은 부분 구분
이메일 발송(메일 소유 여부 확인) - 비동기 처리 필요
사용자에게 인증 메일을 보내는 부분(메일 소유 여부 확인 부분)은 비동기 처리가 유용하다.사용자가 회원가입을 마치고 인증 메일을 받기까지 대기하 않아도 되므로 사용자 경험을 향상시키는 데 도움이된다.
만약 동기적으로 인증 메일을 기다려야 했다면, 사용자는 그 시간 동안 화면을 기다리거나 아무 작업을 할 수 없는 상태가 된다.
대부분의 사용자들은 빠른 작업 완료와 자유로운 이동이 가능한 사용자 경험을 선호하기 때문에, 대기 시간을 최소화하고 다른 활동을 할 수 있는 것은 사용자에게 긍정적인 경험을 줄 수 있습니다.
인증 코드 확인 - 비동기 처리가 필요하지 않음
사용자가 이메일을 확인하고 코드를 입력하는 부분은 사용자와의 상호작용이 필요한 부분이다. 사용자가 코드를 확인하고 입력하는 시점에 API 엔드포인트에 요청을 보내야 하므로, 비동기 처리는 필요하지 않다.
⇒ 이렇게 함으로써 회원가입 요청과 이메일 발송이 동시에 이루어질 수 있으며, 사용자가 대기하지 않고 회원가입 절차를 진행할 수 있다. 사용자가 이메일을 확인하고 코드를 입력하는 부분은 인증 이메일을 받은 후에 사용자가 별도의 액션을 취해야 하므로, 이 부분은 비동기 처리를 하지 않고 사용자와의 상호작용이 필요한 부분으로 남겨두는 것이 좋다.
</aside>
성능 개선
동기적인 처리는 해당 작업이 완료될 때까지 대기해야 하므로 요청 당 시간이 더 걸릴 수 있습니다. 반면에 비동기 처리는 작업을 백그라운드에서 수행하므로 다음 단계로 진행되는 동안에도 작업을 계속할 수 있습니다. 이로 인해 전체적인 처리 시간을 단축시킬 수 있습니다.
서버 리소스 관리
동기 처리는 동시에 많은 요청이 들어왔을 때 대기열이 형성되어 서버 리소스를 많이 소비할 수 있습니다. 비동기 처리는 백그라운드에서 작업을 수행하기 때문에 이러한 리소스 관리에 도움이 됩니다.
유연성과 확장성
시스템 안정성
비동기 처리를 통해 작업을 백그라운드에서 수행하면 필요에 따라 시스템을 확장하거나 유연하게 수정할 수 있는 여지를 제공합니다. 또한, 서비스의 요구사항이 변경되더라도 동기 처리로 인한 복잡성을 줄일 수 있습니다.
비동기 처리를 사용하면 작업을 별도의 스레드에서 수행하므로, 한 개의 작업이 실패하더라도 전체 시스템에 큰 영향을 미치지 않습니다. 이로 인해 시스템의 안정성이 향상될 수 있습니다.
비동기적으로 이메일을 보내는 것은 사용자가 회원가입 절차를 마치기 전까지 대기하지 않아도 된다는 장점이 있습니다. 이는 사용자가 회원가입 프로세스를 완료하고 다른 작업을 수행하거나 페이지를 이동하는 등의 활동을 할 수 있다는 것을 의미합니다.
사용자 경험을 향상시킨다
사용자가 인증 메일을 받아야 하는 것은 맞지만, 이메일을 받는 시간 동안 사용자는 다른 일을 할 수 있습니다. 만약 동기적으로 인증 메일을 기다려야 했다면, 사용자는 그 시간 동안 화면을 기다리거나 아무 작업을 할 수 없는 상태가 되겠죠.
따라서, 이메일을 비동기적으로 보내면 사용자는 인증 메일이 오기를 기다리는 동안 다른 활동을 할 수 있습니다. 사용자 경험이 더 나아지는 이유는 바로 이것입니다. 대부분의 사용자들은 빠른 작업 완료와 자유로운 이동이 가능한 사용자 경험을 선호하기 때문에, 대기 시간을 최소화하고 다른 활동을 할 수 있는 것은 사용자에게 긍정적인 경험을 줄 수 있습니다.
사용자가 회원가입 프로세스를 마친 후에 이메일을 확인하고 코드를 입력해야 하는 절차는 비동기적인 이메일 전송과는 별개로 사용자가 직접 인증을 완료해야 하는 과정입니다. 이 부분은 사용자가 직접 참여해야 하므로 비동기 처리가 필요하지 않습니다.
<aside> 👩💻 요약하자면, 비동기 처리는 성능 개선과 사용자 경험 향상을 가져다주며, 서버 리소스 관리와 시스템의 유연성 및 안정성을 향상시키는 데 도움을 줍니다. 따라서, 대부분의 상황에서 인증 메일과 같은 백그라운드 작업을 비동기적으로 처리하는 것이 권장됩니다.
</aside>
이 메서드는 @Async 어노테이션으로 인해 비동기적으로 실행되며, 해당 요청을 처리하는 쓰레드와 별도의 쓰레드에서 실행됩니다.
이렇게 함으로써 멀티 쓰레드와 비동기 방식을 조합하여 스프링 애플리케이션에서 동시에 여러 작업을 처리할 수 있습니다. 요청은 동기적으로 처리되지만, @Async를 사용하여 내부적으로 비동기적으로 실행되는 작업을 별도의 쓰레드에서 처리할 수 있습니다.