GraphQL vs REST em Java: duelo de titãs no seu backend
\n\nImagine que você está pedindo uma pizza. REST é quando trazem a pizza inteira, mesmo que você só quisesse um pedaço com pepperoni. GraphQL é quando você diz: "Me dê, por favor, apenas o pepperoni e o queijo, e fique com a massa e o molho de tomate". Parece conveniente? Esse princípio está no centro do grande debate no mundo do desenvolvimento Java nos últimos anos.
\n\nREST e GraphQL são duas abordagens poderosas para construir APIs, e todo desenvolvedor Java, mais cedo ou mais tarde, se depara com essa escolha. GraphQL vs REST em projetos Java não é apenas uma guerra santa, mas uma questão prática que impacta desempenho, velocidade de desenvolvimento e facilidade de manutenção. Vamos entender o que é o quê, com exemplos reais e código vivo.
\n\nREST: o velho amigo que é melhor que dois novos?
\n\nREST (Representational State Transfer) é um estilo arquitetural que domina o mundo Java há mais de uma década. Serviços RESTful Java são construídos com princípios simples: recursos, métodos HTTP (GET, POST, PUT, DELETE) e códigos de status. Tudo familiar, previsível e estável.
\n\nExemplo de controlador REST com Spring Boot
\n\n@RestController\n@RequestMapping("/api/users")\npublic class UserController {\n\n @Autowired\n private UserService userService;\n\n @GetMapping("/{id}")\n public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {\n UserDTO user = userService.findById(id);\n return ResponseEntity.ok(user);\n }\n\n @GetMapping\n public ResponseEntity<List<UserDTO>> getAllUsers() {\n List<UserDTO> users = userService.findAll();\n return ResponseEntity.ok(users);\n }\n}\n\nTudo limpo, elegante, nos padrões. REST API Java funciona como um relógio se seus clientes são navegadores e aplicativos móveis que sabem quais dados precisam. Mas há um detalhe: o REST frequentemente sofre de over-fetching (excesso de dados) e under-fetching (falta de dados).
\n\nSuponha que um aplicativo móvel precise apenas do nome do usuário e do email. Uma requisição REST GET /api/users/1 retornará o objeto UserDTO completo com todos os campos, incluindo endereço, telefone, histórico de pedidos. Tráfego desnecessário, carga extra. Familiar?
\n\nGraphQL: o novato ambicioso
\n\nGraphQL é uma linguagem de consulta desenvolvida pelo Facebook (agora Meta) em 2012. GraphQL Java é a implementação da especificação para o ecossistema Java. Diferente do REST, o GraphQL tem um único ponto de entrada (geralmente /graphql), e o cliente decide quais campos precisa.
\n\nExemplo de esquema GraphQL em Java usando graphql-java e Spring Boot
\n\n// Definição do esquema (no arquivo schema.graphqls)\ntype Query {\n user(id: ID!): User\n users: [User]\n}\n\ntype User {\n id: ID!\n name: String!\n email: String!\n address: String\n phone: String\n}\n\n// Controlador GraphQL (Spring Boot + graphql-java-spring-boot-starter)\n@Component\npublic class UserGraphQLQuery implements GraphQLQueryResolver {\n\n @Autowired\n private UserService userService;\n\n public User user(Long id) {\n return userService.findById(id);\n }\n\n public List<User> users() {\n return userService.findAll();\n }\n}\n\nO cliente agora pode enviar uma consulta como esta:
\n\n{\n user(id: 1) {\n name\n email\n }\n}\n\nE receberá exatamente o que pediu: { "data": { "user": { "name": "Ivan", "email": "ivan@example.com" } } }. Nenhum lixo extra. Comparação entre GraphQL e REST neste aspecto é claramente favorável ao primeiro.
Quando o REST vence: casos para projetos Java
\n\nApesar de toda a magia do GraphQL, o REST continua sendo o rei em certos cenários. Serviços RESTful Java são ideais quando:
\n\n- \n
- Simplicidade e transparência