Esse arquivos contem sugestões de desafios para melhorar a API contida nesse repositório.
Após cada parte deste desafio, como entrega da atividade, enviar o link do repositório criado (no LinkedIn ou por email).
Antes de você começar a melhorar essa API REST, recomendo ler os artigos abaixo para alinhar o conhecimento sobre Java, REST, Spring, SOLID e o padrão MVC (Model View Controller):
- Patterns Java Orientação a Objetos
- Programação Orientada a Objetos (POO)
- Polimorfismo (Java)
- Herança + Interfaces (Java)
- REST
- SPRING-BOOT, como começar?
- SOLID
- SOLID para Devs de alta performance
- MVC
- Introdução ao Padrão MVC
- Evolução do MVC para REST
- Conceitos Spring Data Jpa
Na primeira parte desse desafio, o objetivo vai ser de atualizar a estrutura do projeto, e completar o CRUD (Create, Read, Update e Delete) do Controller.
- O versionamento do nosso código é algo muito importante, para cada tarefa que está sendo solicitada for concluída, faça um commit para o seu repositório.
- Crie uma camada de
Service
para ser usada entre a camada deController
e deRepository
.- Atual: Controller --> Repository
- Esperado: Controller --> Service --> Repository
Usar uma camada de Service
é uma boa prática para separar as responsabilidades no projeto, pois as regras de negocio serão implementada nesta camada no lugar de ficar na camada de Controller (que tem como responsabilidade de ser a camada de entrada e saida de dados).
Referência a respeito de separação de conceitos
- Complete o CRUD com os endpoints de
UPDATE
eDELETE
usando o CPF como PathVariable.- Atual: POST + GET
- Esperado: POST + GET + PUT + DELETE
Vamos agora aplicar o conceito de DTO (Data Transfer Object) ao nosso projeto. Para não utilizar as nossas Entidades como objeto de entrada e saida do nosso projeto. Isso é geralmente considerado uma boa prática no desenvolvimento de API para evitar manipular dados desnecessarios ou retornar dados sigilosos.
Seguem algumas referências a respeito:
- Crie os DTOs para usar como objetos de requisição (
UserForm
) e respostas (UserResponse
) na camada deController
, e faça a adequação dos objetos (DTO para Entidades e vice versa) na camada deService
.
Quando usamos DTOs, queremos aproveitar para validar que os dados enviados para nossa API sejam válidos. Para isso, podemos usar anotações que podem avaliar o formato nos quais os campos foram preenchidos.
Seguem algumas referências a respeito:
- Validador Spring
- Validador dados com anotações
- Bean validation
- Validador Hibernate
- Validar CPF
- Regex
- Mapeamento Hibernate (DAO)
- Validando requisições e tratando exceções no Spring Boot
- Atualize as anotações necessárias para validar o formato dos campos de
CPF
,EMAIL
eNOME
do DTO de requisição (UserForm).
Queremos que nossa API sejam fácil de uso e clara no seu funcionamento para quem for consumir ela. Para isso, é importante garantir que os erros esperados e/ou inesperados sejam tratados de forma amigáveis. Uma boa prática é usar Exception Handlers para isso.
Seguem algumas referências:
- Crie uma classe de
Exception Handler
para retornarmensagens
ehttp status
amigáveis caso erros esperados ou inesperados ocorram no uso da sua API.
Testes unitários aumentam a qualidade de nosso código, eles testam o funcionamento de nossos métodos, um cenário de cada vez (sucessos e erros).
Seguem algumas referências:
- JUnit Tutorial
- JUnit
- JUnit e os seus primeiros testes
- Basico Mockito
- Testando código Java com Mockito
- Testes Unitarios em Controller
- Implementar os testes unitários da camada de
Service
e deController
da API.
Uma das habilidades mais importantes que um bom profissional de software deve ter é da escrita de documentações de alta qualidade. Para muitos, essa é uma tarefa difícil e traumática. Por exemplo, se uma API não for bem documentada, provavelmente, seus usuários encontrarão dificuldades para entender o seu funcionamento. Isso certamente influenciará na utilização dos serviços oferecidos em sua API.
Seguem algumas referências a respeito do Swagger, uma ferramenta permitindo você automatizar a criação da sua documentação:
- Dev Eficiente - Configure e utilize o Swagger para documentar e testar seus endpoints
- Documentando uma API Spring Boot com o Swagger
- Spring Boot e Swagger, documentando e testando a sua API REST
- Automatizar a documentação dos endpoints da API usando
Swagger
.
Após ter implementado as 4 primeiras partes do desafio com um CRUD completo de gerenciamento de usuário, escolhe qual tipo de API desenvolver baseado nele, dentro da lista abaixo:
- Nível 1: API de Loteria
- Nível 2: API de Endereços
- Nível 3: API de Vacinas
- Nível 4: API de Banco
- Nível 5: API de Veículos
Caso tenha implementado a quinta parte toda e quiser ir além, segue um sugestão de melhoria do nível 2 (API de cadastro de endereços)
Quando trabalhamos com Java e Banco de Dados (BDD), é muito importante ter um conhecimento básico sobre SQL pois é necessário interagir com o BDD no cotidiano para buscar informações ou resolver problemas.
Seguem algumas referências a respeito: