GraphQL para iniciantes
Tags: graphql, architecture, beginners, pt
Published: 2022-03-25 12:23:06

## O que é GraphQL?

O GraphQL é um padrão de API criado pelo Facebook, que provê uma alternativa mais robusta e completa ao REST. Ele permite um maior controle da parte do cliente sobre os dados que serão requisitados da API, diminuindo problemas de *overfetching* dentro de uma aplicação.

O GraphQL não é voltado para um banco de dados ou serviço de armazenamento de dados, ou ainda para uma linguagem específica. Dessa forma o GraphQL funciona a partir dos dados já existentes dentro de uma aplicação, independente da linguagem no qual foi escrita.

### Principais conceitos

#### ***Schemas e Types***

Um *schema* é a estrutura básica do GraphQL, ele que define a estrutura da funcionalidade disponível para um cliente. Um *schema* é criado utilizando os *types* que permitem criar relacionamentos entre os dados, definir estruturas ou mesmo especificar os tipos de ações que podem ser realizadas pelos clientes.

```graphql
type Hero {
	id: ID!
	name: String
	superpower: [String]!
	age: String
}

type Villain {
	id: ID!
	name: String
	sad_past: String
	age: String
}
```

#### *Query e Mutation*

O GraphQL não utiliza os métodos HTTP para comunicação do que deve ser feito com os dados, em vez disso utiliza apenas o método POST para realizar suas ações. Dessa forma, o GraphQL trabalha sobre os próprios métodos para descrever os tipos de ações que devem ser realizadas. Esses métodos são os *Types*, *Mutation e Query.*

*Query* e *Mutation* são os tipos mais básicos dentro de um *schema*, o tipo *Query* serve pra se definir ações de consulta dentro do GraphQL, enquanto o tipo *Mutation* descreve ações de criação, atualização e exclusão de dados.

```graphql
type Query {
	heros: [Hero]!
	hero(id: ID!): hero

	villains: [Villain]!
	villain(id: ID!): Villain
}

type Mutation {
	addHero(name: String, super_power: String): Hero
	addVillain(name: String, sad_past: String): Villain
}
```

## Vantagens e Desvantagens

Como nem tudo são flores (😆), podemos listar algumas vantagens e desvantagens em relação à utilização do GraphQL dentro de uma aplicação:

### Vantagens

- Diminui drasticamente a quantidade de rotas  ~~(geralmente há apenas uma hehe)~~
- Diminui a quantidade de requisições feitas para a API
- Provê uma tipagem dos dados disponíveis
- Resolve o problema de *overfetching*
- Mais performático que o REST (Ideal para aplicações móveis)

### Desvantagens

- Maior curva de aprendizado
- Não utiliza os métodos HTTP além do POST
- Mais complexo para implementar cache
- Alta complexidade para upload de arquivos

Cabe sempre ao desenvolvedor, ou mesmo ao time de desenvolvedor analisar se as vantagens da implantação de uma ferramenta compensam as desvantagens e desafios que serão trazidos junto.

## Quando usar?

Não há uma regra de quando o GraphQL deve ser utilizado numa aplicação, porém ele possui grande potencial em aplicações que lidam com grandes quantidades de dados, ou ainda que possuam problemas de *overfething.* Utilizar o GraphQL significa diminuir drasticamente a quantidade de dados trafegada entre a API e o Cliente tornando muito mais rápida essa comunicação.

O GraphQL tem ainda um grande potencial quando utilizado dentro de arquiteturas com microserviços, criando uma interface unificada de comunicação.

Em resumo, não há um cenário específico em que ele possa ser usado, ele possui problemas assim como qualquer ferramenta, mas pode ajudar bastante quando se precisa ter um controle melhor dos dados trazidos de uma API.

**(Não existe bala de prata)**

## Referências
- [GraphQL](https://graphql.org/)
- [GraphQL Best Practices](https://graphql.org/learn/best-practices/)
- [GraphQL - Devopedia](https://devopedia.org/graphql)
- [Métodos de requisição HTTP](https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Methods)
- [The Fullstack Tutorial for GraphQL](https://www.howtographql.com/)
- [GraphQL — Aprendendo na prática](https://medium.com/trainingcenter/graphql-aprendendo-na-pr%C3%A1tica-569a6866065b)
- [GraphQL aplicado no Node.js | Diego Fernandes](https://www.youtube.com/watch?v=oD8GqurXZ-0&feature=youtu.be&ab_channel=Rocketseat)