kok202
GraphQL

2019. 8. 8. 20:15[공부] 영상/GraphQL

괜찮은 포스팅1 : https://velopert.com/2318

괜찮은 포스팅2 : https://velog.io/@jakeseo_me/2019-04-28-0904-%EC%9E%91%EC%84%B1%EB%90%A8-qgjv086kyi

테스트 : https://graphql-tryout.herokuapp.com/graphql

강의 출처 : https://www.youtube.com/watch?v=1p-s99REAus

 

SQL : Structure 에 Query 하는 Language

GraphQL : Graph 에 Query 하는 Language

 

 

 

특징

- 구현체가 아닌 스펙이다.

- facebook 에서 만들었다.

- 객체간의 관계는 depth로 관리한다.

- GraphQL 스키마를 먼저 선언해야하는 타입 language 이다.

- 이미 정의된 GraphQL 스키마에 요청만 하면 된다.

- 여러 개의 무의미한 엔드포인트가 아닌 하나의 만능 엔드 포인트를 만든다.

 

 

 

목적

코드를 한번 잘 wrapping 하면 어디에서든 쓸 수 있도록 하자

백엔드 개발자와 불필요한 소통을 줄이고 클라이언트의 어떤 요구에도 대응 할 수 있도록하자.

 

 

 

GraphQL 예시

알고 싶은 내용

1. 나의 이름

2. 나의 나이

3. 나의 애완 동물의 종류

4. 나의 애완 동물이 먹는 사료 리스트 (이름, 유기농인지)

{
    me {
        name
        age
        pet {
            bread
            feeds{
                name
                organic
            }
        }
    }
}

Response json

{
    "me": {
        "name" : "kok202",
        "age" : 99,
        "pet" : {
            "bread" : "shibo inu",
            "feeds" : [
            {
                "name" : "FOR DOG",
                "organic" : true
            },            
            {
                "name" : "FOR DOG",
                "organic" : true
            }]
        }
    }
}

 

 

 

나의 애완동물이 먹는 유기농인 사료만 골라오기

{
    me {
        name
        age
        pet {
            bread
            feeds(onlyOrganic: true){
                name
                organic
            }
        }
    }
}

 

 

 

나의 애완동물이 먹는 유기농 사료 5개만 가져오기

{
    me {
        name
        age
        pet {
            bread
            feeds(limit: 2){
                name
                organic
            }
        }
    }
}

 

 

 

배경 : 스마트폰, 스마트워치, 데스크탑 등 다양한 환경이 생겨나면서 같은 url path 이지만 요청하는 환경에 따라 결과물을 달리 내려줘야하는 경우가 생긴다. 예를 들어 어떤 기사를 읽어오기위해 /api/news 라는 api 가 있다면 엔드포인트는 하나지만 환경에 맞춰 데이터를 내려주기 위해 작업은 배가 된다. 그리고 만약 어떤 API 가 추가되길 원한다면 백엔드 개발자에게 API 를 만들어 달라고 요청을 해야하는 과정이 필연적으로 생긴다. 더불어 해당 API 가 개발이 완성되기 까지 기다려야 하므로 시간이 지체된다. 이는 업무적으로도 굉장한 낭비다. 이러한 문제를 해결하고자 나온 해법중 하나이다.

 

 

 

graphQL 은 여러개의 API 엔드포인트가 아닌 하나 엔드포인트만으로 해결한다. /api/graphql

request 가 복잡하면 SQL 쿼리가 무수히 많이 생길 수 있으므로 최적화가 되어야한다.

 

 

 

최적화

1. depth 를 최대한 줄여야한다.

2. DataLoader 를 추가해야한다.

 

 

 

DataLoader

property resolve 시 한번에 모아서 배치 call 을 한다.

중복 로드 되는 객체는 캐시해서 불필요한 요청을 줄인다.

 

 

 

첨언

GraphQL 의 엔드포인트는 public 으로 열리면 안된다.

Persist Query 를 사용해야한다.