Ferry Food é uma aplicação backend robusta desenvolvida em Java com Spring Boot que implementa um sistema completo de gerenciamento de restaurantes, incluindo funcionalidades de cadastro de cozinhas, estados, cidades e restaurantes com seus endereços.
- Características
- Arquitetura
- Tecnologias
- Pré-requisitos
- Instalação
- Configuração
- API Endpoints
- Estrutura do Projeto
- Executando a Aplicação
- Testes
- Contribuindo
- Licença
- ✅ Arquitetura Hexagonal (Ports & Adapters) - Separação clara entre camadas
- ✅ CRUD Completo para Cozinhas, Estados, Cidades e Restaurantes
- ✅ Validação de Negócio com Domain Services
- ✅ Mapeamento de Dados com MapStruct
- ✅ Persistência em Banco de Dados MySQL com JPA/Hibernate
- ✅ Migrations Automáticas com Flyway
- ✅ RESTful API com Spring Web
- ✅ Injeção de Dependências com Spring IoC
- ✅ Transações Gerenciadas com Spring TX
- ✅ Tratamento de Exceções customizado
- ✅ Code Generation com Lombok
O projeto segue o padrão Hexagonal Architecture (Ports & Adapters), garantindo desacoplamento entre as camadas:
┌─────────────────────────────────────────────────────────────┐
│ CAMADA DE ENTRADA (Adapter) │
│ HTTP Controllers / REST Endpoints │
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ CAMADA DE APLICAÇÃO │
│ UseCases, DTOs, Mappers, Business Logic │
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ CAMADA DE DOMÍNIO │
│ Entities, ValueObjects, Domain Services, Ports (Interfaces)
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ CAMADA DE SAÍDA (Adapter) │
│ Persistence Adapters, JPA Repositories │
└──────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────▼──────────────────────────────┐
│ CAMADA DE INFRAESTRUTURA │
│ MySQL Database, Flyway Migrations │
└─────────────────────────────────────────────────────────────┘
| Camada | Responsabilidade | Tecnologia |
|---|---|---|
| HTTP Input | Receber requisições HTTP | Spring Web, REST Controllers |
| Application | Orquestrar lógica de negócio | UseCases, DTOs, Mappers |
| Domain | Regras de negócio | Entities, ValueObjects, Services |
| Persistence Output | Persistir dados | JPA, Hibernate, Repositories |
| Infrastructure | Banco de dados | MySQL, Flyway |
| Categoria | Tecnologia | Versão |
|---|---|---|
| Java | OpenJDK/Oracle JDK | 8+ |
| Framework | Spring Boot | 2.1.7 |
| Banco de Dados | MySQL | 5.7+ |
| ORM | JPA/Hibernate | 5.3.10 |
| Mapeamento | MapStruct | 1.5.5 |
| Migrations | Flyway | Latest |
| Build | Maven | 3.6+ |
| Lombok | Redução de Boilerplate | 1.18+ |
<!-- Spring Boot Starters -->
spring-boot-starter-web
spring-boot-starter-data-jpa
spring-boot-starter-validation
<!-- ORM & Database -->
mysql-connector-java
flyway-core
<!-- Mapeamento de Dados -->
mapstruct
<!-- Code Generation -->
lombok
<!-- Testes -->
spring-boot-starter-test
junit- Java 8+ instalado e configurado no PATH
- Maven 3.6+ instalado e configurado no PATH
- MySQL 5.7+ em execução
- Git para controle de versão
- Servidor MySQL executando
- Usuário com privilégios para criar banco de dados
- Porta padrão MySQL (3306) acessível ou configurável
# Java
java -version
# Maven
mvn -version
# MySQL
mysql --versiongit clone https://github.com/seu-usuario/ferry-food.git
cd ferry-foodmvn clean installEste comando:
- Remove compilações anteriores
- Baixa todas as dependências Maven
- Compila o projeto
- Executa os testes
mvn clean compileEdit src/main/resources/application.yml:
spring:
application:
name: ferry-food
jpa:
database: MYSQL
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL57Dialect
datasource:
url: jdbc:mysql://localhost:3306/zendb?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.jdbc.DriverPara aplicações em produção, use variáveis de ambiente:
export SPRING_DATASOURCE_URL=jdbc:mysql://seu-host:3306/seu-banco
export SPRING_DATASOURCE_PASSWORD=sua-senhaAs migrations SQL estão em:
src/main/resources/db/migration/
src/main/resources/db/testdata/
O Flyway executa automaticamente ao iniciar a aplicação.
http://localhost:8080
| Método | Endpoint | Descrição |
|---|---|---|
GET |
/cozinhas |
Listar todas as cozinhas |
GET |
/cozinhas/{id} |
Obter cozinha por ID |
POST |
/cozinhas |
Criar nova cozinha |
PUT |
/cozinhas/{id} |
Atualizar cozinha |
DELETE |
/cozinhas/{id} |
Deletar cozinha |
Exemplo - Criar Cozinha:
curl -X POST http://localhost:8080/cozinhas \
-H "Content-Type: application/json" \
-d '{
"nome": "Italiana"
}'Resposta:
{
"id": 1,
"nome": "Italiana"
}| Método | Endpoint | Descrição |
|---|---|---|
GET |
/estados |
Listar todos os estados |
GET |
/estados/{id} |
Obter estado por ID |
POST |
/estados |
Criar novo estado |
PUT |
/estados/{id} |
Atualizar estado |
DELETE |
/estados/{id} |
Deletar estado |
Exemplo - Criar Estado:
curl -X POST http://localhost:8080/estados \
-H "Content-Type: application/json" \
-d '{
"nome": "São Paulo"
}'| Método | Endpoint | Descrição |
|---|---|---|
GET |
/cidades |
Listar todas as cidades |
GET |
/cidades/{id} |
Obter cidade por ID |
POST |
/cidades |
Criar nova cidade |
PUT |
/cidades/{id} |
Atualizar cidade |
DELETE |
/cidades/{id} |
Deletar cidade |
Exemplo - Criar Cidade:
curl -X POST http://localhost:8080/cidades \
-H "Content-Type: application/json" \
-d '{
"nome": "São Paulo",
"estadoId": 1
}'| Método | Endpoint | Descrição |
|---|---|---|
GET |
/restaurantes |
Listar todos os restaurantes |
GET |
/restaurantes/{id} |
Obter restaurante por ID |
POST |
/restaurantes |
Criar novo restaurante |
PUT |
/restaurantes/{id} |
Atualizar restaurante |
DELETE |
/restaurantes/{id} |
Deletar restaurante |
Exemplo - Criar Restaurante:
curl -X POST http://localhost:8080/restaurantes \
-H "Content-Type: application/json" \
-d '{
"nome": "Pizzaria do Giovanni",
"taxaFrete": 5.50,
"logradouro": "Rua das Flores",
"numero": "123",
"complemento": "Apto 101",
"bairro": "Centro",
"cep": "01310-100",
"cidadeId": 1,
"cozinhaId": 1
}'Resposta:
{
"id": 1,
"nome": "Pizzaria do Giovanni",
"taxaFrete": 5.50,
"logradouro": "Rua das Flores",
"numero": "123",
"complemento": "Apto 101",
"bairro": "Centro",
"cep": "01310-100"
}ferry-food/
├── src/
│ ├── main/
│ │ ├── java/com/ferry/food/
│ │ │ ├── adapter/
│ │ │ │ ├── config/ # Configurações Spring
│ │ │ │ ├── input/http/
│ │ │ │ │ ├── controller/ # REST Controllers
│ │ │ │ │ ├── advice/ # Exception Handlers
│ │ │ │ │ └── config/ # Config HTTP
│ │ │ │ └── output/persistence/
│ │ │ │ ├── adapter/ # Repository Adapters
│ │ │ │ ├── entity/ # JPA Entities
│ │ │ │ ├── mapper/ # JPA Mappers
│ │ │ │ ├── repository/ # JPA Repositories
│ │ │ │ └── config/ # Config Persistence
│ │ │ ├── application/
│ │ │ │ ├── usecases/ # UseCase Implementations
│ │ │ │ ├── dtos/ # Data Transfer Objects
│ │ │ │ │ ├── input/ # DTOs de Entrada
│ │ │ │ │ └── output/ # DTOs de Saída
│ │ │ │ └── mappers/ # Application Mappers
│ │ │ ├── domain/
│ │ │ │ ├── entities/ # Domain Entities
│ │ │ │ ├── valueobjects/ # Value Objects
│ │ │ │ ├── ports/ # Interfaces (Contracts)
│ │ │ │ │ ├── input/ # Input Ports (UseCases)
│ │ │ │ │ └── output/ # Output Ports (Repositories)
│ │ │ │ ├── domainservices/ # Business Logic Services
│ │ │ │ └── exceptions/ # Custom Exceptions
│ │ │ └── Application.java # Spring Boot Main Class
│ │ └── resources/
│ │ ├── application.yml # Configurações
│ │ └── db/
│ │ ├── migration/ # Flyway Migrations
│ │ └── testdata/ # Test Data Scripts
│ └── test/ # Testes Unitários
├── pom.xml # Maven POM
└── README.md # Este arquivo
Controladores REST que recebem requisições HTTP e as delegam aos UseCases da aplicação.
Exemplo:
EstadoController.java- CRUD para EstadosCidadeController.java- CRUD para CidadesCozinhaController.java- CRUD para CozinhasRestauranteController.java- CRUD para Restaurantes
Implementações dos casos de uso que orquestram a lógica de negócio.
Exemplo:
CriarEstadoImpl.java- Lógica de criação de EstadoListarEstadosImpl.java- Lógica de listagem de Estados
Entidades de domínio que representam os conceitos principais do negócio.
Exemplo:
Estado.java- Entidade de EstadoCidade.java- Entidade de CidadeRestaurante.java- Entidade de Restaurante
Adapters que implementam os ports definidos no domínio, fornecendo acesso aos dados.
mvn spring-boot:runmvn clean package
java -jar target/ferry-food-0.0.1-SNAPSHOT.jar- Abra o projeto em IntelliJ
- Navegue até
Application.java - Clique em "Run" (Shift + F10)
# Verificar se o servidor está respondendo
curl http://localhost:8080/cozinhas
# Você deve receber um JSON vazio ou com dados
[]A aplicação exibe logs no console:
2026-03-31 12:00:00.000 INFO 12345 --- [ main] c.f.f.Application : Starting Application
2026-03-31 12:00:05.000 INFO 12345 --- [ main] c.f.f.Application : Started Application in 5.123 seconds
mvn testmvn test -Dtest=EstadoControllerTestmvn test jacoco:report
# Relatório em: target/site/jacoco/index.html- Postman - Teste HTTP com interface gráfica
- Curl - Teste HTTP via linha de comando
- JUnit 4 - Framework de testes unitários
- Mockito - Mocking de dependências
O projeto segue princípios de DDD:
- Entities: Objetos com identidade única
- Value Objects: Objetos sem identidade, imutáveis
- Domain Services: Lógica que não pertence a uma entity
- Aggregates: Grupos de entities relacionadas
- Repositories: Abstração para persistência
Separa a aplicação em 3 áreas:
- Driving Side - Como o mundo exterior se comunica (Controllers)
- Core - Lógica de negócio (UseCases, Entities)
- Driven Side - Como a aplicação se comunica com o exterior (Repositories)
Framework que mapeia DTOs para Entities automaticamente em tempo de compilação.
@Mapper(componentModel = "spring")
public interface EstadoOutputMapper {
EstadoDTO toDTO(EstadoJpaEntity entity);
List<EstadoDTO> toDTOList(List<EstadoJpaEntity> entities);
}Solução:
# Verificar se MySQL está rodando
mysql -u root -p
# Ou iniciar o serviço
sudo systemctl start mysql # Linux
brew services start mysql # macOSSolução: O Flyway cria automaticamente. Verifique application.yml:
datasource:
url: jdbc:mysql://localhost:3306/zendb?createDatabaseIfNotExist=trueSolução:
# Usar porta diferente
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"Solução:
# Limpar cache Maven
rm -rf ~/.m2/repository
mvn clean install| Métrica | Valor |
|---|---|
| Total de Linhas de Código | ~4,000 |
| Arquivos Java | 114 |
| Controllers | 4 |
| UseCases | 20 |
| Entities | 6 |
| DTOs | 8 |
| Repositories | 6 |
- Autenticação e Autorização (JWT)
- Gerenciamento de Produtos/Menu
- Pedidos e Entregas
- Avaliações e Comentários
- Integração com Pagamentos
- Sistema de Notificações
- Dashboard Administrativo
- API GraphQL
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
- Use Java 8+
- Siga Google Java Style Guide
- Use Lombok para reduzir boilerplate
- Escreva testes para novas funcionalidades
- Mantenha a Arquitetura Hexagonal
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
Seu Nome
- GitHub: @seu-usuario
- Email: seu.email@example.com
Para suporte, abra uma issue no GitHub ou entre em contato através do email.
- Spring Boot Framework
- MapStruct
- Flyway
- MySQL Community
- Lombok
Última atualização: 31 de Março de 2026
Versão: 1.0.0