terça-feira, 6 de maio de 2025

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