graphQL 소개

katanazero·2022년 2월 17일
0

graphQL

목록 보기
1/1

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)와 캐시를 조합해서 문제를 처리한다.
profile
developer life started : 2016.06.07 ~ 흔한 Front-end 개발자

0개의 댓글