참고
GraphQL 개념잡기
SQL은 관계형데이터베이스를 다루는 문법
GraphQL (이하 gql)은 gql을 지원하는 서버에서 데이터를 요청하는 '문법, 형식'
gql
은 HTTP Protocol의 POST Method위에서 작동한다.
gql문법을 만족하는 데이터를 POST Method의 Body에 담아 서버로 전송하는 것이다.
주로 비교되는 REST API
를 지원하는 서버는 여러 Endpoint를 가지고, 각 Endpoint는 한 가지 성격의 작업을 수행하는 반면,
gql은 1개의 Endpoint만을 가진다. gql 요청을 받은 서버측에서 요청을 분석한 뒤, 적합한 작업을 선택하여 수행하는 것이다.
REST API 서버는 1(EndPoint):1(Operation) 쌍이 여러개 존재
GraphQL 서버는 1(EndPoint):M(Operation)이 1개 존재
# 기본 형태 (일반 쿼리)
{
hero {
name
}
}
gql
은 크게 Query
와 Mutation
으로 구분된다.
Query(질의)는 Read
Mutation(변조)은 Create, Update, Delete
단순히 의미를 구체화하기 위해 개념적으로 구분한 것이다.
[query | mutation] {
...
}
# 일반쿼리
{
human(id: "1000") {
name
height
}
}
# 오퍼레이션 네임 쿼리
query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
friends {
name
}
}
}
쿼리는 일반 쿼리
와 오퍼레이션 네임 쿼리
로 구분할 수 있다.
일반 쿼리
는 다짜고짜 중괄호
로 시작하고, 오퍼레이션 네임 쿼리
는 앞에 query가 붙어있다.
일반 쿼리
는 Specific한 내용을 담고있는 반면, 오퍼레이션 네임 쿼리
는 마치 함수처럼, 변수
개념을 통해 재사용할 수 있다. react apollo client
같은 gql을 구현한 클라이언트를 통해 변수에 값을 할당하여 사용한다.
여기서 일반적인 REST API와 프로그래밍 페러다임(?)적으로 차이점이 있는데,
REST API는 데이터를 반환하는 쪽에서 어떤 데이터를 조회할지 SQL문을 통해 결정하는데,
GQL은 데이터를 요청하는 쪽에서 어떤 데이터를 조회할지 GQL을 통해 결정한다.
SQL은 백엔드 개발자가 작성, 관리
GQL은 프론트엔드 개발자가 작성, 관리
이러한 관계를 통해 프론트엔드가 백엔드 API의 Request, Response에 덜 의존적일 수 있다.
그러나 데이터 스키마에는 여전히 의존적임을 지적함 -> 애초에 극복할 수 있는 문제인가...?
의미는 데이터베이스의 스키마와 비슷하나, 형태는 C언어의 헤더 파일과 비슷하다.
type Character {
name: String!
appearsIn: [Episode!]!
}
오브젝트 타입 : Character
필드 : name, appearsIn
스칼라 타입 : String, ID, Int 등
느낌표(!) : 필수 값을 의미(non-nullable)
대괄호([, ]) : 배열을 의미(array)
SQL만 작성하면 DBMS가 알아서 데이터를 가져오는 것과 달리, GQL은 resolver(이하 리졸버)
를 직접 구현함으로써 데이터를 가져오는 구체적인 과정을 명시해야 한다.
gql 쿼리문 파싱은 보통 gql 라이브러리를 사용해서 처리
리졸버를 직접 구현해야하는 부담은 있지만, 데이터 source에 상관 없이 구현 가능하다는 장점이 있다.
리졸버를 통해 데이터를 데이터베이스에서 가져 올 수 있고, 일반 파일에서 가져올 수 있다.
심지어 http, SOAP와 같은 네트워크 프로토콜을 활용해서 원격 데이터를 가져올 수 있다.
Graph
의 의미gql 쿼리에서는 각각의 필드마다 다음 타입을 반환하는 함수
가 하나씩 존재 한다. 그리고 그 함수가 바로 리졸버
인 것이다.
리졸버는 다음과 같은 특징을 갖는다.
이처럼 리졸버는 필드에 따라 연쇄적으로 호출될 수 있고, 그 과정이 마치 그래프 탐색과 유사하다.