graphQL 소개
graphQL 소개
그래프QL이란?
그래프QL의 Graph 는 현실 세계의 데이터를 표현하는 가장 적합한 방법이 그래프라는 사실에서 착안(객체 간의 관계를 그래프로 표현)
그래프QL은 API용 쿼리 언어이자, 서버측 런타임 계층의 역할을 한다. 이 런타임은 API를 통해 제공될 데이터의 구조를 관리하며, 이 구조를 스키마(schema)라고 부른다.런타임이라는 의미는 실행시간을 의미하기도 하며, 실행되는 환경을 의미하기도 한다. 위에 런타임은 실행환경으로 이해를 해야한다.
그래프QL 런타임 계층이 클라이언트의 query 요청을 받아 처리하고 이를 백엔드에 있는 다른 서비스와 통신을하고 그 결과를 응답해주는거다.Facebook 에서 개발이 되었으며, 사양서를 2015년에 공개하였다.(이러한 사양을 따라 개발된 좋은 라이브러리들이 존재를 한다. -> 아폴로, 릴레이 등)
-
페이스북(Facebook), 에어비앤비(airBnb), 옐프(Yelp), 핀터레스트(Pinterest), 트위터(Twitter) 등 유명 웹/모바일 애플리케이션에서 그래프QL을 사용하고있다.
-
그래프QL은 여러 API 디자인(REST, SOAP 등)중 하나일뿐이다.
그래프QL은 언어다
- 그래프QL의 이름에는 질의(Query)를 뜻하는 Query의 Q가 있지만 질의 행위에만 국한된 단어이며, 그래프QL은 데이터를 읽기뿐만 아니라 수정도 가능하다.
그래프QL은 데이터를 읽을때는query
를 사용하고 수정은mutation
을 사용한다.
그래프QL은 서비스다
- 그래프QL을 사용하려면 서버가 해당 요청에 관해 이해를 해야한다.
서버단 그래프QL 런타임 계층을 만들어서 이를 클라이언트를 향해 노출하기만 하면된다. 서버에 존재하는 그래프QL 런타임 계층은 그래프QL 의 통역기 또는 그래프QL 을 이해하는 서비스로 생각하면 된다.
그래프QL은 저장 엔진이 아니므로, DB 같은 서버로 사용이 불가능하기 때문에 런타임 계층으로 별도의 층을 만들어서 그래프QL 언어를 변환하는거다.
그래프QL 서비스는 원하는 프로그래밍 언어로 구현한다.
- Resolver 는 어디서, 어떻게 데이터를 가지고 오고 수정할지를 지시한다.
그래프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은 하나의 엔드포인트로 다양한 서비스와 데이터 교환이 가능하다.
정리
- 그래프QL은 분명 매력이 많지만, 학습곡선 및 보안, 최적화까지 고려한다면 만능은 아니다.
- 그래프QL은 REST API 와 비교해보면 관리 및 기능을 확장하기 쉽고 오버페칭 및 언더페칭을 생각했을때 요청을 최적화 해준다.
- 그래프QL도 N+1 이슈가 발생을 한다.(내부 필드 데이터를 얻기 위해, N개의 query 를 요청하는걸 의미한다)
다행스럽게도, 페이스북에서 데이터로더(DataLoader)라는 툴을 제시했다. 데이터로더는 일괄처리(Batch)와 캐시를 조합해서 문제를 처리한다.
Author And Source
이 문제에 관하여(graphQL 소개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@katanazero86/graphQL-소개저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)