Pular para o conteúdo principal

TP3.2 — Aplicação CRUD Completa (Modo Autônomo)

Desafio Autônomo

Este TP retoma exatamente o mesmo enunciado do TP3.1, mas sem nenhum código fornecido. Você deve realizar tudo por conta própria. Se ficar bloqueado, consulte o TP3.1 como referência.

Duração estimada: 2h a 3h

Pré-requisitos: Ter compreendido os conceitos do Módulo 3 (arquitetura em camadas, Spring Data JPA, API REST)


Contexto​

Você é desenvolvedor backend em uma escola. Foi solicitado que você crie uma API REST para gestão de estudantes com Spring Boot.


O que você deve entregar​

Etapa 1 — Criar o projeto Spring Boot​

  • Crie um novo projeto Spring Boot via Spring Initializr
  • Escolha as dependências necessárias para:
    • Criar uma API REST
    • Utilizar um banco de dados em memória (H2)
    • Fazer persistência JPA
    • Validar os dados de entrada

Etapa 2 — Criar a entidade Student​

Crie uma entidade Student com os seguintes campos:

CampoTipoRestrições
idLongChave primária, auto-gerada
firstNameStringObrigatório, entre 2 e 50 caracteres
lastNameStringObrigatório, entre 2 e 50 caracteres
emailStringObrigatório, formato de e-mail válido, único
ageIntegerObrigatório, entre 18 e 100
programStringObrigatório (ex: "Informática", "Engenharia de Software")

Etapa 3 — Criar o Repository​

  • Crie uma interface Repository para a entidade Student
  • Adicione um método para verificar se um e-mail já existe
  • Adicione um método para buscar estudantes por programa

Etapa 4 — Criar o Service​

Crie um Service que implemente a seguinte lógica de negócio:

  • Recuperar todos os estudantes
  • Recuperar um estudante pelo seu ID — se o estudante não existir, lançar uma exceção apropriada
  • Criar um estudante — verificar se o e-mail já não está sendo utilizado antes de salvar. Se o e-mail já existir, retornar um erro 409 (Conflict)
  • Editar um estudante — verificar se o estudante existe, então atualizar suas informações
  • Excluir um estudante — verificar se o estudante existe, então removê-lo

Etapa 5 — Criar o Controller REST​

Crie um Controller que exponha os seguintes endpoints:

Método HTTPURLAçãoCódigo de retorno esperado
GET/api/studentsLista de todos os estudantes200 OK
GET/api/students/\{id\}Detalhe de um estudante200 OK ou 404 Not Found
POST/api/studentsCriar um estudante201 Created ou 409 Conflict
PUT/api/students/\{id\}Editar um estudante200 OK ou 404 Not Found
DELETE/api/students/\{id\}Excluir um estudante204 No Content ou 404 Not Found
  • Os dados enviados em POST e PUT devem ser validados automaticamente
  • Se a validação falhar, retornar o código 400 Bad Request

Etapa 6 — Configurar o banco de dados H2​

  • Configure a aplicação para usar um banco de dados H2 em memória
  • Ative o console H2 para poder visualizar os dados no navegador
  • O console deve ser acessível na URL /h2-console

Etapa 7 — Testar todos os endpoints​

Teste sua API com Postman (ou ferramenta equivalente). Você deve realizar e capturar os seguintes testes:

  1. Criar 3 estudantes (POST) — verificar o código 201
  2. Listar todos os estudantes (GET) — verificar que existem 3
  3. Recuperar um estudante por ID (GET) — verificar os dados
  4. Editar um estudante (PUT) — alterar seu programa, verificar a atualização
  5. Excluir um estudante (DELETE) — verificar o código 204
  6. Relistar todos os estudantes — verificar que restam apenas 2
  7. Testar erros:
    • GET em um ID inexistente → 404
    • POST com um e-mail já utilizado → 409
    • POST com um e-mail inválido → 400
    • POST com nome vazio → 400

Exercícios bônus​

Bônus 1 — Busca por programa​

Adicione um endpoint que permita buscar estudantes por programa:

GET /api/students/program/{program}

Por exemplo: GET /api/students/program/Informática retorna todos os estudantes de Informática.


Bônus 2 — Estatísticas​

Adicione um endpoint que retorne estatísticas:

GET /api/students/stats

O JSON retornado deve conter:

  • O número total de estudantes
  • A média de idade
  • O número de estudantes por programa

Bônus 3 — Paginação​

Modifique o endpoint GET /api/students para suportar paginação:

GET /api/students?page=0&size=10&sort=lastName

Bônus 4 — Gestão centralizada de erros​

Crie um handler global de exceções que:

  • Retorne mensagens de erro claras em JSON
  • Trate os casos: estudante não encontrado (404), e-mail duplicado (409), validação falhou (400)

Formato esperado da resposta de erro:

{
"status": 404,
"message": "Estudante não encontrado com o ID: 99",
"timestamp": "2025-01-15T10:30:00"
}

Bônus 5 — Migração para PostgreSQL​

Substitua o H2 por PostgreSQL:

  • Crie um banco de dados studentdb no PostgreSQL
  • Modifique a configuração para apontar para o PostgreSQL
  • Verifique que os dados persistem após reiniciar a aplicação

Entregáveis​

#EntregávelFormato
1Código-fonte completo do projetoRepositório Git ou ZIP
2Capturas de tela do Postman dos 10 testes (7 + 3 erros)Imagens
3Captura de tela do console H2 com dadosImagem
4Pelo menos 2 exercícios bônus completosCódigo
5Respostas às perguntas de revisão (abaixo)Documento de texto

Perguntas de revisão​

Responda a estas perguntas com suas próprias palavras:

  1. Qual é a responsabilidade de cada camada (Controller, Service, Repository)?
  2. Por que separamos o código em camadas distintas?
  3. Qual a diferença entre @RestController e @Service?
  4. Como o Spring Data JPA gera as queries SQL automaticamente?
  5. Qual código HTTP deve ser retornado após uma criação bem-sucedida? E após uma exclusão?
  6. Por que verificar a unicidade do e-mail no Service e não apenas no banco de dados?
  7. O que acontece se enviarmos um JSON inválido para o Controller?
  8. Qual a diferença entre findById() que retorna um Optional e um método que retorna diretamente o objeto?

Critérios de avaliação​

CritérioPontos
Arquitetura em camadas corretamente implementada (Controller → Service → Repository)20%
Entidade Student com todas as validações15%
Repository com métodos personalizados10%
Service com lógica de negócio completa (verificações, exceções)20%
Controller com os 5 endpoints CRUD funcionais20%
Testes Postman bem-sucedidos (casos normais + casos de erro)10%
Exercícios bônus5%
Total100%

Dica

Se você ficar bloqueado, não permaneça mais de 15 minutos em um problema. Consulte o TP3.1 para ver como foi feito, depois volte aqui e tente refazer sem olhar.


⬅️ TP3.1: Arquitetura CRUD (guiado) | ⬅️ Voltar ao Módulo 3