[swift] 아폴로 클라이언트의 동시성 제어 방법

아폴로 클라이언트는 GraphQL API와 통신하기 위한 클라이언트 라이브러리로, 서버와의 비동기 통신을 처리하는 데 주로 사용됩니다. 이때 동시성을 제어하고, 여러 요청을 동시에 처리하거나 순서를 지정할 수 있어야 합니다. 이번 블로그 포스트에서는 아폴로 클라이언트에서 동시성을 제어하는 방법에 대해 알아보겠습니다.

동시성과 인터셉터

아폴로 클라이언트는 Resolve, Validate, Fetch의 세 단계로 요청을 처리합니다. 이 세 단계에서 인터셉터를 사용하여 동시성을 제어할 수 있습니다. 인터셉터는 각 단계에서 요청 및 응답을 변경하거나 조작할 수 있는 기능을 제공합니다.

Resolve 인터셉터

Resolve 인터셉터는 쿼리나 뮤테이션 등의 작업을 서버에 전송하기 전에 호출됩니다. 이 단계에서는 요청 파라미터를 변경하는 등의 작업을 수행할 수 있습니다. 다음은 Resolve 인터셉터를 사용하는 예시입니다.

client.setResolveInterceptor { (request, chain) in
    // 요청 파라미터 변경
    request.variables = [
        "name": "Alice"
    ]
    // 체인에 다음 단계를 호출하여 요청 전송
    chain.proceedAsync(request: request)
}

Validate 인터셉터

Validate 인터셉터는 서버로부터 받은 응답을 확인하고, 오류가 있는 경우 처리하는 단계입니다. 다음은 Validate 인터셉터를 사용하는 예시입니다.

client.setValidateInterceptor { (response, chain) in
    if let errors = response.errors {
        // 오류가 있는 경우 처리
        print(errors)
    }
    // 체인에 다음 단계를 호출하여 계속 진행
    chain.proceedAsync(response: response)
}

Fetch 인터셉터

Fetch 인터셉터는 서버로부터 받은 응답을 처리하는 단계입니다. 응답을 받은 후에는 결과에 따라 적절한 처리를 수행할 수 있습니다. 다음은 Fetch 인터셉터를 사용하는 예시입니다.

client.setFetchInterceptor { (response, chain) in
    if let data = response.data {
        // 응답 데이터 처리
        print(data)
    }
    // 체인에 다음 단계를 호출하여 계속 진행
    chain.proceedAsync(response: response)
}

동시성 제어 예시

아폴로 클라이언트에서 동시성을 제어하기 위해 인터셉터를 사용하는 예시를 살펴보겠습니다. 아래 코드는 Resolve 인터셉터를 사용하여 동시에 여러 요청을 보내는 예시입니다.

client.setResolveInterceptor { (request, chain) in
    // 여러 요청 생성
    let request1 = GraphQLRequest(query: "query { user(id: 1) { name } }")
    let request2 = GraphQLRequest(query: "query { user(id: 2) { name } }")
    
    // 체인에 다음 단계를 호출하여 요청 전송
    chain.proceedAsync(request: request1)
    chain.proceedAsync(request: request2)
}

위의 예시에서는 Resolve 인터셉터에서 여러 개의 요청을 생성하고, 체인을 통해 동시에 전송하고 있습니다.

결론

아폴로 클라이언트의 인터셉터를 사용하여 동시성을 제어할 수 있습니다. Resolve, Validate, Fetch의 세 단계에서 인터셉터를 사용하여 요청과 응답을 조작하고, 동시에 여러 요청을 처리할 수 있습니다. 이를 통해 효율적인 API 통신을 구현할 수 있습니다.

참고 자료