비동기 함수

비동기 함수란 동기함수와는 다르게 호출시점에서 실행결과를 기다리지 않아도 되는 함수입니다.

  • 동기함수
    동기 함수의 경우 함수 호출 시 해당 함수 호출에 대한 결과가 나올 때 까지 동기 함수를 호출한 쓰레드의 동작이 사실상 중지하게 됩니다.
    이 때 사용자는 프로그램이 멈춘 것 같은 느낌을 받을 수 있습니다.

  • 비동기함수
    비동기 함수의 경우 비동기 함수를 호출한 쓰레드에서 해당 함수 호출에 대한 결과를 기다리지 않고 바로 다음 작업을 수행할 수 있습니다.
    이 때 로딩같은 작업을 수행하면 사용자에게 프로그램이 멈춘 것이 아닌 데이터를 로딩 혹은 저장 중이라는 경험을 제공할 수 있습니다.

닷넷3와 닷넷4 환경에서의 비동기 함수 호출방법

뒤끝이 제공하는 비동기함수는 닷넷3 환경과 닷넷4 환경에서의 사용방법이 다릅니다.

  • 닷넷3 환경에서는 기존 동기 함수에 콜백함수를 인자값으로 추가하면 비동기 방식으로 호출할 수 있습니다.
    여기에서 닷넷3 비동기 함수 호출방식에 대해 자세히 알 수 있습니다.
  • 닷넷4 환경에서는 호출할 함수와 해당 함수의 인자값 그리고 콜백함수를 BackendAsync라는 별도의 함수의 인자값으로 전달하면 비동기 방식으로 함수를 호출할 수 있습니다. 여기에서 닷넷4 비동기 함수 호출방식에 대해 자세히 알 수 있습니다.
  • 닷넷3 SDK 에서는 BackendAsync함수가 제공되지 않습니다.
닷넷4 환경에서 닷넷3 방식으로 비동기 함수 호출 시
  • 에디터 환경에서는 문제없이 동작합니다.
  • 안드로이드와 iOS환경에서 함수가 실행이 안되거나 혹은 비정상적인 동작을 할 수 있습니다.
  • 닷넷4 환경에서는 반드시 닷넷4 방식의 비동기함수를 사용해주세요.

뒤끝 비동기 함수 사용 시 주의사항

비동기 함수 호출 로직
    1. 서버에 요청을 보내고
    2. 서버에서 호출에 대한 응답을 하고
    3. 서버에 응답에 대해 개발자가 정의한 함수를 실행
    4. 함수 호출이 완료

비동기 함수를 호출할 때 아래와 같은 상황이면 비동기 함수가 수행되지 않고 statusCode : 408 / message : timeout error가 리턴될 수 있습니다.

  • 한번에 많은 요청을 보내면 위의 1번 단계에서 서버에 요청을 보내지 못하는 상황이 발생할 수 있습니다.
  • 함수 호출이 완료되지 않은 상태에서 계속 비동기 함수를 호출 할 경우에도 1번 단계에서 서버에 요청을 보내지 못하는 상황이 발생할 수 있습니다.
  • 비동기 함수 내부에서 비동기 함수를 연속적으로 호출하는 경우 1번 단계에서 서버에 요청을 보내지 못하는 상황이 발생할 수 있습니다.

비동기 함수를 호출할 때 아래와 같은 상황이면 비정상적인 결과 혹은 statusCode : 500 / message : Request failed with status code 400 에러가 발생할 수 있습니다.

  • 동일테이블에 동일 row의 동일 colum에 대해 update를 호출한 후 해당 update대한 결과가 오기 전에 다시 update 비동기 함수를 호출할 경우 에러가 발생할 수 있습니다.
  • rpg 게임같이 유저가 계속 아이템을 사용하고, 획득하는 과정에서 동일한 테이블의 동일한 colum을 반복적으로(매우 짧은 간격으로) update 비동기 함수를 호출할 경우 에러가 발생하고, 제일 먼저 보낸 요청만 처리되고, 뒤에 보낸 데이터가 처리되지 않아 유저가 데이터가 롤백된 것같은 경험을 할 수 있습니다. 해당 경우 아래 비동기 함수 큐 방식을 사용할 경우 개선이 가능하나, 근본적으로는 DB 구조 자체를 바꿔야 개선이 가능합니다. 해당 문서를 참고해주세요

클라이언트(SDK)에서 비동기 함수 호출 시 timeout이 발생하는 상황을 자주 겪는 개발사의 경우 비동기 함수 큐 방식을 활용해보세요.