스위프트 아폴로는 GraphQL의 클라이언트 라이브러리로서, 데이터 스키마를 통해 서버와 통신할 수 있는 강력한 도구입니다. 기본적으로 스위프트 아폴로는 GraphQL 스키마 정의 언어인 SDL(Schema Definition Language)를 사용하여 스키마를 정의합니다. 하지만 때때로 기본적인 스키마 정의만으로는 부족한 경우가 있을 수 있습니다. 이때는 스위프트 아폴로에서 제공하는 커스텀 스키마 정의 방법을 사용할 수 있습니다.
커스텀 스키마 정의 방법
스위프트 아폴로에서 커스텀 스키마를 정의하기 위해서는 세 가지 주요 요소를 사용해야 합니다.
- 스키마 정의 언어를 사용한 기본적인 스키마 정의
- 서버에서 사용할 모델 타입 정의
- 커스텀 코드를 사용한 스키마 확장
1. 스키마 정의 언어를 사용한 기본적인 스키마 정의
SDL을 사용하여 기본적인 스키마를 정의합니다. 이는 GraphQL 스키마와 동일한 방식으로 정의할 수 있습니다. 예를 들어, 다음과 같이 Query
와 Mutation
타입을 정의할 수 있습니다.
let sdl = """
type Query {
hello: String!
}
type Mutation {
updateName(name: String!): String!
}
"""
2. 서버에서 사용할 모델 타입 정의
스키마에서 사용할 데이터 모델을 정의합니다. 이는 스위프트에서 사용하는 일반적인 객체 형태로 정의할 수 있습니다. 예를 들어, 위의 스키마에서 사용되는 Query
와 Mutation
타입에 해당하는 모델을 정의할 수 있습니다.
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 통신을 구현할 수 있습니다.
참고: