DEV Community

Kaciany Ramos
Kaciany Ramos

Posted on

Arquitetura Hexagonal vs MVC com Java Spring Boot

A Arquitetura Hexagonal (ou Ports and Adapters) foi criada por Alistair Cockburn com o objetivo de tornar os sistemas mais flexíveis, desacoplados e testáveis. Já o Modelo MVC (Model-View-Controller) é uma abordagem clássica para organizar aplicações, separando a lógica de apresentação, controle e modelo de dados.

📌 Diferenças entre Arquitetura Hexagonal e MVC

1. Estrutura e Organização

Característica Arquitetura Hexagonal MVC
Separação de responsabilidades Domínio, Aplicação e Infraestrutura Model, View, Controller
Desacoplamento Alto (depende apenas das interfaces) Médio (Controller depende da View e Model)
Testabilidade Alta (testes de unidade mais fáceis) Média (testes dependem do framework)
Escalabilidade Melhor adaptação a mudanças tecnológicas Boa para aplicações menores
Flexibilidade Alta (troca de tecnologias sem impacto no domínio) Média (depende do framework)

2. Vantagens e Desvantagens

✅ Vantagens da Arquitetura Hexagonal:

  • Independência de frameworks e tecnologia.
  • Código mais modular e reutilizável.
  • Testes mais fáceis devido ao isolamento do domínio.
  • Melhor organização para aplicações grandes e escaláveis.

❌ Desvantagens da Arquitetura Hexagonal:

  • Complexidade inicial maior.
  • Pode ser excessivo para aplicações simples.
  • Maior curva de aprendizado para quem está acostumado com MVC.

✅ Vantagens do MVC:

  • Mais simples de implementar em pequenos projetos.
  • Melhor suporte em frameworks como Spring Boot, Django, Laravel.
  • Código estruturado de forma mais intuitiva para iniciantes.

❌ Desvantagens do MVC:

  • Maior acoplamento entre as camadas.
  • Difícil evolução sem quebrar partes do sistema.
  • Pode levar a problemas de manutenção em aplicações grandes.

🚀 Cenários de Aplicação

Cenário Melhor opção
Aplicações simples e CRUDs MVC
Sistemas corporativos escaláveis Hexagonal
Microservices Hexagonal
Prototipação rápida MVC
Sistemas altamente testáveis Hexagonal

🏗️ Aplicação Prática - Exemplo com Arquitetura Hexagonal

Estrutura do Projeto

hexagonal-architecture-example/
├── src/
│   ├── main/
│   │   ├── java/com/exemplo/
│   │   │   ├── domain/           # Regras de negócio
│   │   │   ├── application/      # Casos de uso
│   │   │   ├── infrastructure/   # Infraestrutura
│   │   │   │   ├── repository/  # Persistência de dados
│   │   │   │   ├── controller/  # API REST
│   │   │   ├── HexagonalApplication.java
│   ├── test/
Enter fullscreen mode Exit fullscreen mode

1. Criando o Domínio (Core)

Definimos a entidade User e a porta (UserRepository), que será usada para persistência.

package com.exemplo.domain;

public class User {
    private Long id;
    private String name;
    private String email;

    public User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public Long getId() { return id; }
    public String getName() { return name; }
    public String getEmail() { return email; }
}
Enter fullscreen mode Exit fullscreen mode
package com.exemplo.domain;

import java.util.List;
import java.util.Optional;

public interface UserRepository {
    User save(User user);
    Optional<User> findById(Long id);
    List<User> findAll();
}
Enter fullscreen mode Exit fullscreen mode

2. Criando a Aplicação (Use Cases)

A classe UserService implementa a lógica de cadastro e recuperação de usuários.

package com.exemplo.application;

import com.exemplo.domain.User;
import com.exemplo.domain.UserRepository;
import java.util.List;
import java.util.Optional;

public class UserService {
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User registerUser(String name, String email) {
        User user = new User(null, name, email);
        return userRepository.save(user);
    }

    public Optional<User> getUserById(Long id) {
        return userRepository.findById(id);
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}
Enter fullscreen mode Exit fullscreen mode

3. Criando a Infraestrutura (Adapters)

Implementamos a persistência usando Spring Data JPA.

package com.exemplo.infrastructure.repository;

import com.exemplo.domain.User;
import com.exemplo.domain.UserRepository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserJpaRepository extends JpaRepository<User, Long>, UserRepository {
}
Enter fullscreen mode Exit fullscreen mode

Criamos um controlador REST para expor a API.

package com.exemplo.infrastructure.controller;

import com.exemplo.application.UserService;
import com.exemplo.domain.User;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/users")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping
    public User createUser(@RequestParam String name, @RequestParam String email) {
        return userService.registerUser(name, email);
    }

    @GetMapping("/{id}")
    public Optional<User> getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }
}
Enter fullscreen mode Exit fullscreen mode

Conclusão

A Arquitetura Hexagonal oferece maior flexibilidade e desacoplamento, sendo ideal para sistemas escaláveis e de longa duração. Já o MVC é mais simples e direto, sendo útil para projetos menores e rápidos.

📌 Se quiser testar o projeto, configure um banco de dados H2 ou PostgreSQL, e rode com Spring Boot!

🎯 Cursos e Projetos Práticos

  • Criar um CRUD simples usando MVC para comparar.
  • Implementar um microserviço usando Arquitetura Hexagonal.
  • Desenvolver testes unitários para validar a separação de camadas.

Gostou? Faça um fork e contribua! 🚀

📌 Repositório GitHub: [https://github.com/Kaciany/hexagonal-architecture-example]

AWS Q Developer image

Your AI Code Assistant

Generate and update README files, create data-flow diagrams, and keep your project fully documented. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

Top comments (0)

AWS Q Developer image

Your AI Code Assistant

Automate your code reviews. Catch bugs before your coworkers. Fix security issues in your code. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

👋 Kindness is contagious

Engage with a wealth of insights in this thoughtful article, valued within the supportive DEV Community. Coders of every background are welcome to join in and add to our collective wisdom.

A sincere "thank you" often brightens someone’s day. Share your gratitude in the comments below!

On DEV, the act of sharing knowledge eases our journey and fortifies our community ties. Found value in this? A quick thank you to the author can make a significant impact.

Okay