GraphQL
- 오픈소스로 제공된 쿼리 언어
- Graph + Query Language의 줄임말
- 쿼리 언어 중에서도 Server API를 통해 정보를 주고 받기 위해 사용하는 쿼리 언어를 뜻함
- 쉽게 말해 API를 위한 쿼리 언어라고 할 수 있음
* 쿼리 언어? 데이터베이스와 정보 시스템에 질의를 할 수 있게 하는 고급 컴퓨터 언어
그래프를 사용하는 이유
- 그래프라는 자료구조는 인간의 뇌 구조 및 언어적인 설명과 비슷하기 때문에 실제 현실 세계에 많은 현상들을 모델링할 수 있는 강력한 도구임
- 따라서 그래프 자료구조를 살펴보면 우리가 특정 개념을 학습하고 이를 다른 개념과 연관시킬 때 자연스럽게 사용하는 마인드 맵과 유사한 데이터 구조를 가짐
- 그래프는 여러 개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조임
- 하나의 점을 그래프에서는 노드(Node) 또는 정점(vertex)이라고 표현하고, 하나의 선은 간선(edge)이라고 함
- 직접적인 관계가 있는 경우 두 점 사이를 이어주는 선이 있으며, 간접적인 관계라면 몇 개의 점과 선에 걸쳐 이어짐
- 또한 각 노드 간의 간선을 통해 순서에 따라 그래프를 재귀적으로 탐색 할 수 있음
- GraphQL에서는 모든 데이터가 그래프 형태로 연결되어 있다고 전제함
- 일대일로 연결된 관계도, 여러 계층으로 이루어진 관계도 모두 그래프임
- 트리나 그래프나 노드와 노드를 연결하는 간선으로 구성된 자료구조이기 때문
- 단지 그 그래프를 누구 입장에서 정렬하느냐(클라이언트가 어떤 데이터를 필요로 하느냐)에 따라 트리구조를 이룰 수 있음
- 이를 통해 GraphQL은 클라이언트 요청에 따라 유연하게 트리 구조의 JSON 데이터를 응답으로 전송할 수 있음
- GraphQL은 REST API 방식의 고정된 자원이 아닌 클라이언트 요청에 따라 유연하게 자원을 가져올 수 있다는 점에서 엄청난 이점을 갖음
GraphQL로 그래프 순회
→ 도서관의 도서 목록 시스템을 구축한다고 가정하고 GraphQL로 그래프를 순회 해보자!
- 하나의 도서 목록에는 많은 책과 저자가 있을 것임
- 각 책에는 최소한 한 명의 저자가 있음
- 또한 최소한 한 권의 책을 같이쓴 공동저자 또한 있을 것임
- 위의 자료처럼 그래프로 표현하게 되면 우리가 가지고 있는 데이터의 조각들이나 나타내고자 하는 엔티티(책, 혹은 저자) 간의 관계를 나태날 수 있음
* 엔티티?
: 사물의 구조나 상태, 동작 등을 모델로 표현하는 경우, 그 구성 요소를 말함
→ 예를 들어 학생이라는 객체는 '학번', '이름', '학과'라는 3가지 속성으로 구성되어 있는 것처럼, 위의 엔티티는 책이라는 객체가 존재한다면 '책이름'이라는 1개의 속성으로 구성되어 있는 셈
→ 정보적인 측면으로 볼 때 이 속성은 그 차체만으로 중요한 의미를 표현하지 못하기 때문에 단독으로 존재하지 못함
→ 앞의 예에서의 3가지 속성의 각 속성들은 개별적으로 어떤 정보를 제공해 주지는 못하지만 이것들이 모여 '학생'이라는 객체를 구성해서 표현할 때 큰 의미를 제공할 수 있게 됨
- 이렇게 그래프를 그릴 수 있게 된다면, GraphQL을 사용해 트리를 추출할 수 있게 됨
- 기본적으로 트리는 방향성은 존재하나 사이클은 존재하지 않는 비순환 그래프임
- 루트와 모서리를 통해 노드를 따라 순회할 수 있으나 동일한 노드로 돌아올 수 없는 속성을 갖고 있는 특별한 그래프임을 뜻함
그래프에서 트리를 추출하는 방법
→ GraphQL 쿼리와 그래프에서 트리를 추출해 보자!
- 위의 그래프에서 실행할 수 있는 쿼리는 다음과 같음
query {
책(ISBN이 "9780674430006") {
책 이름
저자 {
이름
}
}
}
- 사실 책이란 객체가 가지는 속성은 책 이름 이외에도 많을 것임
- 따라서 한 권의 책만 검색하기 위해, ISBN이 "9780674430006"인 조건을 걸어줌
- 이 방식으로 서버에 요청을 보내고 서버가 해당 요청을 해결한다면 돌아온 쿼리는 아래와 같을 것임
{
책 : {
책 이름 : "GraphQL은 어렵지 않다",
저자 : [
{ 이름 : "강코딩" },
{ 이름 : "윤해커" },
]
}
}
- 이것을 그래프의 관점에서 본다면
- 위 예시에서 ISBN 번호를 사용하여 선택한 '책' 노드에서 시작함
- 그 다음 GraphQL은 중첩된 각 필드로 표시된 간선을 따라 그래프를 탐색하기 시작함
- 즉 쿼리 내 중첩된 '책 이름' 필드를 통해 책 제목이 있는 노드로 이동
- 그러면서 '저자'로 레이블이 지정된 '책' 간선을 따라가 '저자' 노드를 가져오고, 각 저자의 '이름'을 얻어오는 것
- 이것을 트리 구조로 표현하면 아래와 같이 보임
- 이렇게 GraphQL로 중첩된 필드를 그래프의 계층 구조로 표현하면 이렇게 트리 구조로도 표현할 수 있게 됨
- 즉, GraphQL은 트리 구조로 쿼리 결과를 받기위해 그래프를 탐색하느 쿼리 언어라고 볼 수 있음!
GraphQL의 특징
- GraphQL은 HTTP를 통해 API 서버로 요청을 보내고 응답을 받음
- 응답을 받을 시, 데이터 결과를 JSON 형식으로 받음
- GraphQL은 서버 개발자가 작성한 각 필드에 대응하는 resolver 함수로 각 필드의 데이터를 조회할 수 있음
- GraphQL은 GraphQL 라이브러리가 조회 대상 schema가 유효한지 검사함
'Network' 카테고리의 다른 글
[API] GraphQL 구조 (1) | 2023.01.30 |
---|---|
[API] GraphQL과 REST API 비교 (0) | 2023.01.28 |
[HTTP] 특징 (0) | 2023.01.03 |
네트워크 계층 모델 - TCP/IP 4계층 모델 (0) | 2023.01.03 |
네트워크 계층 모델 - OSI 7계층 모델 (0) | 2023.01.03 |