그래프QL이란?
그래프QL의 Graph 는 현실 세계의 데이터를 표현하는 가장 적합한 방법이 그래프라는 사실에서 착안(객체 간의 관계를 그래프로 표현)
그래프QL은 API용 쿼리 언어이자, 서버측 런타임 계층의 역할을 한다. 이 런타임은 API를 통해 제공될 데이터의 구조를 관리하며, 이 구조를 스키마(schema)라고 부른다.런타임이라는 의미는 실행시간을 의미하기도 하며, 실행되는 환경을 의미하기도 한다. 위에 런타임은 실행환경으로 이해를 해야한다.
그래프QL 런타임 계층이 클라이언트의 query 요청을 받아 처리하고 이를 백엔드에 있는 다른 서비스와 통신을하고 그 결과를 응답해주는거다.Facebook 에서 개발이 되었으며, 사양서를 2015년에 공개하였다.(이러한 사양을 따라 개발된 좋은 라이브러리들이 존재를 한다. -> 아폴로, 릴레이 등)
페이스북(Facebook), 에어비앤비(airBnb), 옐프(Yelp), 핀터레스트(Pinterest), 트위터(Twitter) 등 유명 웹/모바일 애플리케이션에서 그래프QL을 사용하고있다.
그래프QL은 여러 API 디자인(REST, SOAP 등)중 하나일뿐이다.
그래프QL은 언어다
query
를 사용하고 수정은 mutation
을 사용한다.그래프QL은 서비스다
그래프QL 서비스는 Employee 타입을 근거로 그래프QL 쿼리가 유효한지 검증한다.
type Employee(id: Int!) {
name: String!
email: String!
}
타입 및 구조가 일치하기 때문에 데이터를 준비하며 요청에 포함된 각 필드의 리졸버 함수가 해당 필드의 데이터를 불러옵니다.
query {
employee(id: 42) {
name
email
}
}
query {
getPersons {
idx
name
address
gender
}
}
schema {
query: Query,
}
type Person {
idx: Int,
name: String,
address: String,
gender: String,
}
type Query {
getPersons: [Person],
getPersonByIdx(idx: Int): Person
}
package com.example.demo.component;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import com.example.demo.domain.Person;
import com.example.demo.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class PersonQuery implements GraphQLQueryResolver {
@Autowired
private PersonService personService;
public List<Person> getPersons() {
List<Person> personList = personService.getPersons();
return personList;
}
public Person getPersonByIdx(final int idx) {
Person person = personService.getPersonByIdx(idx);
return person;
}
}
위 코드는 자바로 작성된 코드입니다. 그래프QL 쿼리를 실행하면, 그래프QL 서비스는 getPersons() 메서드를 실행하여 데이터를 조회해오고 결과를 응답해줍니다. 리졸버는 이처럼 데이터 조회 및 수정에 대한 로직을 담당합니다.
왜 그래프QL인가?
클라이언트-서버 구조에서 그래프QL은 효율성이 좋다. 클라이언트는 종종 서버에게 여러 리소스를 요청해야한다.(Underfetching)
그래프QL은 이러한 다중 요청의 복잡성을 해결해준다.
그리고 필요한 데이터만을 응답받아 사용이 가능하다.(Overfetching)
하나의 요청, 하나의 응답
REST API 도 하나의 엔드포인트(endpoint)를 통해 동일한 처리를 하게 만들 수도 있지만 일반적인 방법은 아니다.
그래프QL은 하나의 엔드포인트로 다양한 서비스와 데이터 교환이 가능하다.