GraphQL은 필요한 데이터만 가져오겠다는 접근 방식을 채택한 데이터 질의 언어이다.
오버 패치는 영어 문장 그대로 불필요한 데이터까지 같이 가져오는 문제를 말한다.
어느 부분에서는 name
, email
값만 필요하더라도 /users/1/
을 요청하면 "주소, 생일, 가입일" 등의 불필요한 데이터까지 가져오게 된다.
받아온 데이터 중 필요한 것만 추려야 해서 메모리 사용량 증가, 렌더링 비용 증가 가능성이 있음
언더 패치도 문장 그대로 여러 종류의 데이터가 필요한데, /users/1
, /users/1/friends
처럼 여러 번 요청 해야 필요한 정보를 다 채울 수 있는 문제를 말한다.
/posts/123 (123번 게시글 가져오기)
/users/45 (45번 작성자 가져오기)
기존 RestAPI 방식과 다르게 GraphQL은 하나의 엔드포인트에서 요청마다 원하는 필드만 선택적으로 받아올 수 있다.
qeury { # User 타입에서 name만 가져옴
user {
name
}
}
query { # User 타입에서 name과 friends 필드의 name 필드를 가져옴
user {
name
friends {
name
}
}
}
리졸버는 GraphQL 스키마의 각 필드에 데이터를 채워주는 함수이다.
(default resolver가 사전에 정의되어 있으며, 가공이 필요한 경우엔 커스텀 리졸버를 제작하여 사용 가능)
// 커스텀 리졸버
const resolvers = {
Query: {
numberSix() {
return 6;
}
}
}
// 쿼리
query {
numberSix
}
// 반환 결과
{
"data": {
"numberSix": 6
}
}
위의 예시는 numberSix
필드에 대해 요청이 들어온 경우, 커스텀 리졸버를 통해 6을 반환받도록 한 예시이다.