Ktor와 Exposed를 함께 사용하여 비동기 데이터베이스 작업을 처리할 때, 다음과 같은 두 가지 접근 방식을 고려할 수 있다.
newSuspendedTransaction
private suspend fun <T> query(block: () -> T): T =
newSuspendedTransaction(Dispatchers.IO) { block() }
이 방식은 Exposed 라이브러리에서 제공하는 newSuspendedTransaction 함수를 사용한다. 이 함수는 코루틴을 지원하는 트랜잭션을 시작하며, 내부적으로 withContext(Dispatchers.IO)를 사용하여 I/O 디스패처에서 코드를 실행한다.
Exposed의 내장 함수를 사용하므로 코드가 간결하고 명확하다.
I/O 디스패처에서 자동으로 실행되므로 별도의 디스패처 설정이 필요 없다.
private suspend fun <T> query(block: () -> T): T =
withContext(Dispatchers.IO) { transaction { block() } }
이 방식은 Kotlin 코루틴의 withContext 함수와 Exposed의 transaction 함수를 조합하여 사용한다.
withContext를 사용하면 다른 디스패처로 쉽게 전환할 수 있다.
Exposed의 일반 transaction 함수를 사용하므로, 코루틴 지원이 필요하지 않은 다른 코드와의 호환성이 높다.