Какую архитектуру приложения вы используете в проектах?

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

Ответ

В современных Java backend-проектах часто применяется многослойная архитектура (Layered Architecture), часто в сочетании с принципами DDD (Domain-Driven Design) и гексагональной архитектурой (Ports & Adapters).

Типичные слои:

  1. Presentation Layer (Контроллеры): Принимает HTTP-запросы (REST API, GraphQL), валидирует входные данные (DTO), возвращает ответы.
  2. Application Layer (Сервисы): Оркестрирует выполнение бизнес-операций, координирует работу доменного слоя. Содержит Use Cases или Application Services.
  3. Domain Layer (Ядро): Содержит основную бизнес-логику, сущности (Entities), объекты-значения (Value Objects), агрегаты (Aggregates) и репозитории (Repository Interfaces).
  4. Infrastructure Layer (Инфраструктура): Реализует технические детали: доступ к БД (JPA, JDBC), внешние API, сообщения (Kafka), кэширование. Здесь находятся реализации репозиториев.

Пример структуры проекта:

com.example.order
├── application              // Слой приложения
│   ├── service             // Application Services
│   ├── dto                 // Data Transfer Objects (Request/Response)
│   └── command             // Команды для CQRS
├── domain                  // Доменный слой
│   ├── model               // Сущности, Агрегаты (Order, OrderItem)
│   ├── valueobject         // Объекты-значения (Money, Address)
│   ├── repository          // Интерфейсы репозиториев (OrderRepository)
│   └── service             // Доменные сервисы (Domain Services)
└── infrastructure          // Инфраструктурный слой
    ├── persistence         // Реализации репозиториев (JPA, Spring Data)
    ├── web                 // REST Controllers
    └── messaging           // Адаптеры для Kafka/RabbitMQ

Дополнительные подходы:

  • CQRS (Command Query Responsibility Segregation): Разделение моделей для операций записи (Commands) и чтения (Queries).
  • Event-Driven Architecture: Использование событий (Events) для связи между сервисами (микросервисами) через брокеры сообщений (Kafka).