1.01 ^ 365 = 37.78

뒤끝 비동기 함수와 C# Promise 사용하기 본문

프로그래밍/C#

뒤끝 비동기 함수와 C# Promise 사용하기

Youngchangoon 2022. 2. 16. 22:49

뒤끝에서 서버 API를 사용하는 방법

뒤끝에서 서버 API를 사용하는 방법은 총 3가지다.

  1. 동기호출
  2. 비동기호출
  3. SendQueue(비동기) 호출

난이도가 가장 쉽고 직관적인건 1번이지만 서버 값을 받아올 때까지 게임이 멈추기에 그렇게 좋은 방법은 아니다. 그렇다면 비동기호출을 해야하는데, 보낸 순서대로 순서를 보장 받을 수 있는 SendQueue방식의 호출을 게임을 개발하며 주로 사용했다.

Promise 패턴

Promise 패턴은 여러 비동기 함수들을 쉽게 관리할 수 있게 하는 패턴이다. Promise 객체는 처리에 대한 결과 상태를 반환하고, 작업의 종료시점을 알 수 있게 된다. Promise객체의 상태는 크게 3가지다.

  1. Pending - 작업이 완료되지 않은 상태.
  2. Resolved - 작업이 성공적으로 완료된 상태.
  3. Rejected - 작업 도중 에러가 나서 실패한 상태.

각 상태에 맞춰 작업을 처리하고, Promise끼리 연결을 통해 여러 비동기 작업들의 끝나는 시점들을 제어할 수 있다. 무엇보다 가장 큰 장점은 callback지옥 코드에서 벗어날 수 있고, 비동기들의 관리가 쉽다는 점이다.

뒤끝 비동기 호출(SendQueue) + Promise 패턴 사용

뒤끝에서 비동기를 호출하면서 Promise패턴을 사용하면 callback지옥에서 벗어날 수 있다. 비동기 호출이 완료될 때까지 promise상태를 pending으로 두었다가 정상적인 response를 받으면 resolve하게 한다. 뒤끝의 비동기 호출과 Promise를 사용하는 예제를 확인해보자.

// 로그인 서비스 예제
public class LoginService
{
	public IPromise GuestLogin()
	{
		var promise = new Promise();
		SendQueue.Enqueue(Backend.BMember.GuestLogin, "게스트 로그인", bro => 
        {
            if (bro.IsSuccess())
            {
                Debug.Log($"게스트 로그인 성공!");
                promise.Resolve();
            }
            else
            {
                Debug.Log($"게스트 로그인 실패!");
                promise.Reject(new Exception("게스트 로그인 실패"));
        });

		return promise;
	}
}

public class Main
{
    public LoginService loginService;

    public void OnPressedGuestLoginButton()
	{
		// 게스트 로그인을 시도후 완료되면 Then 함수를 호출
		loginService.GuestLogin().Then(() => 
		{
			// 로그인 완료 후 처리.
			// 이곳에 또 Promise를 만들어 연결 할 수 있다.
		});
	}
}