Найти тему
Andrey Kazakov Tech

Hexagonal Architecture / 2. Hexagonal architecture skeleton

Оглавление

Hexagonal Architecture / 2. Hexagonal architecture skeleton

Создадим каркас приложения, на основе которого будем рассматривать детали гексагональной архитектуры. Код доступен в GitHub

Немного о приложении, которое будем разрабатывать. В качестве идеи для приложения возьмем составление расписания и записи клиентов в салон красоты. Основной функционал приложения видится в следующем: составление расписания работы мастеров; запись к мастеру на процедуру; ведение карточек клиента; и многое другое.

Код приложения будет разбиваться на отдельные изолированные модули, соответствующие различным элементам гексагональной архитектуры. Сборка проекта будет реализована с помощью Gradle. Для каждого модуля мы сделаем отдельный модуль Gradle. Структура проекта:

Теперь более подробно о каждом модуле:

  • Верхний уровень - schedule это сам проект. build.gradle конфигурирует сборку проекта, которая потом будет использоваться другими модулями.
  • domain - здесь содержаться основные бизнес сущности нашего проекта и их логика. это самый внутренний слой нашего приложения.
  • application - уровень бизнес логики или сервисный слой. Этот модуль использует только модуль domain. Здесь же находятся интерфесы портов (для связи с внешним миром).
  • adapters - реализация портов. Здесь происходит непосредственное взаимодействие с базой данных, другими сервисами по различным протоколам, очередями сообщений. На этом уровне осуществляется только транспорт и построение необходимых объектов.
  • infrastructure - здесь находятся конфигурационные файлы spring, liquibase и остальная обвязка для запуска приложения.

Рассмотрим более подробно некоторые из файлов сборки:

Родительский модуль

Файл settings.gradle включает все модули для сборки проекта:

-2

Далее - build.gradle включает в себя общие настройки, управление версиями приложния и общую информацию для модулей проекта - секция subprojects содержит конфигурацию, которая применяется ко всем модулям:

-3

Важная часть файла сборки - dependencyManagement этот плагин позволяет импортировать maven bom, для использования в качестве управления зависимостями. В данном случае мы импортируем зависимости spring-boot.

Дочерние модули

В качестве примера рассмотрим модуль infrastructure. Данные модуль представляет собой верхний слой приложения, здесь собираются вместе модели, бизнес логика, реализации портов и адаптеров, здесь же производится конфигурация spring-boot приложения. Сам файл build.gradle:

-4

Здесь мы явно подключаем зависимости нашего проекта:

-5

А также подключаем spring-boot-web, для реализации REST веб сервиса:

-6

В остальных модулях проекта конфигурация немного отличается, в зависимости от фунционала модуля. В данный момент, реализация функционала выполнена в виде заготовок, чтобы только проверить работу приложения и не более того, например в модуле adapters.web присутствует только один контроллер, который отвечает теми же данными, что и были в него отправлены:

-7

Сборка и запуск приложения

Сборка приложения осуществляется через интерфейс IDE или консольной командой ./gradlew build. В случае удачной сборки, в консоль выведется следующая информация:

-8

Далее запустим приложение и проверим работу контроллера.

Запустим приложение, в случае, удачного запуска в выводе увидим следующий текст:

-9

Протестируем наш контроллер, с помощью RestClient:

-10

В ответ должны получить что-то вроде этого:

-11

Заключение

В этой части мы создали скелет проекта, для дальнейшего использования в развитии приложения, код проекта доступен в github: https://github.com/kazakovav/hex-architecture/commit/f2e37625ed34fd67bdcd7d2ef64f7a13a4e7f486. В качестве системы сборки был использован gradle. Был создан многомодульный проект gradle, каждый модуль которого содержит свой компонент гексагональной архитектуры.

В дальнейшем, используя этот скелет, мы будем развивать приложения для салонов красоты.

Подписывайся в телеграм

Список литературы

Building a Multi-Module Spring Boot Application with Gradle

GitHub - thombergs/buckpal at multi-module

Declaring Dependencies between Subprojects

Dependency Management Plugin