
우리는 클라이언트 개발(Android, iOS, Web) 을 하면서 서버와 통신을 해야 할 때, 보통 서버가 구현해놓은 API 를 호출해 데이터를 보내거나 받아온다. 보통 앱에서 하나의 View 를 그리기 위해서는 여러 번 API 를 호출해야하고, 호출을 통해 받아온 데이터를 조합해 사용해야 한다. 예를 들어 여러번 REST API를 호출해 하나의 View 를 만들어내는 경우를 생각해보자. 앱의 페이지가 복잡해질수록 많은 호출을 해야하고 데이터 조합을 위해 순차적인 처리가 들어가야 하는 경우가 많아지기 때문에 데이터를 조합하는 것은 매우 복잡해진다.

이를 편하게하기 위해 데이터 흐름을 만들고 해당 흐름에 순차 처리 로직을 위한 로직을 넣는 방ㅎ식의 프로그래밍이 많이 사용되었다. 대표적인 것은 Rx 와 Coroutine 의 Flow 등이 있다. 하지만 flatmap 이나 map 등으로 데이터를 변환시키는 것은 결국 우리가 하나의 페이지를 그리기 위한 데이터를 조합하는 것을 클라이언트 단에서 처리해주어야 하기 때문에 클라이언트 단의 로직단의 로직이 복잡해지는 문제가 있다. 로직이 복잡해지는 것은 유지보수가 어려워진다는 뜻이다.
기존의 REST API 나 다른 API 호출 방식은 이 문제를 해결하지 못한다. 기존 API 에서는 사용자가 서버에서 정의한 데이터 구조만을 한번에 하나씩 가져올 수 있기 때문이다. 이를 해결하기 위해서는 앱 단에서 직접 뷰에 보여질 쿼리를 만들어 모든 데이터를 한 번에 가져와야 하기 때문이다.
GraphQL 은 클라이언트에서 자기에 필요한 데이터만을 쿼리할 수 있도록 하여 위의 문제를 매우 직관적이고 깔끔하게 해결한다. 이를 위해 GraphQL 은 클라이언트에서 사용할 Query Language 를 정의한다. 클라이언트가 자신에게 필요한 데이터에 대한 Query 를 선언해 GraphQL 에 넘기면 GraphQL 은 Query 를 해석해 서버에서 필요한 데이터를 가져온 후 클라이언트에 해당 쿼리에 대한 데이터를 반환한다.

예를 들어 id 에 따라 저자의 이름과 이메일을 가지고 오고 싶다면 다음과 같이 쿼리를 사용하면 된다.
query Author($id : Int) {
author(id: $id) {
name
email
}
}