강의

멘토링

커뮤니티

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

kbm0598님의 프로필 이미지
kbm0598

작성한 질문수

Spring MVC에서 Dispatchers.IO에 관한 고찰

작성

·

6

0

안녕하세요~

현재 회사에서 아래 기술 스택을 사용한 API 서버가 존재합니다.

  • Spring Boot 3

  • Kotlin

  • JPA(JDBC)

  • WebClient

예를 들면 아래와 같이 구성되어 있고,

@RestController
class SampleController(
    private val service: SampleService
) {

    @GetMapping("/sample")
    suspend fun start() {
        service.withoutDispatchers()
    }

}

@Component
class SampleClient {

    private val webClient: WebClient by lazy {
        WebClient.builder()
            .baseUrl("https://api.com")
            .build()
    }

    suspend fun fetch(): Int {
        return webClient.get()
            .uri { uriBuilder ->
                uriBuilder.path("/number").build()
            }
            .retrieve()
            .awaitBody()
    }

}

interface SampleRepository : JpaRepository<SampleEntity, Long>
@Service
class SampleService(
    private val client: SampleClient,
    private val repository: SampleRepository,
) {

    suspend fun withoutDispatchers(): Int = coroutineScope {
        // non-blocking
        val deferred: Deferred<Int> = async {
            client.fetch()
        }

        // blocking
        val entity: List<SampleEntity> = repository.findAll()

        deferred.await() + entity.size
    }

}


Controller에서부터 suspend function으로 시작되면 Dispatchers.Unconfined로 API 요청에 의해 할당받은 Tomcat 스레드를 그대로 사용하는 것으로 알고 있습니다.

 

이후 Service 레이어에서 suspend function이 동일하게 Dispatchers.Unconfined를 유지하기 때문에 Tomcat 스레드는 그대로 사용되며, async이 사용된 WebClient 요청에서 Dispatchers.IO를 생략하고 요청하여, 코루틴의 재개 시 동일한 Tomcat 스레드가 처리하게 하는 것이 더 효율적이지 않을까? 하는 생각이 들었습니다.


Dispatchers.IO를 사용하면 Tomcat 스레드와 별개로 Dispatchers.IO 스레드 풀(기본 64개)에서 스레드 풀을 가져와 사용하는 것으로 알고 있습니다.
이것은 1번의 요청에서 Tomcat 스레드 1개 + Dispatchers.IO 스레드 1개 = 총 2개가 사용되어 컴퓨팅 자원의 낭비가 된다고 느꼈습니다.

혹시 WebClient의 비동기 요청이 처리되는 Event Loop가 요청했던 스레드의 Blocking 시 문제가 발생하기 때문에 병렬성을 위해서는 다른 스레드에서 처리해야 하는걸까요?

 

제가 혹시 잘못 알고 있는 부분이 있거나 Dispatchers.IO를 생략하지 못 하는 이유에 대해 설명해주시면 감사하겠습니다!

답변

답변을 기다리고 있는 질문이에요
첫번째 답변을 남겨보세요!
kbm0598님의 프로필 이미지
kbm0598

작성한 질문수

질문하기