[swift] 스위프트 아폴로에서의 커스텀 스키마 정의 방법

스위프트 아폴로는 GraphQL의 클라이언트 라이브러리로서, 데이터 스키마를 통해 서버와 통신할 수 있는 강력한 도구입니다. 기본적으로 스위프트 아폴로는 GraphQL 스키마 정의 언어인 SDL(Schema Definition Language)를 사용하여 스키마를 정의합니다. 하지만 때때로 기본적인 스키마 정의만으로는 부족한 경우가 있을 수 있습니다. 이때는 스위프트 아폴로에서 제공하는 커스텀 스키마 정의 방법을 사용할 수 있습니다.

커스텀 스키마 정의 방법

스위프트 아폴로에서 커스텀 스키마를 정의하기 위해서는 세 가지 주요 요소를 사용해야 합니다.

  1. 스키마 정의 언어를 사용한 기본적인 스키마 정의
  2. 서버에서 사용할 모델 타입 정의
  3. 커스텀 코드를 사용한 스키마 확장

1. 스키마 정의 언어를 사용한 기본적인 스키마 정의

SDL을 사용하여 기본적인 스키마를 정의합니다. 이는 GraphQL 스키마와 동일한 방식으로 정의할 수 있습니다. 예를 들어, 다음과 같이 QueryMutation 타입을 정의할 수 있습니다.

let sdl = """
    type Query {
        hello: String!
    }

    type Mutation {
        updateName(name: String!): String!
    }
"""

2. 서버에서 사용할 모델 타입 정의

스키마에서 사용할 데이터 모델을 정의합니다. 이는 스위프트에서 사용하는 일반적인 객체 형태로 정의할 수 있습니다. 예를 들어, 위의 스키마에서 사용되는 QueryMutation 타입에 해당하는 모델을 정의할 수 있습니다.

struct Query: Codable {
    let hello: String
}

struct Mutation: Codable {
    let updateName: String
}

3. 커스텀 코드를 사용한 스키마 확장

스위프트 아폴로에서는 SchemaExtension을 사용하여 스키마를 확장할 수 있습니다. 이는 기존 스키마에 추가적인 필드나 타입을 정의하는 데 사용됩니다. 예를 들어, 다음과 같이 User 타입을 추가하고 Query 타입에 해당 필드를 추가할 수 있습니다.

let userField = """
    user: User!
"""

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

let schemaExtension = """
    extend type Query {
        \(userField)
    }
    \(userStructure)
"""

커스텀 스키마 사용하기

위에서 정의한 커스텀 스키마와 모델을 사용하여 스위프트 아폴로를 초기화하고 데이터를 주고받을 수 있습니다.

let url = URL(string: "http://example.com/graphql")!
let transport = HTTPNetworkTransport(url: url)

let cache = InMemoryNormalizedCache()
let store = ApolloStore(cache: cache)

let apollo = ApolloClient(networkTransport: transport, store: store)

apollo.fetch(query: Query()) { result in
    switch result {
    case .success(let graphQLResult):
        // 처리할 작업
    case .failure(let error):
        // 에러 처리
    }
}

결론

스위프트 아폴로에서 커스텀 스키마를 정의하는 방법을 알아보았습니다. 기본 스키마 정의 외에도 SDL, 모델 타입, 그리고 커스텀 코드를 사용하여 스키마를 확장할 수 있습니다. 이를 통해 더욱 정교한 GraphQL 통신을 구현할 수 있습니다.

참고: