Hexagonal Architecture / 2. Hexagonal architecture skeleton
Создадим каркас приложения, на основе которого будем рассматривать детали гексагональной архитектуры. Код доступен в GitHub
Немного о приложении, которое будем разрабатывать. В качестве идеи для приложения возьмем составление расписания и записи клиентов в салон красоты. Основной функционал приложения видится в следующем: составление расписания работы мастеров; запись к мастеру на процедуру; ведение карточек клиента; и многое другое.
Код приложения будет разбиваться на отдельные изолированные модули, соответствующие различным элементам гексагональной архитектуры. Сборка проекта будет реализована с помощью Gradle. Для каждого модуля мы сделаем отдельный модуль Gradle. Структура проекта:
Теперь более подробно о каждом модуле:
- Верхний уровень - schedule это сам проект. build.gradle конфигурирует сборку проекта, которая потом будет использоваться другими модулями.
- domain - здесь содержаться основные бизнес сущности нашего проекта и их логика. это самый внутренний слой нашего приложения.
- application - уровень бизнес логики или сервисный слой. Этот модуль использует только модуль domain. Здесь же находятся интерфесы портов (для связи с внешним миром).
- adapters - реализация портов. Здесь происходит непосредственное взаимодействие с базой данных, другими сервисами по различным протоколам, очередями сообщений. На этом уровне осуществляется только транспорт и построение необходимых объектов.
- infrastructure - здесь находятся конфигурационные файлы spring, liquibase и остальная обвязка для запуска приложения.
Рассмотрим более подробно некоторые из файлов сборки:
Родительский модуль
Файл settings.gradle включает все модули для сборки проекта:
Далее - build.gradle включает в себя общие настройки, управление версиями приложния и общую информацию для модулей проекта - секция subprojects содержит конфигурацию, которая применяется ко всем модулям:
Важная часть файла сборки - dependencyManagement этот плагин позволяет импортировать maven bom, для использования в качестве управления зависимостями. В данном случае мы импортируем зависимости spring-boot.
Дочерние модули
В качестве примера рассмотрим модуль infrastructure. Данные модуль представляет собой верхний слой приложения, здесь собираются вместе модели, бизнес логика, реализации портов и адаптеров, здесь же производится конфигурация spring-boot приложения. Сам файл build.gradle:
Здесь мы явно подключаем зависимости нашего проекта:
А также подключаем spring-boot-web, для реализации REST веб сервиса:
В остальных модулях проекта конфигурация немного отличается, в зависимости от фунционала модуля. В данный момент, реализация функционала выполнена в виде заготовок, чтобы только проверить работу приложения и не более того, например в модуле adapters.web присутствует только один контроллер, который отвечает теми же данными, что и были в него отправлены:
Сборка и запуск приложения
Сборка приложения осуществляется через интерфейс IDE или консольной командой ./gradlew build. В случае удачной сборки, в консоль выведется следующая информация:
Далее запустим приложение и проверим работу контроллера.
Запустим приложение, в случае, удачного запуска в выводе увидим следующий текст:
Протестируем наш контроллер, с помощью RestClient:
В ответ должны получить что-то вроде этого:
Заключение
В этой части мы создали скелет проекта, для дальнейшего использования в развитии приложения, код проекта доступен в 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