githubEdit

Архитектура типичного веб-сервиса на Spring

После того, как вы создадите пустой проект на Spring Boot (используя Spring Initializrarrow-up-right или плагин в вашей IDE), вам нужно будет определиться с тем, на какие части будет разделен ваш проект, где и какие файлы с исходным кодом будут лежать.

MVC

Spring использует архитектуру Model-View-Controller, сокращенно MVC. В такой архитектуре ваш проект разделяется на несколько слабо связанных слоев:

  • Модель (Model) - это ваши данные. В простейшем случае - то, что хранится в вашей БД + код обеспечивающий бизнес-логику.

  • Отображение (View) - это пользовательский интерфейс, например веб-страница с элементами отображения и редактирования вашей модели.

  • Контроллер (Controller) - то что связывает это все воедино, обрабатывает запросы от View и передает их в Model

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

Зачем это надо? В простых приложениях действительно можно все эти компоненты смешать в одну кучу. Возможно, вы когда-то писали простые десктопные приложения, размещая всю логику в обработчике нажатия на кнопку. И это работало и было просто.

Но как только вы захотите, например, сделать вторую кнопку с похожей логикой, вам придется или копипастить код и в ее обработчик. Или вынести всю работу с данными в некий отдельный класс, и вызывать из обработчиков его методы. Тадам, вот вы и изобрели модель.

Обособленность модели позволяет переиспользовать код и упрощает тестирование. Если ваша модель - вещь в себе, которая ничего не знает про веб или иной внешний интерфейс, вы сможете писать автоматические тесты или добавлять новые интерфейсы (например, взять код из веб-приложения и засунуть его в десктопное или в Android), вам не придется отвязывать бизнес-логику от работы с UI, если они изначально разделены.

Если по-прежнему непонятно, что это такое (как и DI, этот паттерн может показаться избыточно сложным для новичков), можно почитать различные статьи, где приводятся неплохие аналогии и объяснения, например https://skillbox.ru/media/code/chto_takoe_mvc_bazovye_kontseptsii_i_primer_prilozheniya/arrow-up-right или https://javarush.ru/groups/posts/2536-chastjh-7-znakomstvo-s-patternom-mvc-model-view-controllerarrow-up-right, или десятки их по запросу "MVC что это".

Реализация в Spring Boot

Структура проекта

Типичное приложение на Spring содержит классы, разделенные по слоям и разложенные в разные папки. Названия части из них более-менее стандартны.

Типичная структура исходного кода небольшого Spring Boot приложения

В приложении могут быть следующие пакеты с классами:

  • controllers - тут лежат контроллеры, классы, отвечающие за обработку HTTP запросов. Подробнее о них - в следующей главе.

  • services - тут лежат сервисы, содержащие основную бизнес-логику приложения. Они отделены от контроллеров, чтобы бизнес-логика не зависела от нюансов работы с HTTP или иными протоколами связи.

  • model и repositories - классы, хранящиеся в БД и репозитории для работы с ними (см главу Работа с БД через Hibernate)

  • Отдельно лежит сгенерированный главный класс приложения - на скриншоте выше это AppealService.kt, который содержит точку входа (метод main()) и который передает управление приложением фреймворку Spring.

  • Остальные пакеты содержат дополнительные классы приложения, не попадающие напрямую под одну из перечисленных категорий.

Last updated