관리 메뉴

피터의 개발이야기

[Kotlin] Kotlin Spring에서 API 요청 시 응답 후 비동기 처리, 코루틴 비동기처리 본문

Programming/Kotlin

[Kotlin] Kotlin Spring에서 API 요청 시 응답 후 비동기 처리, 코루틴 비동기처리

기록하는 백앤드개발자 2024. 7. 23. 10:10
반응형

ㅁ 들어가며

ㅇ Kotlin Spring에서 API 요청에 대해 즉시 성공 응답을 반환하고, 비동기로 특정 작업을 실행하는 코드를 작성해았다.

ㅇ @Async 대신 Kotlin의 코루틴을 사용하여 비동기 처리를 구현하였다.

 

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController

@RestController
class AsyncTaskController(private val asyncTaskService: AsyncTaskService) {

    @PostMapping("/api/task")
    fun startTask(@RequestBody request: TaskRequest): ResponseEntity<TaskResponse> {
        // 요청 받은 작업을 비동기로 실행
        CoroutineScope(Dispatchers.Default).launch {
            asyncTaskService.performLongRunningTask(request)
        }

        // 즉시 성공 응답 반환
        return ResponseEntity.ok(TaskResponse("Task started successfully"))
    }
}

class TaskRequest(val taskId: String, val taskData: String)

class TaskResponse(val message: String)

class AsyncTaskService {
    suspend fun performLongRunningTask(request: TaskRequest) {
        // 여기에 시간이 오래 걸리는 작업을 구현
        println("Starting long running task: ${request.taskId}")
        // 예: 대용량 파일 처리, 외부 API 호출 등
        kotlinx.coroutines.delay(5000) // 5초 대기 (예시)
        println("Completed long running task: ${request.taskId}")
    }
}

ㅇ CoroutineScope(Dispatchers.Default).launch를 사용하여 비동기 작업을 시작한다.
  ㄴ 관련 정리 [kotlin] 코틀린 코루틴의 정석- CoroutineDispatcher
ㅇ Dispatchers.Default 
  ㄴ 대용량데이터를 처리하기 위해 CPU 사용량에 맞추어진 스레드풀이다.
  ㄴ 입출력작업과 CPU바운드작업

ㅇ 컨트롤러는 작업 시작 후 즉시 성공 응답을 반환하여 클라이언트는 오래 기다리지 않고 응답을 받을 수 있다.

ㅇ AsyncTaskService의 performLongRunningTask 메서드는 suspend 함수로 선언되어 있어, 코루틴 내에서 실행된다.
ㅇ 실제 긴 작업은 performLongRunningTask 메서드 내에서 구현한다.

ㅇ 여기서는 예시로 5초 대기하는 코드를 넣었다.

ㅁ 주의점

ㅇ 비동기로 실행되는 작업의 결과나 상태를 클라이언트에게 알려주려면 추가적인 메커니즘이 필요할 수 있다.
ㅇ 대량의 요청이 들어올 경우 리소스 관리에 주의해야 한다.

반응형
Comments