강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

EunKyung Hwang님의 프로필 이미지
EunKyung Hwang

작성한 질문수

백엔드 개발자 성능 개선 초석 다지기

면접대비하기

비동기 스레드풀 분리 이유와 Virtual Thread 전환 시 고려사항

작성

·

16

0

안녕하세요! 좋은 강의 잘 듣고 있습니다.

CompletableFuture.runAsync()에 커스텀 Executor를 따로 넘기는 코드를 보면서 궁금한 점이 생겼습니다.

동기 방식은 어차피 요청 스레드에서 직접 처리되니까 별도 스레드풀 설정이 의미 없는 거라 비동기에서만 설정하는 건가요? 아니면 동기에서도 풀을 따로 구성하는 케이스가 있는지 궁금합니다.

그리고 Java 21부터는 Executors.newVirtualThreadPerTaskExecutor()가 기존 플랫폼 스레드풀을 대체하는 권장 방식인지도 여쭤보고 싶습니다. Virtual Thread는 풀링 없이 매 작업마다 새로 생성하는 방식이라고 이해했는데, 실무에서 전환할 때 주의할 포인트가 있다면 함께 말씀해 주시면 감사하겠습니다!

퀴즈

46%나 틀려요. 한번 도전해보세요!

동기 방식과 비동기 방식의 가장 큰 차이는 무엇일까요?

처리 속도 차이

작업 완료 대기 여부

필요한 스레드 수

예외 처리 방식

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
EunKyung Hwang님, 질문 주셔서 감사합니다!

  1. 비동기에서의 스레드풀 구성: 일반적으로 비동기 작업은 비동기적으로 실행될 수 있는 독립된 스레드가 필요하기 때문에 별도의 스레드풀 구성이 중요합니다. 동기 방식은 요청 스레드에서 처리되므로, 별도의 스레드풀을 사용하는 것이 필요하지 않습니다. 다만, 특정한 경우에는 동기 작업도 스레드풀을 활용하여 처리해야 할 경우도 있을 수 있지만 이는 비동기만큼 일반적인 경우는 아닙니다.

  2. Java 21의 Virtual Thread와 전환 주의 사항: Java 21에서 소개된 Executors.newVirtualThreadPerTaskExecutor()는 플랫폼의 스레드풀을 대체할 수 있는 권장 방식으로 소개되고 있습니다. Virtual Thread는 작업마다 새로 생성되며, 이는 JVM에서 관리되기 때문에 메모리 사용량과 컨텍스트 스위칭의 부담을 줄일 수 있습니다. 실무에서 전환할 때 주의해야 할 점으로는, 플랫폼 스레드에 비해 Virtual Thread가 모든 상황에서 적합하지 않을 수도 있다는 점입니다. 특히 I/O 작업이 많은 경우 결과가 달라질 수 있으므로 성능을 잘 테스트하고 모니터링하는 것이 중요합니다.

추가적으로 스레드풀 등을 구성할 때의 참고가 될 수 있는 문서 링크도 아래와 같이 첨부합니다:
- Spring’s asynchronous method running capability

감사합니다. 추가 질문이 있으시면 언제든지 말씀해 주세요!

EunKyung Hwang님의 프로필 이미지
EunKyung Hwang

작성한 질문수

질문하기