Arquitetura Hexagonal (Ports and Adapters)
Vamos falar um pouco aqui sobre Arquitetura Hexagonal, também conhecida como Ports and Adapters.
A proposta aqui é algo mais prático. Para mais detalhes, nada melhor que conferir o artigo do criador, Alistair Cockburn:
🔗 https://alistair.cockburn.us/hexagonal-architecture
A ideia central dessa arquitetura é separar domínio e infraestrutura de forma elegante.
🧱 Conceitos básicos
-
Domínio no centro:
A lógica de negócio fica no núcleo da aplicação. A ideia é que ela esteja livre de dependências externas — esse é um dos grandes motivos para adotar essa arquitetura. -
Ports:
Interfaces que definem os pontos de entrada (in) e saída (out) da aplicação. -
Adapters:
Implementações específicas que conectam os ports às tecnologias externas, como APIs REST, mensagerias, bancos de dados ou interfaces gráficas.
Essa separação promove um design mais limpo e facilita a manutenção e os testes da aplicação.
✅ Vantagens
-
Isolamento do domínio: Regra de negócio independente
-
Testabilidade: Fácil testar sem depender da infraestrutura
-
Flexibilidade: Troca fácil de banco, API, UI etc
-
Manutenção: Código mais limpo e organizado
-
Evolução tecnológica: Adapta-se bem a novas tecnologias
⚠️ Desvantagens
-
Complexidade inicial: Mais camadas, mais arquivos
-
Overengineering: Pode ser exagerado para projetos simples
-
Boilerplate: Muito código repetitivo
-
Mais mocks: Testes unitários mais verbosos
-
Integração com frameworks: Pode exigir ajustes para desacoplar
🧩 Exemplo de estrutura utilizando Java / Spring
customer-registration
└── src/main/java/br/com/emersonmendes/hexagonal
├── adapter
│ ├── in
│ │ ├── messaging
│ │ │ └── CustomerConsumer.java
│ │ └── web
│ │ └── CustomerController.java
│ └── out
│ ├── client
│ │ └── CustomerFeignClient.java (Interface)
│ └── repository
│ │ └── CustomerRepository.java (Interface)
│ └── CustomerOutputAdapter.java
├── application
│ ├── core
│ │ ├── domain
│ │ │ └── Customer.java
│ │ └── usecase
│ │ └── CustomerUseCase.java
│ └── ports
│ ├── in
│ │ └── CustomerInputPort.java (Interface)
│ └── out
│ └── CustomerOutputPort.java (Interface)
├── config
│ └── SecurityConfig.java
└── Application.java
🔗 Repositório com a estrutura mais completa:
https://github.com/emersonmendes/hexagonal