Esse projeto consiste em desenvolver uma aplicação semelhante a uma To-Do List (lista de tarefas). Nela será possível cadastrar tarefas, listar tarefas, buscar tarefas pelo ID, além de editar e excluir tarefas (CRUD).
CRUD (Create, Read, Update, Delete) é um acrônimo para as maneiras de se operar em informação armazenada. É um mnemônico para as quatro operações básicas de armazenamento persistente.
- Vídeo-aula 01: Introdução do projeto;
- Vídeo-aula 02: Inicialização do projeto com Spring Initializr e tabela H2 Database;
- Vídeo-aula 03: Criando e listando as tarefas (POST e GET);
- Vídeo-aula 04: Editando/atualizando e excluindo as tarefas (PUT e DELETE);
- Vídeo-aula 05: Documentando a aplicação com o Swagger;
- Vídeo-aula 06: Migrando o banco para o PostgreSQL e realizando Deploy no Heroku;
Resumo da vídeo-aula 01
Apresentação do projeto através de uma visão panorâmica, mostrando as etapas e tecnologias utilizadas.
Resumo da vídeo-aula 02
Após executar a aplicação, o console será aberto, informando que o Spring está funcionando, qual porta está utilizando, e qual é a URL de acesso.
Console: Parte 1
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-2-Imagem-1.png?raw=true)
Console: Parte 2
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-2-Imagem-2.png?raw=true)
Console: Parte 3
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-2-Imagem-3.png?raw=true)
Com a aplicação executando, após clicar no botão de
Run
na classeTodolistyoutubeApplication
, copiar o endereçoURL
informado no consolejdbc:h2:mem:todolistyoutube
, conforme imagem do Console: Parte 2, mostrada acima.Abrir o endereço
http://localhost:8080/h2-console
no navegador, e inserir o endereço copiado (mencionado acima) no campoJDBC URL
, conforme imagem abaixo.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-2-localhost-8080-h2-console.png?raw=true)
Resumo da vídeo-aula 03
Neste projeto, será utilizado o
Postman
como plataforma de desenvolvimento deAPI
, através da URLhttp://localhost:8080/api/v1/tasks
.
Para criar a primeira tarefa, utilize o método
POST
.Após isso, selecione
Body
->raw
->JSON
, digite o código abaixo e clique no botãoSEND
:
{
"title": "Gravando o terceiro vídeo",
"description":"Vídeo sobre criação e listagem de tarefas.",
"deadLine": "2021-09-30"
}
O valor retornado no console do
Postman
, através do métodoGET
, é mostrado abaixo:
{
"id": 1,
"title": "Gravando o terceiro vídeo",
"description": "Vídeo sobre criação e listagem de tarefas.",
"deadLine": "2021-09-30T00:00:00.000+00:00",
"createdAt": "2021-09-21T22:34:04.228+00:00",
"updatedAt": "2021-09-21T22:34:04.228+00:00"
}
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-3-Post-Task-Postman-localhost.png?raw=true)
Simulando erro, omitindo a informação de data no campo
deadLine
:
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-3-Simulando-Erro-500.png?raw=true)
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-3-Simulando-Erro-500-IntelliJ.png?raw=true)
Obtendo todas as tarefas criadas:
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-3-getAllTasks.png?raw=true)
Obtendo tarefa por ID:
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-3-getTaskById.png?raw=true)
Buscando todas as tarefas utilizando o
SELECT
naH2 Database
:
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-3-SELECT-H2-Database-AllTasks.png?raw=true)
Buscando somente as tarefas por
ID
utilizando oSELECT
naH2 Database
:
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-3-SELECT-H2-Database-TaskById.png?raw=true)
Resumo da vídeo-aula 04
Realizando a atualização (PUT) e exclusão (DELETE) de tarefas da nossa aplicação.
Lembrando que é necessário incluir a tarefa no banco de dados a cada atualização do código.
Isso é necessário porque o banco de dados atual não mantém o armazenamento das tarefas após ser desligado.
Isso será corrigido nas próximas aulas.
Excluindo a tarefa do banco de dados.
1ª Etapa: Método POST - Inserindo a tarefa.
{
"id": 1,
"title": "Gravando o quarto vídeo (04 de 06)",
"description": "Vídeo sobre update e delete das tarefas.",
"deadLine": "2021-09-27T19:00:00.000+03:00"
}
2ª Etapa: DELETE
Para esse método, o comando é vazio e, consequentemente, o retorno também.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-4-PUT-updateTaskById.png?raw=true)
Atualizando o título, a descrição e a data máxima da tarefa no banco de dados.
1ª Estapa: POST - Inserindo a tarefa.
{
"id": 1,
"title": "Gravando o quarto vídeo",
"description": "Vídeo sobre editar/atualizar e excluir as tarefas.",
"deadLine": "2021-10-05T00:00:00.000+00:00"
}
2ª Etapa PUT
Atualizando a tarefa.
{
"id": 1,
"title": "Gravando o quarto vídeo (04 de 06)",
"description": "Vídeo sobre update e delete das tarefas.",
"deadLine": "2021-09-27T19:00:00.000+03:00"
}
Retorno do método PUT.
{
"id": 1,
"title": "Gravando o quarto vídeo (04 de 06)",
"description": "Vídeo sobre update e delete das tarefas.",
"deadLine": "2021-09-27T19:00:00.000+03:00",
"createdAt": "2021-09-28T21:38:44.329+00:00",
"updatedAt": "2021-09-28T21:45:01.896+00:00"
}
Veja que após a atualização da tarefa através do método PUT, as datas de criação e atualização possuem horários diferentes.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-4-DELETE-deleteTaskById.png?raw=true)
Resumo da vídeo-aula 05
Refatoração: Ao passar uma tarefa utilizando o método POST, é necessário informar o horário. A partir disso, o banco de dados armazena considerando o fuso horário local.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-POST-Task.png?raw=true)
Envio do método POST
{
"title": "Gravando o quinto vídeo (05 de 06)",
"description": "Vídeo sobre documentação e refatoração do código.",
"deadLine": "2021-10-05T19:00:00"
}
Tarefa armazenada no banco de dados
{
"id": 1,
"title": "Gravando o quinto vídeo (05 de 06)",
"description": "Vídeo sobre documentação e refatoração do código.",
"deadLine": "2021-10-05T19:00:00",
"createdAt": "2021-10-05T19:21:20.731054",
"updatedAt": "2021-10-05T19:21:20.73111"
}
Informações no console
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-POST-Informacoes-Console.png?raw=true)
2021-10-05 19:21:20.686 INFO 967 --- [nio-8080-exec-4] c.k.t.controller.TaskController : Criando uma nova tarefa com as informações [Task(id=null, title=Gravando o quinto vídeo (05 de 06), description=Vídeo sobre documentação e refatoração do código., deadLine=2021-10-05T19:00, createdAt=null, updatedAt=null)]
Atualizando a tarefa no banco de dados
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-POST-Atualizando-Tarefa.png?raw=true)
Enviando pelo método PUT
{
"title": "Atualização: Gravando o quinto vídeo (05 de 06)",
"description": "Vídeo sobre documentação e refatoração do código.",
"deadLine": "2021-10-05T19:00:00"
}
Atualização no Banco de dados
{
"id": 1,
"title": "Atualização: Gravando o quinto vídeo (05 de 06)",
"description": "Vídeo sobre documentação e refatoração do código.",
"deadLine": "2021-10-05T19:00:00",
"createdAt": "2021-10-07T18:15:47.463402",
"updatedAt": "2021-10-07T18:18:34.990389"
}
Adicionando as dependências do
Springfox Swagger2
eSpringfox Swagger UI
no arquivopom.xml
:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
Criar o diretório
docs
no endereçosrc/main/java/com/kamilacode/todolistyoutube/
Criar a classe
SwaggerConfiguration.java
no diretóriodocs
.Depois de implementar a classe
src/main/java/com/kamilacode/todolistyoutube/docs/SwaggerConfiguration.java
Executar a aplicação, e abrir a URL da Documentação no Swagger
http://localhost:8080/swagger-ui.html#/
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-Documentacao-Swagger-UI.png?raw=true)
Gerenciador de Tarefas
Task-Controller
Adicionando mensagens para os erros retornados
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-Documentacao-Tratamento-Mensagem-Erro.png?raw=true)
Método: GET | Endereço: /api/v1/tasks | Listando todas as tarefas.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-Documentacao-Tratam-GET-Listando-Tarefas.png?raw=true)
Método: POST | Endereço: /api/v1/tasks | Criando uma nova tarefa.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-Documentacao-Tratam-POST-Criando-Tarefas.png?raw=true)
Método: GET | Endereço: /api/v1/tasks/{id} | Buscando uma tarefa pelo identificador único(ID).
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-Documentacao-Tratam-GET-Buscando-Tarefa.png?raw=true)
Método: PUT | Endereço: /api/v1/tasks/{id} | Atualizando uma nova tarefa existente.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-Documentacao-Tratam-PUT-Atualizando-Tarefa.png?raw=true)
Método: DELETE | Endereço: /api/v1/tasks/{id} | Excluindo uma tarefa existente.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-5-Documentacao-Tratam-DELETE-Excluindo-Tarefa.png?raw=true)
Resumo da vídeo-aula 06
Adicionando a dependência no arquivo pom.xml
todolistyoutube/pom.xml
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
Substituindo as configurações de banco de dados
src/main/resources/application.properties
spring.datasource.url=${JDBC_DATASOURCE_URL}
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
server.port=${PORT:8080}
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.maxActive=10
spring.datasource.maxIdle=5
spring.datasource.minIdle=2
spring.datasource.initialSize=5
spring.datasource.removeAbandoned=true
Criar o arquivo que informe ao Heroku que esse projeto utiliza a versão 11 do Java.
todolistyoutube/system.properties
java.runtime.version=11
Para instalar o Heroku: https://devcenter.heroku.com/articles/heroku-cli
1 - Esteja na branch master, para criar o app no Heroku. Comando no console:
$ heroku create
2 - Após criar o app, renomeie. Comando no console:
$ heroku apps:rename todolist-kamilacode-hmap
3 - Link com o nome do app renomeado: https://todolist-kamilacode-hmap.herokuapp.com/
4 - Enviar a branch master para o Heroku:
$ git push heroku master
Por alguma razão, que eu não consegui descobrir ainda, mesmo seguindo as etapas do tutorial, todas as minhas tentivas de build no Heroku falharam.
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-6-ERRO-Deploy-Heroku.png?raw=true)
Artigo de solução no site ExceptionError
Em resumo, adicionei as configurações abaixo.
1 - Adicionada a versão 3.1.0 do Maven Resources em Plugins;
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
</plugin>
2 - Adicionada o Encoding UTF-8 em Properties.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Após adicionar as configurações descritas acima, utilizei o comando
$ git push heroku master
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-6-BUILD-SUCCESS-Deploy-Heroku.png?raw=true)
Visualizando no terminal os logs:
$ heroku logs --tail
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-6-Heroku-Logs--tail.png?raw=true)
Utilizando o comando no terminal:
$ heroku addons:create heroku-postgresql
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-6-heroku-addons-create-heroku-postgresql.png?raw=true)
Visualizando as variáveis de configuração:
$ heroku config
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-6-Heroku-Config.png?raw=true)
Visualizando as informações do Heroku:
$ heroku pg
![](https://github.com/henriqueotogami/todolistyoutube/raw/master/src/main/resources/img/Aula-6-Heroku-PG.png?raw=true)
- Atom Material Icons;
- Codota AI Autocomplete for Java;
- GitToolBox;
- Material Theme UI;
- Nyan Progress Bar;
- One Dark Theme;
- Rainbow Brackets;
- Tabnine AI Code Completion;
As dependências listadas abaixo são obtidas a partir do site Spring Initializr.
- Spring Web:
Crie aplicativos da web, incluindo RESTFul, usando Spring MVC. Usa Apache Tomcat como o contêiner integrado padrão.;
- Spring Data JPA:
Persistir dados em armazenamentos SQL com Java Persistence API usando Spring Data e Hibernate.;
- H2 Database:
Fornece um banco de dados na memória rápido que suporta acesso JDBC API e R2DBC, com uma pegada pequena (2 MB). Suporta modos integrados e de servidor, bem como um aplicativo de console baseado em navegador.;
- Lombok:
Biblioteca de anotação Java que ajuda a reduzir o código clichê.
- Foto de capa by Clay Banks | Unsplash - Photos for everyone;
- Shields.io | Badges Info from Github
- Alexandre Sanlim | Badges Tech
- Faça um fork deste repositório (https://github.com/henriqueotogami/todolistyoutube/fork);
- Crie um branch com as suas modificações
git checkout -b meu-novo-recurso
; - Faça um commit
git commit -am 'Adicionando um novo recurso ...'
; - Faça um push
git push origin meu-novo-recurso
; - Crie uma nova pull request neste repositório.
Depois que sua solicitação (pull request) for aceita e adicionada (merged) ao ramo principal (branch main), você pode excluir sua branch tranquilamente.