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

HAHA님의 프로필 이미지
HAHA

작성한 질문수

2시간으로 끝내는 코루틴

3강. 코루틴 빌더와 Job

async await 관련 질문

해결된 질문

작성

·

44

1

안녕하세요.

val job1 = async { apiCall1() }
val job2 = async { apiCall2(job1.await()) }
printWithThread(job1.await() + job2.await())

만약, job1에 대한 결과를 메인 코루틴과 job2 코루틴 각각에서 사용하고 싶으면 위와 같이 작성하면 되나요?
제가 실제로 apiCall1에 print문을 넣어 보니까 1번만 출력이 되는 것을 확인했습니다.

 

만약, 위에 질문이 맞다면 코루틴 job을 생성하고 해당 결과를 받을 때는 항상 await() 함수를 호출하면 되나요?
여기서 궁금한 점은 만약 서버와 통신하는 api라고 한다면, 새롭게 호출하고 싶을 때도 있을 텐데 이럴 때는 어떻게 기존 값이 아닌 새로운 값을 받을 수 있는지도 궁금합니다.

 

감사합니다.

 

 

답변 2

1

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 HANA님! 🙂 이번에는 인프런 AI 인턴이 둘 모두 맞는 얘기를 해줬군요~~

 

하나만 더 말씀드리자면, 서버와 통신하는 API를 코루틴을 사용해 작성하는 경우 보통은 non-blocking API를 사용하게 됩니다. 예를 들어 스프링 진영이라면, WebClient를 사용할 수 있겠죠!

 

그럼 보통

suspend fun callApiAndGetResult(): Result {
  return webClient.get()
    .blabla()
    .toResult() // 최종적으로 결과를 반환한다
}

위와 같은 suspend function을 만들어 결과 Result 를 반환하게 하고,

Result 를 여러번 호출해야 하는 경우는

val result1 = service.callApiAndGetResult().awaitBody() // async의 await과 유사합니다
val result2 = service.callApiAndGetResult().awaitBody()

처럼 해당 suspend function을 받아서 await() 하는 식으로 작성하게 될거에요! 🙂

 

강의 보시면서 또 궁금한 점 생기시면 편하게 질문 남겨주세요.

감사합니다! 🙏

0

안녕하세요, 인프런 AI 인턴입니다. HAHA님,

질문해 주신 내용을 바탕으로 코루틴과 async/await 관련된 답변을 준비했습니다.

질문을 간단히 요약하자면, async를 사용하여 코루틴을 생성하고, await()를 이용해 그 결과를 재사용하는 방법과 새롭게 호출하는 방법에 대해 궁금하신 것 같습니다.

코루틴 결과 재사용

코드에서 apiCall1의 결과를 두 번 사용하실 때:

val job1 = async { apiCall1() }
val job2 = async { apiCall2(job1.await()) }
printWithThread(job1.await() + job2.await())

코드에서 job1.await()을 두 번 호출해도 문제가 없습니다. await()는 해당 코루틴의 결과를 반환하기 때문에, 한번 계산된 결과를 재사용하는 것입니다. 따라서 apiCall1의 실제 실행은 한 번만 일어나고, 그 결과를 재사용합니다.

새롭게 호출하고 싶을 때

만약 매번 새로운 값을 받기 위해 새롭게 호출해야 할 경우, async를 새로 호출해 새로운 인스턴스를 만들어 주어야 합니다:

val job1 = async { apiCall1() }
val result1 = job1.await()

val job2 = async { apiCall2(result1) }
val result2 = job2.await()

// 나중에 같은 값을 다시 받고 싶지 않다면, 새로 호출
val newJob1 = async { apiCall1() }
val newResult1 = newJob1.await()

이렇게 하면 apiCall1을 여러 번 호출하여 매번 다른 결과를 받을 수 있습니다.

관련된 유사 질문

이 주제와 관련된 또 다른 질문들을 참고해 보시면 도움이 될 것입니다:

  1. 한 suspend fun 의 반환값이 다른 suspend fun의 파라미터로 쓰일 때
  2. delay 함수에 대해 질문이 있습니다
  3. Spring MVC 환경에서의 코루틴

이 답변들이 HAHA님께 더 깊이 있는 이해를 도와줄 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

HAHA님의 프로필 이미지
HAHA

작성한 질문수

질문하기