Introdução a GraphQL
Tags: graphql, node, javascript
Published: 2020-05-20 19:34:55

GraphQL é uma especificação de Query Language para APIs baseada no conceito de [grafos](https://pt.wikipedia.org/wiki/Teoria_dos_grafos).
Um grafo, possui vários pontos, chamados de nó e ligados uns aos outros.
Cada nó pode ser entendido como um recurso do sistema.
Um recurso pode ser um usuário, um cliente, uma pessoa e outro recurso pode ser o país do usuário, a peça fornecida pelo fornecedor, e assim por diante.

Dessa forma, o GraphQL permite a ligação entre recursos do sistema em forma de grafo.

O GraphQL também permite que as interfaces de usuário (clientes) interajam declarativamente com dados e as isolem de como esses dados são resolvidos no servidor. Quem controla quais informações são necessárias é o cliente e não mais o servidor, conforme estamos acostumados com o REST.

GraphQL é agnóstico de banco de dados, isso significa que você pode utilizar qualquer banco de dados em sua API.

###Que problemas o GraphQL resolve?
Criada pela equipe do Facebook em 2012, GraphQL começou a ser usada em seus aplicativos, e em 2015 a especificação se tornou _open source_ e várias empresas adotaram a tecnologia desde então.

Hoje em dia muitas empresas usam o GraphQL, como Facebook, Amazon, GitHub, Twitter, PayPal, The New York Times, KLM, GetNinjas, Dailymotion, Shopify e Pinterest. Até a própria Netflix, que possui um projeto próprio, chamado _Falcor_, hoje em dia também utiliza o GraphQL.

Segundo [Lee Byron](https://twitter.com/leeb?lang=en), um dos desenvolvedores do GraphQL, o problema que o Facebook enfrentava e que serviu de motivação para criar a solução, era obter os dados necessários para o feed de notícias em dispositivos móveis, e usando conexões de rede lentas.

Dentro de cada post tinha que vir uma lista dos usuários que curtiram. Dentro de cada objeto de usuário tem que vir o nome, foto do perfil, link para o perfil, se o usuário já é seu amigo, etc.

![Rest and GraphQL Flow](https://dev-to-uploads.s3.amazonaws.com/i/v5kfm9zhvhfcyc2xfp98.png)

Ao invés de ter que ficar criando uma API para cada estrutura diferente de dados e depois juntar esses dados, que tal simplesmente dizer a “alguém” o que você precisa? Esse “alguém” é o GraphQL.

###Benefícios
Alguns benefícios que uso do GraphQL podem trazer.

####Performance
Ao utilizar o GraphQL as requisições se tornam mais rápidas pois o _payload_ trafegado na rede é reduzido, afinal será enviado apenas as informações necessárias.

Em um cenário com REST podemos precisar de mais de uma requisição para retornar as informações necessárias. Sendo assim o GraphQL tem um ganho para as aplicações e esse ganho é ainda maior em redes mais lentas ou limitadas, como as redes móveis por exemplo.

####Versionless
No GraphQL temos o conceito de ser _versionless_, ou seja, sem controle de versão para a API, bastando estender o Schema para adicionar novas informações sem impactar as aplicações antigas, que não utilizarão essas informações.

Caso seja necessário remover um atributo futuramente, coloque-o como _deprecated_ indicando qual novo atributo deve ser usado e que futuramente não haverá mais o atributo deprecated no Schema.

![GraphQL Versionless](https://dev-to-uploads.s3.amazonaws.com/i/91ellkf5kv9nn3o7cdja.png)

####Princípios Segundo a empresa Apollo
A empresa Apollo estima que seu framework seja utilizado em mais de 90% das implementações de GraphQL e eles possuem alguns princípios de boas práticas que listei abaixo.

**Princípios de Integridade:** Garantir que o Schema GraphQL seja bem definido, estável e consistente.

1. GraphQL Schema único — A empresa deve possuir um GraphQL Schema unificado ao invés de um por equipe.
2. Implementação compartilhada — A implementação do GraphQL Schema deve ser compartilhada entre as equipes/times.
3. Rastreie o Schema em Registros — Deve haver uma única fonte verdadeira para rastrear o GraphQL Schema.

**Princípios de Agilidade:** Distribuir e adaptar-se rapidamente as mudanças necessárias.

1. Schema Abstrato e Orientado a Demanda — O esquema deve agir como uma camada de abstração que fornece flexibilidade aos consumidores, ocultando os detalhes da implementação.
2. Abordagem Ágil para o desenvolvimento dos Schemas — O esquema deve ser construído de forma incremental com base nos requisitos reais e evoluir ao longo do tempo.
3. Melhorar o Desempenho de forma Iterativa — O gerenciamento de desempenho deve ser um processo contínuo, adaptando-se às mudanças nas cargas de consulta e nas implementações de serviços.
4. Use os Metadados para Capacitar os Desenvolvedores — Os desenvolvedores devem ter conhecimento da API GraphQL durante todo o processo de desenvolvimento.

**Princípios de Operação:** Implementar a API GraphQL com segurança para produção.

1. Acesso e Controle de Demanda — Conceda acesso por cliente e gerencie o que e como poderão acessá-lo.
2. _Log_ Estruturado — Capture _logs_ estruturados de todas as operações e aproveite-os como ferramenta para entender o uso da API GraphQL.
3. Separe a Camada GraphQL da Camada de Serviço — Adote uma arquitetura em camadas com a funcionalidade da API GraphQL em uma camada separada, em vez de ser incorporada em todos os serviços.

###5 motivos para adotar GraphQL em seus projetos

1. GraphQL possui Schema fortemente tipado — O GraphQL Schema é a “espinha dorsal” da API GraphQL, ele define as operações (_query_, _mutations_ e _subscriptions_) suportadas pela API, incluindo argumentos de entrada e respostas. Pode-se dizer que o Schema é o contrato entre o cliente e a API.
2. Não há mais _overfetching_ ou _underfetching_ — Como o cliente diz quais dados ele precisa receber, os problemas de receber dados desnecessários (_overfetching_) ou precisar de mais de uma requisão por não ter todos os dados em apenas uma chamada (_underfetching_) são solucionados e esse é considerado um dos maiores benefícios do GraphQL.
3 .GraphQL permite o desenvolvimento rápido de produtos — Existe um ganho muito grande, principalmente para equipes de frontend. Com GraphQL é possível redesenhar completamente a UI de um frontend sem ter que alterar nada no backend. Com [GraphQL Faker](https://github.com/APIs-guru/graphql-faker) os times de frontend ainda podem utilizar mocks das APIs.
4. APIs GraphQL Compostas — O Schema permite combinar e mesclar várias APIs GraphQL em apenas uma. Semelhante aos componentes React que podem ser compostos por componentes existentes, A API GraphQL pode ser composta de outras APIs. Isso é extremamente benéfico para os clientes, caso contrários teriam que acessar vários endpoints de API GraphQL.
5. Ecossistema de código aberto e uma comunidade incrível — GraphQL foi oficialmente lançado pelo Facebook em 2012 e se tornou open source em 2015, um tempo bem curto, e mesmo assim é incrível o quanto todo o ecossistema GraphQL amadureceu desde então.

###Referências:
[GraphQL: A query language for APIs](https://graphql.org/)
[How to GraphQL - The Fullstack Tutorial for GraphQL](https://www.howtographql.com/)
[Principled GraphQL](https://principledgraphql.com/)
[Top 5 Reasons to Use GraphQL | Prisma](https://www.prisma.io/blog/top-5-reasons-to-use-graphql-b60cfa683511)