HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>С ростом проекта, в контроллерах становится больше кода - он начинает повторяться. Одни и те же сценарии появляются в разных местах, что приводит к необходимости использовать код повторно. Для решения этой задачи в Spring Boot используется<a><em>слой сервисов</em></a>(Service Layer):</p>
1 <p>С ростом проекта, в контроллерах становится больше кода - он начинает повторяться. Одни и те же сценарии появляются в разных местах, что приводит к необходимости использовать код повторно. Для решения этой задачи в Spring Boot используется<a><em>слой сервисов</em></a>(Service Layer):</p>
2 <p>Понятие "слой" указывает, как строятся зависимости между разными уровнями приложения. Конкретно слой сервисов строится поверх моделей. Он объединяет в себе их взаимодействие в рамках каких-то бизнес-сценариев: от простых CRUD-операций до закрытия счета, перевода денег между счетами и других комплексных взаимодействий.</p>
2 <p>Понятие "слой" указывает, как строятся зависимости между разными уровнями приложения. Конкретно слой сервисов строится поверх моделей. Он объединяет в себе их взаимодействие в рамках каких-то бизнес-сценариев: от простых CRUD-операций до закрытия счета, перевода денег между счетами и других комплексных взаимодействий.</p>
3 <p>В Spring Boot сервисы представлены классами с аннотацией @Service. Каждый класс обычно отвечает за связанный набор бизнес-сценариев, где каждый сценарий - это метод. В простейшем случае сервисы создаются по сущностям - например, PostService или UserService. Но могут быть и более сложные варианты - например, PaymentService, который часто не привязан к конкретной сущности.</p>
3 <p>В Spring Boot сервисы представлены классами с аннотацией @Service. Каждый класс обычно отвечает за связанный набор бизнес-сценариев, где каждый сценарий - это метод. В простейшем случае сервисы создаются по сущностям - например, PostService или UserService. Но могут быть и более сложные варианты - например, PaymentService, который часто не привязан к конкретной сущности.</p>
4 <p>Вот так может выглядеть сервис для постов<em>src/main/io/hexlet/spring/service/PostService.java</em>:</p>
4 <p>Вот так может выглядеть сервис для постов<em>src/main/io/hexlet/spring/service/PostService.java</em>:</p>
5 <p>И его использование:</p>
5 <p>И его использование:</p>
6 <p>На примере этого сервиса видно, что сервисы отвечают за:</p>
6 <p>На примере этого сервиса видно, что сервисы отвечают за:</p>
7 <ul><li>Взаимодействием между сущностями и их отображением на базу</li>
7 <ul><li>Взаимодействием между сущностями и их отображением на базу</li>
8 <li>Преобразованием из DTO и в DTO</li>
8 <li>Преобразованием из DTO и в DTO</li>
9 <li>Работу с исключениями, их генерацию и обработку</li>
9 <li>Работу с исключениями, их генерацию и обработку</li>
10 </ul><p>Обратите внимание, что сервисы не отвечают за логику приложения (Application Logic). Она включает в себя все, что касается работы самого фреймворка с точки зрения HTTP - например, работа с HTTP-запросом или HTTP-ответом. Сервисы не должны читать и устанавливать заголовки, выполнять редиректы и тому подобное. Все это должно делаться снаружи. В идеальной ситуации сервисы могут быть использованы не только в контроллерах, но и в CLI- интерфейсе.</p>
10 </ul><p>Обратите внимание, что сервисы не отвечают за логику приложения (Application Logic). Она включает в себя все, что касается работы самого фреймворка с точки зрения HTTP - например, работа с HTTP-запросом или HTTP-ответом. Сервисы не должны читать и устанавливать заголовки, выполнять редиректы и тому подобное. Все это должно делаться снаружи. В идеальной ситуации сервисы могут быть использованы не только в контроллерах, но и в CLI- интерфейсе.</p>
11 <p>Когда имеет смысл вводить сервисы? Многие программисты предпочитают любую логику добавлять сразу в сервисы. Несмотря на это, важно помнить, что любой новый слой добавляет сложность, которая может быть больше, чем получаемая выгода.</p>
11 <p>Когда имеет смысл вводить сервисы? Многие программисты предпочитают любую логику добавлять сразу в сервисы. Несмотря на это, важно помнить, что любой новый слой добавляет сложность, которая может быть больше, чем получаемая выгода.</p>