외부에서 코루틴(Coroutine) 환경으로 구성된 우리 api를 호출하면, 의도적으로 지연을 주고 싶었다.
@PostMapping("/data")
suspend fun getData(@RequestBody requestContext: RequestContext): ResponseEntity<Response> {
val response: Response = getSomething(requestContext.domain)
if (somthing is true) {
Thread.sleep(3000)
}
return ok(response)
}
이랬는데 IntelliJ에서 warning을 내뿜었다.
sleep을 걸 경우 thread starvation이 발생할 수 있는 상황. Blocking element를 사용해서는 안 된다.
하지만 IntelliJ의 가이드대로 withContext를 사용할 필요까지는 없다는 생각이 들어서 찾아보았다.
코루틴 컨텍스트에서 비동기적으로 지연을 주려면 delay를 사용하자.
@PostMapping("/data")
suspend fun getData(@RequestBody requestContext: RequestContext): ResponseEntity<Response> {
val response: Response = getSomething(requestContext.domain)
if (somthing is true) {
delay(3000)
}
return ok(response)
}
warning이 사라졌다. 깔끔!
'Programming Language > Kotlin' 카테고리의 다른 글
assertj > 에러 메시지의 일부만 맞아도 테스트 통과 (0) | 2024.07.15 |
---|---|
return when - unreachable code (0) | 2023.10.29 |