(GraphQL) GraphQL 개념잡기
GraphQL이란 Facebook에서 만든 어플리케이션 레이어 쿼리 언어입니다.
레이어 쿼리 언어라니.. 좀 어렵게만 들리죠. 🙄
GraphQL도 기존 HTTP 통신과 동일합니다.
필요한 자원을 좀더 유연하게 요청하고, 응답해주는 HTTP 요청 방식 표준으로 이해하면 됩니다.
REST API와 뭐가 다른거지?
REST API에서는 여러개의 API Path으로 자원을 식별합니다. "/post/{PK}" 이런 방식으로 말이죠.
그리고 HTTP Method으로 API의 목적을 판단합니다. ( GET, POST, PUT, PATCH, DELETE )
그러나 GraphQL은 자원별로 API Path를 만들지 않습니다. 보통 "/graphql/" path 하나로 여러개의 자원을 한번에 조회합니다.
필요한 자원 정보는 요청 바디 파라미터에 담아서 보냅니다. 그래서 GraphQL에서는 POST method 1개만 사용합니다.
GrpahQL이 왜 필요한거지?
REST API는 Path으로 자원을 표현합니다.
그러다보니 클라이언트에서 여러개의 자원이 필요하면, 여러개의 API를 호출하는 구조로 되어있습니다.
이 경우, 화면 렌더링도 지연되고, 서버 자원도 많이 활용하게 되죠.
여기에 단점이 하나 더 있습니다.
REST API를 여러 화면에서 재사용하는 경우가 있는데요. 여러곳에서 재사용하다보니, 특정 화면에서는 필요하지 않은 항목까지 내려주는 경우가 있습니다.
이 경우, 불필요한 네트워크 비용이 발생하기도 하구요. 서버에서도 불필요한 연산을 하게 됩니다.
반면, GrpahQL에서는 필요한 자원 정보를 파라미터에 담기 때문에, 한번의 요청으로 모든 정보를 응답받을 수 있습니다.
그리고 필요한 항목들만 지정해서 받을 수도 있죠.
예를 들어, REST API 예시 데이터에서는 팔로워의 생년월일 정보까지 내려줍니다. 그러나 화면에서는 팔로워의 이름만 필요하다면, GraphQL은 팔로워의 이름만 알려달라고 질의할 수 있는거죠.
REST API는 안써야하나?
GraphQL은 HTTP 응답을 통채로 캐싱하기 어렵단 단점이 있습니다. API를 통채로 캐싱하는게 효율적인 API는 기존처럼 REST 방식을 사용하는게 좋을 것같아요.
그리고 서비스 외부 연동에 사용되는 API도 물론 REST으로 작성되어야겠죠. ( GraphQL 방식으로 호출해달라고 할수는 없으니..? )
GrpahQL이 개발방식에 미치는 영향
GraphQL을 사용하게 되면 클라이언트와 백엔드에서 개발하는 관점이 달라지게 됩니다.
GraphQL을 사용하면 클라이언트에서 필요한 항목들만 요청하고, 받을 수 있습니다.
백엔드에서는 필요한 데이터를 내려주고, 저장하는 방식에만 집중하면 됩니다. 🤗
GrpahQL 스펙을 알고싶을 때
GraphSpec을 읽어보면서, 감을 잡으면 됩니다! ( 이 스펙문서가 제일 설명도 잘 되어있고, 재밌어요. )
그래도 감이 안온다!
실제 API 호출 사례를 보면 좀 감이 오더라구요.
해외서비스들의 API 호출방식을 개발자도구로 관찰해보는 것을 권장합니다!
1. Medium Highlight API 호출 개발자 도구로 살펴보기
Midium의 글을 우클릭해서 하이라이트 처리를 할 때, 호출하는 API도 graphql으로 되어있습니다.
2. Github API 살펴보기
github API 4 version은 Graphql으로 되어있습니다. explorer를 통해 Graphql API를 호출해볼 수 있습니다.
[Github] API 4 버전 호출해보기 - explorer
잡다구리 Tip 💡
GrpahQL 개발자를 위한 Tip 💡
Postman에서도 GraphQL 쿼리 질의를 지원합니다.
Django 개발자를 위한 Tip 💡
1. graphene-django이 주로 사용되는 Django GrpahQL 패키지입니다. graphene-django Basic Tutorial을 따라해보시면, django에 graphql을 적용하는 방법에 대한 감이 올거에요.
2. Django GrpahQL 프로젝트 구조를 잡을 때에는 Saleor을 참고하면 좋습니다. Saleor는 유명한 Django E-Commerce 오픈소스인데요. 도메인별로 쿼리 오브젝트 관리 방식, resolve와 mutation 관리 방식 등에 대한 팁을 얻을 수 있습니다.
참고