Smtp 메일 보내기 API 타임아웃 문제, 비동기로 해결하자-(1)

Alex·2025년 3월 1일
0

Plaything

목록 보기
115/118

Smtp로 문의하기 기능을 개발했는데
스웨거에서 보낼 때는 문제가 없었지만
클라이언트에서 요청을 보낼 때는 위처럼 timeout이 떴다.

클라이언트 개발자분이 타임아웃 시간을 3초로 설정해두기도 했고
Smtp가 요청을 보내면 끝날 때까지 시간이 좀 걸렸다.

실제로 포스트맨으로 요청을 보내면 4.16s나 시간이 걸린다.

그런데, 사실 이건 get이 아닌 post요청이고, 요청에 따른 리소스를 받는 api가 아니다. 그러므로 응답을 기다릴 필요가 없다.

비동기를 활용하자

@Async를 활용하면, 메인 스레드에서 별도의 스레드를 따로 만들게 되고
요청이 끝날 때까지 기존 스레드가 대기를 하지 않아도 된다.

이렇게 @EnableAsync를 메인 클래스에 붙여주고
비동기를 활용할 메서드에 @Async 어노테이션만 붙여주면 된다.

By default, Spring uses a SimpleAsyncTaskExecutor to actually run these methods asynchronously. However, we can override the defaults at two levels: the application level or the individual method level.

스프링의 기본 설정에서는 SimpleAsyncTaskExecutor을 사용해서 비동기를 구현한다.

그래서, 스레드 풀을 사용하지 않는 방식이라서 처리 시간이 짧은 작업을 많이 할 때는 thread-pooling TaskExecutor를 오버라이드해주는 게 좋다고 한다.

문의하기 기능자체가 그렇게 트래픽이 많지 않아서 TaskExecutor를 따로 만들어주는 게 좋을까? 싶었다.

스택오버플로우에서

This depends on your context. If you've defined TaskExecutor (and provided its defaults somewhere else) - it will take it. So default is up to you. If its not resolved, SimpleAsyncTaskExecutor fires up a new Thread for each task (as appears in its documentation again). This is pretty wasteful so probably you don't really want to use SimpleAsyncTaskExecutor....

스레드를 매번 새로 만드는 것은 상당한 낭비가 발생하는 일이기 때문에, TaskExecutor를 만드는 게 낫다는 말이다

이제 포스트맨을 보면 54ms만에 200코드가 오는 걸 볼 수 있다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글