비동기 방식은 무조건 좋은것인지?
비동기 방식을 사용하면서 고려한 부분은?
예외처리는 어떻게 하였는지? / 비동기 처리시 실패한 케이스에 대한 시나리오는?
왜 기본 common pool이 아닌 별도에 thread pool 설정을 하였는지?
Executor
**를 지정하지 않고 CompletableFuture
API를 통해 제출된 모든 작업에서 사용되는 공유 풀입니다. 이러한 격리 부족은 예측할 수 없는 동작 및 잠재적인 리소스 경쟁으로 이어질 수 있습니다.Thread pool을 따로 설정하였다면 스래드 갯수는 무슨 기준으로 한 것인지?
프로세서 수
Runtime.getRuntime().availableProcessors()
**를 사용하여 사용 가능한 프로세서 수를 얻을 수 있습니다.int processors = Runtime.getRuntime().availableProcessors();
작업의 성격
메모리 사용
컨텍스트 전환 비용
작업하신 발송 관련 기능은 그렇다면 CPU 바운드 I/O 바운드중에 어디에 해당하는지?
외부 API 호출
, 데이터베이스 쿼리, 파일 시스템 액세스 등과 같이 대기 시간이 발생하는 작업은 I/O 바운드 작업일 가능성이 높습니다.일반적으로 네트워크 호출은 I/O 바운드 작업으로 간주됩니다. 외부 API 호출은 해당 API 응답을 기다리는 동안 대기 상태에 있기 때문입니다. 따라서, 외부 API 호출이 주된 작업이라면 해당 부분은 I/O 바운드로 판단할 수 있습니다.
그러나 세밀한 판단을 위해서는 애플리케이션의 동작을 프로파일링하거나 성능 분석 도구를 사용하여 CPU 및 I/O 사용률을 모니터링하는 것이 좋습니다. 이러한 도구를 사용하면 어떤 종류의 작업이 시스템 자원을 어떻게 사용하는지에 대한 통계를 확인할 수 있으며, 이를 기반으로 작업이 CPU 바운드인지 I/O 바운드인지 더 정확하게 결정할 수 있습니다.
이메일 발송에 Executors.newFixedThreadPool
, Executors.newCachedThreadPool
, 또는 Executors.newScheduledThreadPool
중 어떤 것을 선택할지는 상황과 요구사항에 따라 다릅니다.
ScheduledExecutorService
**를 이용하여 작업을 일정 시간마다 또는 특정 시간에 실행할 수 있습니다.추천:
일반적으로 이메일 발송은 비교적 무거운 I/O 작업이므로 **newCachedThreadPool
**이나 newFixedThreadPool
중 하나를 선택하는 것이 좋습니다. 둘 다 적절한 사용 사례가 있으며, 발송되는 이메일의 양과 특성에 따라 선택할 수 있습니다.
만약 이메일 발송뿐만 아니라 예약된 작업이나 주기적인 작업도 필요하다면 **newScheduledThreadPool
**을 고려할 수 있습니다.