GraphQL은 페이스북에서 만든 쿼리 언어로 기본적으로 어플리케이션의 API를 구현할 때
RestAPI가 사용되는데 RestAPI는 클라이언트에서 기능이 필요할때마다 새로운 API를 만들어야한다.
데이터의 구조가 변경될 때 마다 API 엔드포인트를 변경해야된다는 불편함도 있다.
예를 들면, RESTful API에서 사용자 정보를 반환하는 엔드포인트
Get /users고 가정하고 나중에 사용자 정보에 "핸드폰 번호" 필드를 추가 해야 된다면, 엔드포인트도 변경해야한다.
"accounts": [
{
"id": 1,
"name": "park",
"email": "park@example.com",
"phone": "010-1234-1234"
},
{
"id": 2,
"name": "jay",
"email": "jay@example.com",
"phone": "010-5678-5678"
}
]
모든 사용자 정보에 핸드폰 번호 필드를 추가해야되고 이를 위해서 서버 측 코드를 수정하고,
클라이언트도 변경된 데이터 구조에 맞게 코드를 수정해야 한다.
서버측에서는 데이터베이스 스키마를 변경하고, API엔드포인트의 라우팅 및 컨트롤러 로직을 수정해야 한다.
GraphQL를 사용하여 핸드폰 필드를 추가한다고 하면, GraphQL 서버의 스키마 파일에서 해당 필드를 추가하면 된다.
클라이언트에서는 해당 필드가 존재하는지 여부에 따라 쿼리를 수정할 수 있으며, 필요한 필드만 요청하면 된다.
query{
users {
id
name
}
}
위 쿼리는 users필드에 id와 name필드만 요청하고 있다.
만약 이 쿼리에 핸드폰 번호 필드를 추가하려면 아래와 같이 수정하면 된다.
query {
users {
id
name
phone
}
}
이러한 방식으로 필요한 필드만 서버에서 가져오기 때문에, 데이터 전송량과 요청/응답 시간을 줄일 수 있다.
GraphQL의 스키마는 언어에 독립적이기때문에 다양한 프로그래밍 언어에서 동일한 형태로 작성이 가능하다. GraphQL API를 사용하는 클라이언트와 서버가 서로 다른 언어로 작성되어 있을 때도 서로 상호 작용할 수 있다.
GraphQL에서도 데이터의 구조가 변경될 때 스키마 파일을 수정해야하는데
이때는 API 버전 관리와 같은 방법을 사용해서 문제를 해결할 수 있다.
클라이언트에서는 요청할 때 버전 정보를 명시하여 어떤 버전의 API를 사용할 것인지 결졍할 수 있다. HTTP Header에 버전 정보를 명시하여 어떤 버전의 API를 사용할 것인지 결정한다.
Accept-Version헤더를 사용한다. 생략 시 가장 최근 버전의 스키마를 사용하여 요청한다.
하지만 스키마 변경사항이 있을 경우 오류가 발생할 수 있으므로, 항상 버전 정보를 명시하는 것이 좋다.
API의 변경 사항을 버전 단위로 관리하는 방식
즉, API가 변경될 때마다 새로운 버전을 생성하고 클라이언트와 서버에서 사용할 버전을 명시하는것이다.
버전별로 스키마 파일을 따로 작성하고, 버전별로 GraphQL 서버를 띄어서 사용한다.