2025-07-07.00-18-32.mp4
-
Arquitetura em camadas bem definida
-
Uso de DTOs como registros (Java
record) -
Injeção de dependências via construtor
- Tornando o código mais desacoplado e facilitando a testabilidade (sem uso de
@Autowireddiretamente nos campos).
- Tornando o código mais desacoplado e facilitando a testabilidade (sem uso de
-
API RESTful seguindo convenções HTTP
- POST
/v1/users→ cria novo usuário (201 Created + cabeçalhoLocation). - GET
/v1/users/{id}→ pesquisa por ID (200 OK ou 404 Not Found). - GET
/v1/users→ lista todos os usuários (200 OK). - PUT
/v1/users/{id}→ atualiza parcialmente um usuário (204 No Content). - DELETE
/v1/users/{id}→ remove usuário (204 No Content).
- POST
-
Tratamento de entradas e conversão de tipos
- Converte
String→Integerde forma segura e usaOptionalpara evitarNullPointerException.
- Converte
-
Uso de Spring Data JPA
UserRepositoryestendeJpaRepository, aproveitando métodos prontos comofindById,findAll,save,existsByIdedeleteById.
-
Atualização condicional de campos
- No método de update, só altera um campo se o valor no DTO for não-nulo, permitindo comportamento de patch.
-
Resposta padronizada e amigável
- Uso de
ResponseEntitypara controlar status HTTP e corpo de resposta de forma explícita.
- Uso de
-
Script de criação de tabela SQL
CREATE TABLE user_tb ( id SERIAL PRIMARY KEY, first_name VARCHAR(255), last_name VARCHAR(255), email VARCHAR(255), password VARCHAR(255) );
- Java 24
- Spring Boot 3.5.0
- Spring Web (Spring MVC)
- Spring Data JPA
- PostgreSQL 14
- Maven
-
Clone o repositório:
git clone https://github.com/seu-usuario/seu-projeto.git
-
Configure o banco de dados em
application.properties:spring.datasource.url=jdbc:postgresql://localhost:5432/seu_db spring.datasource.username=usuario spring.datasource.password=senha
-
Execute a aplicação:
mvn spring-boot:run
Pronto! A API estará disponível em http://localhost:8080/v1/users.
Os manifests em k8s/ criam um namespace, a API com duas réplicas e um PostgreSQL com volume persistente. A API fica disponível internamente no cluster; use kubectl port-forward para acessá-la localmente.
-
Inicie um cluster local. Exemplo para Windows Pro com Hyper-V:
minikube start --driver=hyperv --hyperv-virtual-switch="Default Switch" --disk-size=10g --cpus=2 --memory=4096 kubectl get nodes
Aguarde o nó ficar
Ready. O tamanho do disco deve caber no espaço disponível no computador. -
Gere o JAR e construa a imagem diretamente no Minikube (não requer Docker Desktop):
.\mvnw.cmd package minikube image build --tag api-rest-java:1.0 .
Para Kind, construa a imagem com Docker e carregue-a no cluster:
docker build -t api-rest-java:1.0 . kind load docker-image api-rest-java:1.0
Em outros clusters, publique a imagem em um registry acessível pelos nós e atualize
imageemk8s/api.yaml. -
Crie o namespace e o Secret do banco. Substitua os valores de exemplo, principalmente a senha:
kubectl apply -f k8s/namespace.yaml kubectl create secret generic postgres-credentials -n api-rest ` --from-literal=database=db123 ` --from-literal=username=user123 ` --from-literal=password=password123
O Secret não é armazenado nos manifests. Para produção, use uma senha forte e considere um gerenciador de Secrets; os valores em Secrets do Kubernetes não são criptografados por padrão no etcd.
-
Aplique os manifests e acompanhe os Pods:
kubectl apply -f k8s/ kubectl get pods -n api-rest
-
Quando os Pods estiverem prontos, encaminhe a porta e acesse a API:
kubectl port-forward -n api-rest service/public-api 8080:8080
A API estará em
http://localhost:8080/v1/users. O PVC do PostgreSQL requer umaStorageClasspadrão no cluster. Se alterar o nome do banco no Secret, atualize tambémSPRING_DATASOURCE_URLemk8s/api.yaml.

