Layer, Onion, Clean, Hexagonal Architecture

Layer Architecture

  • Structur of layer Architecture

src/
└── com/example/app/
    ├── controller/           # Handles HTTP requests (UI layer)
    │   └── UserController.java
    ├── service/              # Business logic
    │   └── UserService.java
    ├── repository/           # Data access
    │   └── UserRepository.java
    └── model/                # Entities / DTOs
        └── User.java

problem : UserService is tightly coupled to UserRepository as metionned below


public class UserService {
    private UserRepository userRepository = new UserRepository();
    public void registerUser(User user) {
        if (!user.getEmail().contains("@")) {
            throw new IllegalArgumentException("Invalid email");
        }
        userRepository.save(user);
    }
}

Onion Architecture

  • Structur of Onion Architecture

    src/
    └── com/example/app/
    ├── domain/
    │ ├── model/ # Core entities
    │ │ └── User.java
    │ ├── port/ # Interfaces (like UserRepository)
    │ │ └── UserRepository.java
    │ └── usecase/ # Business use cases
    │ └── RegisterUserUseCase.java
    ├── infrastructure/
    │ └── repository/ # Implements ports
    │ └── InMemoryUserRepository.java
    └── web/
    └── controller/ # CLI / REST / UI
    └── UserController.java



src/
└── com/example/app/
    ├── entities/            # Enterprise-wide business rules
    │   └── User.java
    ├── usecases/            # Application-specific business logic
    │   └── RegisterUser.java
    ├── interfaceadapters/   # DTOs, Presenters, Gateways
    │   ├── controller/
    │   │   └── UserController.java
    │   └── repository/
    │       └── UserRepositoryImpl.java
    └── frameworks/
        ├── db/
        │   └── UserJpaRepository.java
        └── web/
            └── SpringBootApp.java

Hexagonal Architecture

  • Structur of clean Architecture

src/
└── com/example/app/
    ├── application/         # Core logic (use cases)
    │   └── RegisterUser.java
    ├── domain/              # Domain models & business rules
    │   └── User.java
    ├── ports/               # Interfaces (input/output)
    │   ├── input/
    │   │   └── RegisterUserInputPort.java
    │   └── output/
    │       └── UserRepositoryPort.java
    ├── adapters/            # Implementations of ports
    │   ├── inbound/         # Web, CLI, etc.
    │   │   └── RestControllerAdapter.java
    │   └── outbound/        # DB, email, etc.
    │       └── JpaUserRepositoryAdapter.java
    └── config/              # App wiring (DI, configs)
        └── ApplicationConfig.java

exemple de code : https://github.com/SvenWoltmann/hexagonal-architecture-java/tree/main