📌 쿼리언어
쿼리 언어는 정보를 얻기 위해 보내는 질의문(Query)를 만들기 위해 사용되는 컴퓨터 언어이다. 가장 잘 알려져있는 예시로는 데이터베이스 시스템에 저장된 데이터를 가져오기 위해 사용하는 SQL이 있다.
📌 GraphQL(Graph Query Language)
SQL: 서버가 데이터베이스에서 데이터를 가져오는 목적
GraphQL: 클라이언트가 서버에서 데이터를 가져오는 목적
=> 하나의 엔트포인트가 응답하는 값이 정해져 있다
=> 하나의 엔트포인트에서 요청하는 쿼리에 따라
다른(원하는) 응답(Response)을 받을 수 있다.
(Database TABLE에 SELECT 쿼리로 WHERE, IF 등의 조건문을 통해 원하는 데이터를 가져오는 것과 비슷하다)
/swapi.dev/api/people API에서 id: 1로 등록된 유저의 정보를 가져오고자 하는데
내가 원하는 데이터는 name, heghit, mass
이 3개 값만 필요하다
// REST API request
GET, https://swapi.dev/api/people/1
// REST API response
{
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
"hair_color": "blond",
"skin_color": "fair",
"eye_color": "blue",
"birth_year": "19BBY",
"gender": "male",
"homeworld": "http://swapi.dev/api/planets/1/",
"films": ["http://swapi.dev/api/films/1/", "http://swapi.dev/api/films/2/", "http://swapi.dev/api/films/3/", "http://swapi.dev/api/films/6/"],
"species": [],
"vehicles": ["http://swapi.dev/api/vehicles/14/", "http://swapi.dev/api/vehicles/30/"],
"starships": ["http://swapi.dev/api/starships/12/", "http://swapi.dev/api/starships/22/"],
"created": "2014-12-09T13:50:51.644000Z",
"edited": "2014-12-20T21:17:56.891000Z",
"url": "http://swapi.dev/api/people/1/"
}
// GraphQL request
query {
person(personID: 1) {
name
height
mass
}
}
// GraphQL response
{
"data": {
"person": {
"name": "Luke Skywalker",
"height": 172,
"mass": 77
}
}
}
- Operation type: 어떤 유형의 작업을 수행하고자 하는지 표시합니다. query, mutation 또는 subscription입니다.
- Operation name: 오퍼레이션에 이름을 부여합니다. 프로그래밍 언어의 함수 이름과 유사합니다. 이름을 정해두면 네트워크 로그나 GraphQL 서버에서 문제가 발생했을 시 내용을 해독할 필요 없이 코드 베이스에서 해당 쿼리를 쉽게 찾을 수 있습니다.
- Variable definitions: 쿼리에 필요한 변수입니다. GraphQL 서버로 쿼리를 보낼 때 실제 쿼리는 동일하지만 요청마다 변경되는 동적 부분이 있을 수 있습니다. 이때 변수가 사용됩니다. 이 변수는 쿼리와 별도로 전송되며 전송 포맷은 JSON입니다.
query HeroNameAndFriends {
hero {
name
friends {
name
}
}
}
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
HTTP 응답 사이즈(리소스)를 줄일 수 있다.
응답 데이터 사이즈를 최소화하여 모바일 환경의 부담을 줄일 수 있다.
HTTP 요청 횟수를 줄일 수 있다.
프론트엔드와 백엔드 개발자의 부담을 덜 수 있다.
요약
수많은 엔드 포인트
REST-API를 사용할 때는 각 API 요청에 맞는 수많은 엔드 포인트가 필요
POST /boards => 게시글 등록 함수: () => { }
GET /boards => 게시글 조회 함수: () => { }
GET /products => 상품 목록 조회 함수: () => { }
REST-API의 UnderFetching 문제
=> 이러한 문제를 개선하고자 나온 것이 GraphQL
POST /graphql
로 통일하였습니다.이러한 특징으로 인해 GraphQL을 사용할 때는 주의해야 할 점
참고 사이트 🙏🏻