[GraphQL]GraphQL
페이스북에서 개발, 오픈 소스로 제공된 쿼리 언어
Graph + Query Language 줄임말. Query Language 중 Server API 를 통해 정보를 주고받기 위해 사용하는 Query Language.
즉, API를 위한 쿼리 언어
필요성
그래프로 생각하기에서부터 출발
그래프는 현실 세계의 많은 현상들을 모델링할 수 있는 강력한 도구
그래프 자료구조는 우리가 특정 개념을 학습하고 이를 다른 개념과 연관시킬 때 자연스럽게 사용하는 마인드맵 구조와 비슷
그래프는 여러 개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조
점을 Node또는 정점(vertex), 선을 간선(edge)
- 직접적인 관계 - 두 점 사이의 선
- 간접적인 관계 - 몇 개의 점과 선에 걸쳐 이어짐
각 노드간의 간선을 통해 특정한 순서에 따라 그래프를 재귀적 탐색 가능
GraphQL에서는 모든 데이터가 그래프 형태로 연결되어 있다고 전제. 일대일로 연결된 관계도, 여러 계층으로 이루어진 관계도 모두 그래프. 단지 그 그래프를 누구의 입장에서 정렬하는지(클라이언트가 어떤 데이터를 필요로 하느냐)에 따라 트리 구조를 이룰 수 있음
따라서, GraphQL은 클라이언트 요청에 따라 유연하게 트리 구조의 JSON 데이터를 응답으로 전송 가능
GraphQL은 REST API 방식의 고정된 자원이 아닌 클라이언트 요청에 따라 유연하게 자원을 가져 올 수 있음
GraphQL로 그래프 순회
그래프는 데이터의 조각들이나 나타내고자 하는 엔티티(책, 혹은 저자)간의 관계를 나타낼 수 있음
- 엔티티란
- 사물의 구조나 상태, 동작 등을 모델로 표현하는 경우, 그 모델의 구성요소
- 위에서는 책이름, 이름
- 이 속성은 그 자체만으로는 중요한 의미를 표현하지 못하기 때문에 단독으로 존재 불가
위 그래프는 비순환 그래프(루트와 모서리를 통해 노드를 따라 순회할 수 있으나 동일한 노드로 돌아올 수 없는 속성을 갖고 있는 특별한 그래프)
그래프에서 트리 추출하는 방법
query {
책(ISBN이 "9780674430006") {
책 이름
저자 {
이름
}
}
}
서버에 요청을 보내고, 서버가 해당 요청을 해결한다면, 돌아온 쿼리는
{
책 : {
책 이름 : "GraphQL은 어렵지 않다",
저자 : [
{ 이름 : "김코딩"},
{ 이름 : "박해커"},
]
}
}
ISBN 번호를 사용하여 선택한 “책” 노드에서 시작
GraphQL은 트리 구조로 쿼리 결과를 받기 위해 그래프를 탐색하는 쿼리 언어
GraphQL의 특징
- HTTP를 통해 API 서버로 요청을 보내고 응답 받음
- 응답을 받을 시, 데이터 결과를 JSON 형식으로 받음
- 서버 개발자가 작성한 각 필드에 대응하는 resolver 함수로 각 필드의 데이터 조회 가능
- GraphQL 라이브러리가 조회 대상 schema가 유효한지 검사
댓글남기기