GraphQL : 페이스북에서 만든 쿼리 언어, Graph + Query +Languagae 의 줄임말.
Server API 를 통해 정보를 주고받기 위해 사용하는 API를 위한 쿼리언어
*쿼리언어(QL): 쿼리를 보내 데이터베이스 및 정보 시스템에 정보를 요청하고, 검색하는 프로그래밍 언어.
그래프는 여러 개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조.
그래프가 우리의 뇌 구조 및 언어적인 설명과 비슷하기 때문에 많은 현상들을 모델링할 수 있다.
하나의 점을 그래프에서 Node 혹은 정점 이라고 표현하고, 하나의 선은 edge 혹은 간선이라고 표현한다.
직접적인 관계는 점사이에 선이 간접적인 관계는 몇 개의 점과 선에 의해 연결된다.
트리도 그래프 안에 속해있는 개념이다. 누구의 입장에서 정렬하느냐에 따라 트리구조가 될 수 있다.
-> GraphQL은 클라이언트 요청에 따라 유연하게 트리 구조의 JSON 데이터를 응답으로 전송할 수 있다.
REST API 방식의 고정된 자원이 아닌, 요청에 따른 유연한 자원이라는 점에서 이점이 있다.
GraphQL로 그래프 순회
하나의 도서 목록에는 많은 책과 저자가 있을 것 이고, 각각의 책에는 최소 한 명의 저자가 있다. (공동저자가 있을 수 있음)
설명한 관계를 그래프 형태로 시각화 한 것이다. 그래프로 표현하면 우리가 가진 데이터의 조각과,
나타내고자 하는 엔티티(책, 저자)간의 관계를 나타낼 수 있다.
>> 그래프로 그릴 수 있다면, GraphQL 을 통해 트리를 추출할 수 있게 된다.
* 트리는 방향성이 존재하나 사이클은 존재하지 않는 비순환 그래프이다. 루트와 선을 통해 노드를 따라 순회가 가능하지만 동일한 노드로 돌아올 수는 없다.
그래프에서 트리 추출하기
// 한 권의 책을 검색하기 위해 서버에 요청 보내기
query{
책(ISBN "12935793"){
책 이름
저자{
이름
}
}
}
// 요청에 응답된 쿼리
{
책:{
책 이름:"GraphQ은 어렵지 않다",
저자:[
{이름 : "김코딩"},
{이름 : "박해커"}
]
}
}
이것을 그래프의 관점으로 본다면 위의 그래프와 같은 모습이 되는 것.
그리고 이것을 다시 트리 구조로 표현하면,
이렇게, 중첩된 필드를 계층 구조로 표현하여 트리구조로 표현할 수 있다.
즉, GraphQL은 트리 구조로 쿼리 결과를 받기 위해 그래프를 탐색하는 쿼리 언어라고 볼 수 있다.
GraphQL의 특징
HTTP를 통해 API 서버로 요청을 보내고 응답을 받는다.
응답을 받을 시, 데이터 결과를 JSON 형식으로 받는다.
서버 개발자가 작성한 각 필드에 대응하는 resolver 함수로 각 필드의 데이터를 조회할 수 있다.
GraphQL 라이브러리가 조회 대상 스키마가 유효한지 검사한다.