GraphQL Client Library가 필요한 이유
클라이언트에서 GraphQL을 사용하면 서버에서 원하는 데이터를 원하는 필드들만 가져올 수 있다는 장점이 있다. 하지만 클라이언트에서 GraphQL을 사용하기 위해서는 JSON 형태의 데이터를 다시 클라이언트에서 사용할 수 있는 객체로 바꾸기 위해 추가적인 작업을 해주어야 한다. 또한 클라이언트에서 GraphQL 쿼리를 작성하기 위해서 쿼리가 자동완성이 되지 않는다면 모든 필드를 일일히 찾아보고 작성해야 한다.
이러한 한계를 극복하기 위해 나온 것이 바로 GraphQL Client Library이다. GraphQL Client Library는 다양한 종류가 있으며 Kotlin 에서 사용 가능한 GraphQL Client Library의 목록은 아래 링크에서 확인할 수 있다.
GraphQL Client 라이브러리들 중 가장 대표적인 것이 Apollo GraphQL 이다.
Apollo GraphQL
Apollo GraphQL은 GraphQL Client 라이브러리들 중 가장 많이 사용되는 라이브러리 중 하나이다. 특히 View가 다중으로 존재하는 Android에서 GraphQL을 사용한다면 Apollo GraphQL은 필수적으로 사용된다.
Apollo GraphQL을 사용하는 대표적인 이점은 다음과 같다.
- 입력 자동 완성
- 응답을 담기 위한 클래스를 자동으로 생성(Auto Generate)
- Coroutines를 사용한 서버 요청
입력 자동 완성
Apollo GraphQL을 Android Studio나 Intellij에서 사용하면 자동완성이 지원된다. 기존에 GraphiQL과 같은 온라인 에디터를 써야 자동완성이 되었었는데, 이제는 안드로이드 스튜디오에서도 자동완성이 지원된다.
즉, QL(Query Language)용 편집기를 별도로 사용하지 않고도 IDE하나로 모든 작업을 할 수 있게 되었다. 사실상 이거 하나만으로도 Apollo GraphQL을 사용하기에 충분하다.
응답을 담기 위한 데이터 클래스를 자동으로 생성(Auto Generate)
Apollo GraphQL은 query나 mutation을 입력하면 해당 query나 mutation에 맞는 클래스를 Auto Generate 하며, Generate된 클래스는 우리가 쿼리를 날렸을 때 응답으로 리턴된다. 즉, query, mutation 입력 만으로 응답을 받기 위한 객체들을 모두 만들 수 있는 것이다. 기존 REST API를 사용하기 위해서는 retrofit을 사용하더라도 응답을 받기 위해 데이터 클래스를 일일히 만들어 매핑시켜줬어야 했는데 해당 부분이 모두 자동화되었다.
이로 인한 장점은 서버와 통신에서 문제가 생길 부분이 줄어든다는 점이며, 특히 코틀린 Class로 Auto Generate가 됨으로써 플랫폼 타입으로 인해 문제 생길 부분 또한 줄었다는 점이다.
*플랫폼 타입 : nullability를 알 수 없는 타입
Coroutines를 사용한 서버 요청
서버로의 요청은 응답을 받기 전까지 Thread를 Blocking 시킬 수 있기 때문에 Main Thread에서 진행하면 된되고 IO Thread에서 진행되어야 한다. Apollo GraphQL은 자체 클라이언트의 요청을 위해 내부적으로 suspend fun을 사용하고 있기 때문에 경량 스레드 모델인 Coroutines를 사용하도록 강제하여 Thread를 블로킹 시키지 않도록 한다.
lifecycleScope.launch(Dispatchers.IO) {
val result = apolloClient.query(RepositoryOwnerQuery("DevCho", "GraphQL")).execute()
val repositoryOwnerId = result.data?.repository?.owner?.id
}
또한 Coroutines 를 사용해 동시성 프로그래밍을 위한 처리가 매우 간편해진다.
정리
위의 장점 3가지 각각이 매우 큰 장점이다. 따라서 Android에서 GraphQL을 사용하려면 Apollo GraphQL을 사용하는 것이 좋다.
다음 글에서는 Android에서 Apollo GraphQL을 사용하기 위한 방법에 대해 알아보도록 하겠다.