Перейти до вмісту

Spring

Матеріал з K2 ERP Wiki Ukraine — База знань з автоматизації та санкцій в Україні

Spring або Spring Framework — це популярний фреймворк для розробки Java-застосунків. Він використовується для створення backend-сервісів, REST API, вебзастосунків, мікросервісів, корпоративних систем, інтеграційних модулів, SaaS-платформ, ERP, CRM та інших бізнес-рішень.

Spring надає інфраструктуру для керування залежностями, конфігурацією, транзакціями, вебзапитами, доступом до баз даних, безпекою, тестуванням, інтеграціями та побудовою масштабованих Java-застосунків. Офіційна документація Spring Framework охоплює IoC Container, Events, Resources, Validation, Data Binding, AOP, Testing, Data Access, Spring MVC, WebSocket і WebFlux.

Важливо: Spring — це не одна бібліотека, а велика екосистема. До неї належать Spring Framework, Spring Boot, Spring Security, Spring Data, Spring Cloud, Spring Batch, Spring Integration та інші проєкти.

Загальний опис

Spring створений для спрощення розробки Java-застосунків. Він допомагає розробнику не писати всю інфраструктуру вручну, а використовувати готові механізми для типових задач: створення об’єктів, підключення сервісів, робота з базами даних, транзакції, REST API, авторизація, конфігурація, тестування і взаємодія із зовнішніми системами.

Ключова ідея Spring — Inversion of Control і Dependency Injection. Замість того щоб кожен клас сам створював потрібні йому залежності, Spring керує об’єктами застосунку та передає залежності автоматично.

На практиці Spring часто використовується разом зі Spring Boot. Spring Boot дозволяє швидко створювати stand-alone, production-grade Spring-застосунки, які можна запускати як звичайний Java-застосунок. Офіційна документація Spring Boot зазначає, що більшість Spring Boot-застосунків потребують мінімум Spring-конфігурації.

Зверніть увагу: у розмовній мові «Spring» часто означає всю екосистему, а «Spring Boot» — конкретний інструмент для швидкого запуску Spring-застосунків із готовими налаштуваннями.

Для чого використовується Spring

Spring використовується для розробки:

  • REST API;
  • backend-сервісів;
  • вебзастосунків;
  • мікросервісів;
  • ERP-модулів;
  • CRM-систем;
  • SaaS-платформ;
  • інтеграційних сервісів;
  • сервісів обробки подій;
  • систем електронного документообігу;
  • платіжних модулів;
  • сервісів роботи з базами даних;
  • систем авторизації;
  • batch-процесів;
  • корпоративних застосунків.

Основні можливості Spring

Spring може забезпечувати такі можливості:

  • Dependency Injection;
  • Inversion of Control;
  • конфігурацію застосунку;
  • роботу з beans;
  • AOP;
  • транзакції;
  • доступ до баз даних;
  • інтеграцію з JPA і Hibernate;
  • роботу з JDBC;
  • REST API;
  • Spring MVC;
  • WebFlux;
  • валідацію;
  • обробку помилок;
  • тестування;
  • безпеку через Spring Security;
  • batch-обробку;
  • інтеграцію з чергами;
  • роботу з подіями;
  • конфігурацію через properties або YAML;
  • actuator endpoint-и;
  • інтеграцію з Docker і Kubernetes у production-сценаріях.

Spring Framework

Spring Framework — це основа екосистеми Spring. Він містить базові механізми для створення Java-застосунків.

Основні частини Spring Framework:

  • Core Container;
  • Beans;
  • Context;
  • Expression Language;
  • AOP;
  • Data Access;
  • Transactions;
  • Web MVC;
  • WebFlux;
  • Testing.

Spring Framework можна використовувати без Spring Boot, але в сучасній розробці Spring Boot значно спрощує конфігурацію і запуск застосунків.

Spring Boot

Spring Boot — це проєкт Spring, який спрощує створення самостійних production-ready застосунків. Він надає автоконфігурацію, starter-залежності, вбудовані web-сервери, Actuator, зручну структуру запуску і мінімум ручних налаштувань.

Офіційна сторінка Spring Boot описує його як інструмент, який дозволяє легко створювати stand-alone, production-grade Spring based applications, які можна просто запускати.

Типові можливості Spring Boot:

  • швидкий старт проєкту;
  • автоконфігурація;
  • starter-залежності;
  • вбудований Tomcat, Jetty або Undertow;
  • запуск через java -jar;
  • profiles;
  • externalized configuration;
  • Actuator;
  • health checks;
  • metrics;
  • production-ready налаштування;
  • інтеграція з Maven і Gradle.

Практичне застосування: Spring Boot найчастіше використовують для швидкого створення REST API, мікросервісів, backend-модулів, інтеграційних сервісів і корпоративних застосунків.

Dependency Injection

Dependency Injection — це підхід, коли залежності класу передаються зовні, а не створюються всередині самого класу.

Без Dependency Injection клас може сам створювати залежності:

public class OrderService {
    private PaymentService paymentService = new PaymentService();
}

У Spring залежність зазвичай передається через конструктор:

@Service
public class OrderService {
    private final PaymentService paymentService;

    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

Так код стає легше тестувати, підтримувати і змінювати.

Beans

Bean у Spring — це об’єкт, яким керує Spring Container. Spring створює bean, налаштовує його, передає залежності й контролює його життєвий цикл.

Bean може бути:

  • сервісом;
  • репозиторієм;
  • контролером;
  • конфігураційним класом;
  • клієнтом зовнішнього API;
  • компонентом інтеграції;
  • обробником подій;
  • валідатором;
  • mapper-ом.

Типові анотації:

@Component
@Service
@Repository
@Controller
@RestController
@Configuration
@Bean

Spring Container

Spring Container відповідає за створення і керування beans.

Він виконує такі задачі:

  • сканує компоненти;
  • створює beans;
  • передає залежності;
  • читає конфігурацію;
  • керує життєвим циклом об’єктів;
  • застосовує AOP;
  • забезпечує доступ до ApplicationContext.

Конфігурація

Spring підтримує різні способи конфігурації:

  • Java configuration;
  • annotations;
  • application.properties;
  • application.yml;
  • environment variables;
  • profiles;
  • command-line arguments;
  • external configuration;
  • configuration classes.

Приклад application.yml:

server:
  port: 8080

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/k2
    username: k2_user

Рекомендація: паролі, токени, private keys і production connection strings не варто зберігати у відкритому application.yml. Для цього потрібно використовувати змінні середовища або secret-сховища.

Spring MVC

Spring MVC — це модуль для створення web-застосунків і REST API на основі servlet-моделі.

Spring MVC використовується для:

  • HTTP endpoint-ів;
  • REST API;
  • web-контролерів;
  • обробки JSON;
  • валідації запитів;
  • обробки помилок;
  • роботи з path variables;
  • роботи з query parameters;
  • завантаження файлів;
  • повернення HTTP-відповідей.

Приклад REST-контролера:

@RestController
@RequestMapping("/api/orders")
public class OrderController {
    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @GetMapping("/{id}")
    public OrderDto getOrder(@PathVariable Long id) {
        return orderService.getOrder(id);
    }
}

Spring WebFlux

Spring WebFlux — це reactive web framework у Spring. Він використовується для асинхронних і неблокуючих web-застосунків.

WebFlux може бути корисним, коли система має багато одночасних I/O-операцій:

  • звернення до зовнішніх API;
  • streaming;
  • websocket;
  • reactive pipelines;
  • високонавантажені сервіси;
  • асинхронна обробка даних.

Не плутати: Spring MVC і Spring WebFlux — це різні web-підходи. Для більшості звичайних REST API достатньо Spring MVC, а WebFlux потрібен тоді, коли справді є потреба в reactive-моделі.

Spring Data

Spring Data — це сімейство проєктів для спрощення роботи з даними. Воно допомагає створювати репозиторії, працювати з базами даних і зменшувати кількість шаблонного коду.

Spring Data може використовуватися з:

  • JPA;
  • JDBC;
  • R2DBC;
  • MongoDB;
  • Redis;
  • Elasticsearch;
  • Cassandra;
  • Neo4j;
  • іншими сховищами даних.

Приклад Spring Data JPA repository:

public interface OrderRepository extends JpaRepository<Order, Long> {
    List<Order> findByCustomerId(Long customerId);
}

Spring Security

Spring Security — це проєкт для автентифікації, авторизації та захисту застосунків.

Spring Security може забезпечувати:

  • login;
  • logout;
  • roles;
  • permissions;
  • password hashing;
  • JWT;
  • OAuth2;
  • OpenID Connect;
  • CSRF protection;
  • CORS configuration;
  • method-level security;
  • security filters;
  • захист REST API.

Для бізнес-систем: Spring Security важливий для ERP, CRM і SaaS, де потрібно контролювати ролі користувачів, доступ до документів, API, фінансових даних і адміністративних функцій.

Spring Transactions

Spring має зручну модель керування транзакціями. Вона дозволяє позначити метод як транзакційний, а Spring сам відкриє, підтвердить або відкотить транзакцію.

Приклад:

@Transactional
public void createOrder(CreateOrderRequest request) {
    Order order = orderService.create(request);
    paymentService.reservePayment(order);
    inventoryService.reserveItems(order);
}

Транзакції особливо важливі для:

  • документів ERP;
  • оплат;
  • складських рухів;
  • замовлень;
  • бухгалтерських проводок;
  • резервів;
  • інтеграцій із критичними даними.

Spring Batch

Spring Batch — це фреймворк для batch-обробки великих обсягів даних.

Він може використовуватися для:

  • імпорту файлів;
  • експорту даних;
  • нічних обробок;
  • масового перерахунку;
  • синхронізації каталогів;
  • формування звітів;
  • обробки банківських виписок;
  • формування SAF-T UA;
  • масового оновлення залишків;
  • інтеграційних задач.

Spring Integration

Spring Integration — це проєкт для побудови інтеграційних потоків між системами.

Він може використовуватися для:

  • обміну повідомленнями;
  • інтеграції через файли;
  • інтеграції через HTTP;
  • інтеграції через черги;
  • маршрутизації повідомлень;
  • трансформації форматів;
  • адаптерів до зовнішніх систем;
  • побудови integration pipelines.

Spring Cloud

Spring Cloud — це набір інструментів для мікросервісної та cloud-native архітектури.

Spring Cloud може використовуватися для:

  • service discovery;
  • centralized configuration;
  • API gateway;
  • circuit breaker;
  • distributed tracing;
  • load balancing;
  • cloud integrations;
  • event-driven systems.

Spring Actuator

Spring Boot Actuator додає production-ready endpoint-и для моніторингу та керування застосунком.

Actuator може надавати:

  • health check;
  • metrics;
  • info;
  • environment;
  • beans;
  • mappings;
  • loggers;
  • readiness;
  • liveness;
  • custom health indicators.

У production Actuator потрібно налаштовувати обережно, щоб не відкривати зайву технічну інформацію.

Spring Initializr

Spring Initializr — це сервіс для швидкого створення Spring Boot-проєкту. Через нього можна вибрати мову, build-систему, версію Spring Boot, залежності та отримати готовий шаблон проєкту.

Типові залежності:

  • Spring Web;
  • Spring Data JPA;
  • Spring Security;
  • PostgreSQL Driver;
  • Validation;
  • Actuator;
  • Lombok;
  • Flyway;
  • Liquibase;
  • Spring Batch.

Maven і Gradle у Spring

Spring-проєкти зазвичай збираються через Maven або Gradle.

Приклад Gradle-залежності:

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

Приклад Maven-залежності:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Типова структура Spring Boot-проєкту

Типова структура може виглядати так:

src/
  main/
    java/
      com/example/app/
        AppApplication.java
        controller/
        service/
        repository/
        entity/
        dto/
        config/
        integration/
    resources/
      application.yml
  test/
    java/
      com/example/app/

Spring у K2 ERP

У контексті K2 ERP Spring може використовуватися для розробки backend-сервісів, API, інтеграційних модулів, batch-процесів, мікросервісів і допоміжних технічних компонентів.

Spring може бути корисним для:

  • REST API K2 ERP;
  • інтеграцій із ДПС;
  • інтеграцій із ПРРО;
  • інтеграцій із LiqPay;
  • інтеграцій із M.E.Doc;
  • інтеграцій із EDIN;
  • інтеграцій із СОТА;
  • інтеграцій із FREDO;
  • модулів Shopify;
  • модулів Magento;
  • модулів Wix;
  • модуля Prom;
  • формування SAF-T UA;
  • обробки е-ТТН;
  • роботи з чергами;
  • batch-обробки;
  • авторизації користувачів;
  • роботи з PostgreSQL або іншими базами даних.

Для K2 ERP: Spring доцільно використовувати для backend-логіки, REST API, інтеграцій, batch-обробок і мікросервісів. Він добре поєднується з Java, Gradle, TeamCity, Docker, PostgreSQL і DevOps-процесом.

Типовий сценарій Spring-сервісу для K2 ERP

Типовий Spring-сервіс інтеграції може працювати так:

  1. K2 ERP створює документ або подію.
  2. Spring-сервіс отримує запит через REST API або чергу.
  3. Сервіс перевіряє вхідні дані.
  4. Сервіс перетворює дані у формат зовнішньої системи.
  5. За потреби виконується підписання, валідація або формування XML.
  6. Сервіс надсилає запит до зовнішнього API.
  7. Отримується відповідь.
  8. Статус повертається в K2 ERP.
  9. У журналі зберігаються технічні дані, помилки і результат обміну.

Spring і бази даних

Spring часто використовується з реляційними базами даних.

Типові СУБД:

  • PostgreSQL;
  • MySQL;
  • MariaDB;
  • Oracle Database;
  • Microsoft SQL Server;
  • H2 для тестів;
  • SQLite в окремих сценаріях.

Для роботи з базами можуть використовуватися:

  • Spring JDBC;
  • Spring Data JPA;
  • Hibernate;
  • Flyway;
  • Liquibase;
  • Transaction Management;
  • connection pool;
  • repository layer.

Spring і Docker

Spring Boot-застосунки часто упаковуються в Docker-образи.

Типовий Dockerfile:

FROM eclipse-temurin:21-jre
WORKDIR /app
COPY build/libs/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Docker дозволяє запускати Spring-сервіси однаково в local, test, staging і production.

Spring і Kubernetes

Spring Boot-сервіси можуть запускатися в Kubernetes.

У Kubernetes важливо налаштувати:

  • deployment;
  • service;
  • config maps;
  • secrets;
  • liveness probe;
  • readiness probe;
  • resource limits;
  • autoscaling;
  • logs;
  • metrics;
  • ingress;
  • rolling update;
  • rollback.

Spring і DevOps

Spring добре вписується в DevOps-процес.

Типовий pipeline:

  1. Git commit.
  2. TeamCity запускає build.
  3. Gradle виконує clean test build.
  4. Запускаються unit та integration tests.
  5. Створюється Docker image.
  6. Image публікується в registry.
  7. Застосунок розгортається в test.
  8. Виконуються smoke-тести.
  9. Після підтвердження виконується deployment у production.
  10. Actuator і моніторинг перевіряють стан сервісу.

Тестування Spring-застосунків

Spring має розвинену підтримку тестування.

Можна використовувати:

  • JUnit;
  • Mockito;
  • Spring Boot Test;
  • MockMvc;
  • TestRestTemplate;
  • WebTestClient;
  • Testcontainers;
  • H2;
  • WireMock.

Типові тести:

  • unit-тести сервісів;
  • repository-тести;
  • controller-тести;
  • integration-тести;
  • API-тести;
  • contract-тести;
  • тести транзакцій;
  • тести інтеграцій із зовнішніми API.

Безпека Spring-застосунків

Для безпечної розробки на Spring потрібно контролювати:

  • Spring Security;
  • автентифікацію;
  • авторизацію;
  • ролі;
  • права доступу;
  • захист REST API;
  • CORS;
  • CSRF для web-сценаріїв;
  • JWT;
  • OAuth2;
  • OpenID Connect;
  • валідацію вхідних даних;
  • SQL injection;
  • secrets management;
  • dependency scanning;
  • логування без секретів.

Безпека: у Spring-застосунках не можна виводити в логи паролі, access tokens, private keys, повні реквізити платіжних карток, ключі електронного підпису або зайві персональні дані.

Дані, які не варто зберігати в коді

У Spring-проєкті не варто зберігати безпосередньо в коді:

  • паролі;
  • токени API;
  • private keys;
  • production connection strings;
  • секрети електронного підпису;
  • сертифікати;
  • повні персональні дані клієнтів;
  • доступи до платіжних систем;
  • доступи до ДПС;
  • доступи до ЕДО;
  • ключі до хмарних сервісів.

Такі дані потрібно зберігати в захищених конфігураціях, secret-сховищах або змінних середовища.

Можливі помилки під час розробки

Під час роботи зі Spring можуть виникати такі помилки:

  • неправильна конфігурація beans;
  • circular dependency;
  • помилка dependency injection;
  • неправильний profile;
  • неправильна конфігурація datasource;
  • помилки міграцій бази;
  • LazyInitializationException;
  • неправильні транзакції;
  • N+1 query problem;
  • неправильні security rules;
  • відкриті Actuator endpoint-и;
  • помилки JSON serialization;
  • неправильна обробка exceptions;
  • дублювання бізнес-логіки в controller;
  • відсутність тестів;
  • зберігання секретів у application.yml.

Рекомендація: у Spring-проєктах бажано розділяти controller, service, repository, dto, entity, config та integration-шари. Це робить код зрозумілішим і спрощує тестування.

Переваги Spring

До основних переваг Spring можна віднести:

  • зрілу екосистему;
  • велику спільноту;
  • зручний Dependency Injection;
  • готові модулі для типових задач;
  • Spring Boot для швидкого старту;
  • хорошу підтримку REST API;
  • зручну роботу з базами даних;
  • транзакції;
  • Spring Security;
  • тестування;
  • підтримку мікросервісів;
  • інтеграцію з DevOps;
  • підтримку Maven і Gradle;
  • придатність для корпоративних систем.

Обмеження та ризики

Під час використання Spring потрібно враховувати:

  • складність великої екосистеми;
  • потребу в розумінні конфігурації;
  • можливість прихованої автоконфігурації;
  • складність Spring Security для новачків;
  • ризик надмірної кількості залежностей;
  • потребу в контролі версій;
  • потребу в тестах;
  • потребу в моніторингу;
  • потребу в правильному налаштуванні production;
  • ризик відкриття службових endpoint-ів.

Не плутати: Spring не замінює архітектуру застосунку. Він дає інструменти, але правильне розділення шарів, модель даних, безпека, транзакції, тести й DevOps залишаються відповідальністю команди.

Висновок

Spring — це одна з найпоширеніших екосистем для Java-розробки. Вона дозволяє створювати backend-сервіси, REST API, web-застосунки, мікросервіси, ERP-модулі, інтеграційні сервіси та корпоративні системи.

Для K2 ERP Spring може бути корисним як технологічна основа для Java backend-сервісів, інтеграцій із ДПС, ЕДО, ПРРО, LiqPay, Shopify, Magento, Wix, Prom, SAF-T UA, е-ТТН, batch-обробок і мікросервісів. Найкраще Spring працює разом із Java, Gradle, TeamCity, Docker, PostgreSQL, YouTrack і DevOps-процесом.

Джерела

Див. також

Java

Gradle

TeamCity

YouTrack

Rider

IDE

DevOps

SaaS

K2 Модуль Shopify

K2 Модуль Magento

K2 Модуль Wix

Модуль Prom

LiqPay

ПРРО

ДПС

ЕДО

SAF-T UA

Е-ТТН