요청한 엔드포인트를 응답할 때 활용하는 명령어로,
엔드포인트로부터 data를 얻기위해 필요한 호출함수 및 언어이다.
client와 server간 data 및 웹페이지(template)을 송수신하는 과정의 핵심은, 엔드포인트에서 data를 확보하는 시점이다.
우리(=client)가 request한 요청에 따라 server는 response를 하고, 이에 대한 data 및 template(웹페이지)를 우리에게 response 한다.
이 과정을 server나 관리자 관점에서 본다면, 특정 user가 작성한 게시글 및 follower 등 사용자에 대한 세부적인 정보들을 동일한 원리로 얻을 수 있을 것으로 생각할 수 있다.
이처럼 Server측에서 가지고 있는 data나 여러 template을, 엔드포인트(data를 보유하고 있는 지점, uri)로부터 요청하고 이를 확보하기위해 호출하고 이용하는 명령어를 RESTAPI라 한다.
위 그림처럼 최종적으로 특정 user의 follower 정보를 확보해야한다고 생각해보자.
RESTAPI를 이용해 우리가 원하는 follower 정보를 얻기 위해선,
위와 같이 단계적인 엔드포인트 시점을 알아야 하고, 각 엔드포인트로부터 RESTAPI를 호출하여 원하는 정보를 얻어야만 최종적인 follower 정보를 얻을 수가 있다.
overfetching
이때 우리는 follower 정보를 얻기위해 사용자 전체정보와 id 값 등 불필요한 정보까지 모두 확보가 필요하였다.
한 정보를 얻기위해 불필요한 정보까지 얻어야하는 번거로움을 overfetching이라 하고, 이는 RESTAPI의 가장 큰 문제점 중 하나이다.
underfetching
또한 이를 다른 관점으로 볼 수 있다.
follower 정보를 얻기 위해 RESTAPI를 통해 직접적으로 정보를 얻고자 하면 해당 user id를 모른 상태로 정보를 얻게 되거나, 다른 엔드포인트의 follower 정보를 얻을 수 있는 불확실성이 존재한다.
이처럼 RESTAPI를 통해 필요한 정보가 아닌, 다른 정보나 부족한 정보를 얻게 되는 이슈를 underfetching이라 하며 이 역시 RESTAPI의 문제점 중 하나이다.
버전관리 및 유지보수의 번거로움
추가적으로, RESTAPI를 사용할 경우 API버전별 관리가 필요하게 된다.
버전별로 API를 관리하게 된다면, 버전에 맞춘 엔드포인트가 별도로 생성되어야 하며 실무적으로 백엔드/프론트엔드간 협의가 반복적으로 이루어져야 하는 번거로움이 생긴다.
이를 통해 RESTAPI를 사용시 data 무결성 및 유지관리에 매우 힘들 수 있음을 알 수 있다.
GraphQL은 URL 개념이 존재하지 않는다.
비선형 자료구조인 Graph처럼 data가 무수히 많은 연관관계를 지닌 상태에서,
Query Language를 통해 원하는 data만 선별적으로 확보할 수 있는 체계(명령어).
GraphQL은 RESTAPI가 가지는 치명적인 단점인 "여러 개의 엔드포인트"를 "단일 엔드포인트화"하여, 한 번의 엔드포인트 접근으로 원하는 data를 얻을 수 있도록 한다.
GraphQL은 모든 data가 graph처럼 연결관계를 지닌 것으로 생각한다.
client나 서버관리자는 자신이 원하는 data를 얻기 위해, 여러 엔드포인트를 단계적으로 거치는 것이 아닌 user 정보가 있는 하나의 엔드포인트로만 접근한다.
그 후 Query language를 통해, user id와 followers key값에 접근하여 원하는 followers 정보만 선별하여 확보할 수 있다.
GraphQL은 이처럼 data무결성 및 유지보수가 RESTAPI에 비해 우수하고, server 운영면에서 월등히 간결하고 쉽다.
※한 엔드포인트의 특정 data를 얻기위해 전달하는 Query
한 유저의 feed정보(댓글, 좋아요 수)와 기본정보(조회수)를 DB에 요청하는 Query
query {
feed {
comment,
likeNumbers,
}
notifications{
isRead
}
}
※ Query를 받아 Database에서 Javascript 문법을 통해 출력하는 예시
DB가 feed정보와 기본정보를 javascript를 통해 전달해주는 구조
{
feed : [
{
comments : 1,
likeNumbers : 3
}
]
notifications : [
{
isRead : 2
}
]
}
fastcampus 강의자료 발췌(GraphQL과 RESTAPI의 차이점)