Что такое Onion Architecture (Луковая архитектура)?

«Что такое Onion Architecture (Луковая архитектура)?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Onion Architecture — это архитектурный паттерн, основанный на принципах чистой архитектуры и зависимостей, направленных внутрь. Бизнес-логика (ядро) изолирована от внешних деталей (UI, БД, фреймворков).

Ключевые слои (от центра к периферии):

  1. Domain Model (Ядро): Содержит сущности и бизнес-правила. Не зависит ни от чего.
  2. Application Services (Слой приложения): Оркестрирует выполнение use-cases, координируя домен и внешний мир.
  3. Infrastructure (Инфраструктура): Реализует технические детали: репозитории (доступ к данным), внешние API, логирование.
  4. Presentation (Представление): Контроллеры, UI, API-ендпоинты.

Главный принцип: Внешние слои зависят от внутренних, но не наоборот. Это достигается за счёт инверсии зависимостей (DIP).

Пример структуры на Java:

// 1. DOMAIN LAYER (Ядро) - НЕТ зависимостей от фреймворков
public class Order {
    private Long id;
    private Money total;
    public boolean isValid() { /* бизнес-правило */ }
}
public interface OrderRepository { // Абстракция в ядре
    Order findById(OrderId id);
}

// 2. APPLICATION LAYER
public class OrderService {
    private final OrderRepository repository; // Зависимость от абстракции
    public Order getOrder(OrderId id) {
        return repository.findById(id);
    }
}

// 3. INFRASTRUCTURE LAYER - реализует абстракции ядра
@Repository
public class JpaOrderRepository implements OrderRepository {
    @Override
    public Order findById(OrderId id) {
        // JPA-специфичный код
    }
}

Преимущества:

  • Тестируемость: Ядро можно тестировать без фреймворков и БД.
  • Гибкость: Замена базы данных или UI не затрагивает бизнес-логику.
  • Сохранность: Бизнес-правила защищены от изменений во внешних слоях.