[swift] 아폴로 서버와 클라이언트 간 데이터 통신 과정

아폴로(Apollo)는 GraphQL을 위한 완벽한 오픈 소스 플랫폼이며, 서버와 클라이언트 간에 데이터 통신을 단순화하고 개선하는 등 다양한 기능을 제공합니다. 이번 포스트에서는 아폴로 서버와 클라이언트 간의 데이터 통신 과정에 대해 알아보겠습니다.

1. 클라이언트에서 쿼리 작성

아폴로를 사용하는 클라이언트에서는 GraphQL 쿼리를 작성하여 서버에 데이터를 요청합니다. GraphQL 쿼리는 클라이언트가 원하는 데이터의 구조를 정의하는 역할을 합니다.

import Apollo

let graphQLQuery = gql"""
query GetUser($userId: ID!) {
  user(id: $userId) {
    id
    name
    email
  }
}
"""

let variables = ["userId": "1"]

let apollo = ApolloClient(url: URL(string: "https://example.com/graphql")!)

apollo.fetch(query: graphQLQuery, variables: variables) { result in
  switch result {
  case .success(let graphQLResult):
    // 데이터 응답을 처리하는 로직 추가
    let user = graphQLResult.data?.user
    print(user?.name)
  case .failure(let error):
    // 에러 처리 로직 추가
    print(error)
  }
}

위의 예제에서는 GetUser라는 쿼리를 작성하고, userId라는 변수로 유저를 조회하도록 설정하였습니다. graphqlQuery에는 작성한 쿼리 문자열을, variables에는 변수 값을 전달합니다. 이후 ApolloClient를 사용하여 서버로 쿼리를 보내고, 응답을 처리하는 로직을 작성합니다.

2. 서버에서 쿼리 처리

서버는 클라이언트로부터 전달받은 GraphQL 쿼리를 처리하여 데이터를 제공합니다. 아폴로 서버는 GraphQL API를 작성하고 해당 API로부터 데이터를 검색, 수정, 삭제할 수 있는 기능을 제공합니다.

import Apollo

let typeDefs = """
type User {
  id: ID!
  name: String!
  email: String!
}

type Query {
  user(id: ID!): User
}
"""

let resolvers = ...

let server = ApolloServer(typeDefs: typeDefs, resolvers: resolvers)

server.listen(port: 4000) { result in
  if let error = result {
    // 에러 처리 로직 추가
    print(error)
  }
}

위의 예제에서는 typeDefs 변수에 서버에서 사용할 타입들을 정의하였고, resolvers에는 각 필드에 대한 해결 함수를 작성합니다. 이후 ApolloServer를 사용하여 서버를 실행합니다.

3. 데이터 응답 처리

클라이언트는 서버로부터 받은 데이터를 처리하여 화면에 표시하거나 로직을 수행할 수 있습니다. 예를 들어, 유저 정보를 가져와서 화면에 출력하는 경우 다음과 같이 처리할 수 있습니다.

let user = graphQLResult.data?.user
print(user?.name)

위의 예제에서는 graphQLResult 객체로부터 user 필드를 추출하여 유저의 이름을 출력하는 간단한 로직입니다. 필요에 따라 데이터를 가공하거나 다른 로직을 수행할 수 있습니다.

이렇게 클라이언트와 서버 간 데이터 통신을 아폴로를 사용하여 간편하고 효율적으로 처리할 수 있습니다.

결론

아폴로를 사용하여 서버와 클라이언트 간의 데이터 통신 과정을 단순화하고 개선할 수 있습니다. 이를 통해 개발자는 좀 더 효율적으로 데이터를 요청하고 응답을 처리할 수 있습니다.

참고 자료: