Блог CosySoft
Разработка Технологии

Разработка без рутины: используем JHipster для повседневных задач

Инструменты для генерации кода давно не моветон, особенно когда речь идет о реализации рутинных задач, например, CRUD-операций, фильтрации и пагинации. JHipster — это один из таких инструментов, который позволяет сгенерировать за несколько минут основные компоненты приложения. Недавно наш Head of Backend Женя провел небольшой эксперимент с JHipster, оценив, сколько времени займет реализация стандартных задач с его помощью. Результаты показали, что JHipster может сократить трудозатраты почти в два раза. В статье Женя поделится опытом работы с инструментом: рассмотрит его возможности, преимущества и сложности.

Что такое JHipster

Я знал об инструменте JHipster уже давно, но никогда не испытывал особого желания его попробовать. Наверное, дело в стереотипах: многие разработчики относятся к генерации кода с настороженностью, и я не был исключением. Но однажды я решил дать JHipster шанс. Почему бы не попробовать?
JHipster — это инструмент для генерации кода, который охватывает как бэкенд, так и фронтенд. Он особенно полезен для создания административных интерфейсов. Устанавливается он через NPM, как консольная утилита, и работает на любой системе.

Что именно он генерирует

  • Бэкенд: JHipster создает серверную часть на Java с использованием Spring Boot (в актуальной версии — третьей).
  • Фронтенд: Для клиентской части можно выбрать один из популярных фреймворков: React, Angular или Vue.

Что умеет JHipster

Мониторинг и администрирование

  • Actuator. Встроенные метрики и интерфейс для мониторинга.
  • Возможность менять уровни логирования «на лету» через пользовательский интерфейс.

Инфраструктура и деплой

Дополнительные возможности

  • WebSockets. Пока не тестировал, но эта функция выглядит перспективной.
  • GraphQL. Генерация базовой конфигурации.
  • Kafka. Поддержка для настройки потоковой обработки данных.
  • Интернационализация. Возможность добавлять мультиязычную поддержку.

Безопасность в JHipster

Все эти функции генерируются «из коробки» и полностью готовы к использованию.

Создание и управление пользователями

Аутентификация

  • JWT: Простое и эффективное управление токенами для обеспечения безопасности API.
  • Keycloak: Поддержка SSO и централизованного управления пользователями.
  • Сессии: Поддержка аутентификации на основе сессий для традиционных веб-приложений.
Дополнительные функции
  • Генерация конфигурации для гибкого управления уровнями доступа.
  • Интеграция с основными фреймворками безопасности Spring Security.
Пример использования
Представьте ситуацию: вы разрабатываете административную панель для корпоративного портала. С JHipster вы получаете готовую базу для реализации:

  1. Регистрации сотрудников с подтверждением e-mail.
  2. Блокировки учетных записей сотрудников, если они покидают компанию.
  3. Защиты API через JWT для мобильного приложения и веба.

Процесс генерации проекта с JHipster

JHipster позволяет генерировать только бэкенд, только фронтенд или оба компонента сразу. После завершения процесса на выходе вы получаете приложение с базовой структурой и множеством классов — в основном конфигурационных. Далее вы можете сосредоточиться на разработке своей бизнес-логики, используя готовую основу.
Работа с JHipster начинается с простого: вы вводите команду в консоли, а затем отвечаете на серию вопросов. Обычно это порядка 20 пунктов, каждый из которых помогает настроить проект под ваши потребности.
  1. Название приложения: укажите имя проекта.
  2. Тип приложения, например, монолитное, микросервис или гейтвей. В нашем случае мы выбрали монолит.
  3. Сборка: Maven или Gradle.
  4. Бэкенд: JHipster может генерировать проект с поддержкой WebFlux.
  5. Аутентификация: доступны JWT, Keycloak, сессии и другие варианты.
  6. Тестовые фреймворки: помимо стандартного JUnit, можно подключить Cucumber и другие инструменты.
  7. База данных: выберите тип SQL- или NoSQL-базы. Мы остановились на SQL. JHipster поддерживает популярные базы, такие как H2, PostgreSQL, MySQL и другие. Также можно настроить разные базы для production и разработки.
  8. Кэширование: распределенные кэши — Redis, Hazelcast; In-memory кэши, например, Caffeine; второй уровень кэширования в Hibernate.
  9. Дополнительные настройки, например, полнотекстовый поиск (FTS) и другие возможности.

JHipster JDL

JHipster предоставляет собственный язык описания доменов — JDL (JHipster Domain Language). Этот инструмент позволяет компактно и гибко описывать как модель данных, так и конфигурацию приложения.

Описание модели данных

Описание конфигурации приложения

JDL позволяет не только работать с моделью данных, но и задавать параметры конфигурации:
  • Тип приложения: монолитное или микросервисное.
  • Тип аутентификации: JWT, Keycloak, сессии и другие.
  • Зависимости: подключение баз данных, кэширования, поисковых движков и т. д.
Пример использования
JDL-файлы полезны для быстрого старта или изменения существующего проекта. Вы можете:
  1. Создать JDL-файл с описанием новой сущности.
  2. Сгенерировать дополнительные функциональности, такие как фильтрация или поиск.
  3. Обновить конфигурацию приложения (например, сменить базу данных или тип авторизации).

Blueprints и модули

JHipster — это не только инструмент генерации проектов, но и гибкая платформа, которая поддерживает расширения. Для этого предусмотрены две ключевые концепции: Blueprints и модули.

Чем отличаются Blueprints и модули

  • Blueprints — расширения для генерации нового проекта «с нуля». Они добавляют возможности, которых нет в стандартной версии JHipster, например, использование других технологий или альтернативных подходов.
  • Модули — инструменты для добавления функциональности в уже существующий проект. Это особенно полезно, если нужно внедрить что-то, чего JHipster изначально не поддерживает.

Доступные Blueprints

Некоторые из популярных Blueprints поддерживаются официально и активно развиваются сообществом. Вот несколько примеров:
  1. Kotlin — для генерации проектов на Kotlin вместо Java.
  2. .NET Core — альтернатива для разработки на платформе .NET.
  3. Entity Audit — реализует аудит сущностей с использованием библиотеки Javers.
  4. jOOQ — альтернатива JPA для работы с SQL-запросами на уровне Java-кода.
  5. Quarkus и Micronaut — для генерации проектов с использованием этих фреймворков вместо Spring Boot.
  6. React Native — генерация интерфейсов для мобильных приложений.
  7. Svelte — поддержка этого современного фреймворка для пользовательских интерфейсов.
  8. Node.js — возможность создания бэкэнда на Node.js.

Marketplace

JHipster предоставляет маркетплейс, где можно найти доступные Blueprints и модули. Однако стоит учитывать, что часть доступных расширений может быть устаревшей или недостаточно актуальной. Для более свежих решений часто приходится искать разработки сообщества на GitHub.
Пример полезного модуля: добавление поддержки WebSockets или интеграция с внешними API.

Создание собственных расширений

Если в проекте часто встречаются однотипные задачи, вы можете разработать свои Blueprints или модули. Это открывает возможности для автоматизации рутинных процессов, например:
  • Генерация специфических CRUD-операций.
  • Интеграция с корпоративными API.
  • Подключение внутренних библиотек или стандартов.

Инкрементальная генерация моделей с JHipster

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

Как это работает

Создание новой сущности:
  • Вы описываете ее в отдельном JDL-файле, чтобы не затронуть существующую схему.
  • Генерируете код для новой сущности, избегая изменений в уже существующих.
Проблемы со связями:
  • Если новая сущность должна ссылаться на одну из существующих (например, через one-to-one или many-to-one), то для автоматической настройки JHipster потребуется, чтобы обе сущности были определены в одном JDL-файле.
  • Если вы добавите связь в новом файле и сгенерируете код вместе с существующей сущностью, JHipster перегенерирует старую сущность, что может привести к потере внесенных изменений.

Решение: ручная настройка связей

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

Оптимальная стратегия работы

JHipster отлично справляется с генерацией boilerplate-кода, но при работе с инкрементальной моделью данных необходимо учитывать ограничения инструмента. Для сложных проектов, где данные эволюционируют, гибридный подход (генерация + ручные доработки) кажется наиболее жизнеспособным.
Для постепенного развития схемы данных можно рекомендовать:
  1. Использовать отдельные JDL-файлы для новых сущностей.
  2. Генерировать код небольшими порциями, избегая изменений в существующих моделях.
  3. Для сложных связей вносить изменения вручную или искать способы объединения JDL-файлов для конкретных случаев, где это критически важно.

Рутинные задачи — не для программистов?

«Зачем использовать инструменты автоматической генерации кода? Мы же программисты, нам не нужно генерировать — нам нужно писать!». Но на самом деле, если честно, выполнение рутинных задач не всегда приносит удовольствие, а программирование — это не только рутинная работа. Когда ты можешь быстро закрыть стандартные задачи, ты получаешь больше времени для творческих, нестандартных и более интересных задач. В этом и заключается основной плюс использования таких инструментов, как JHipster.
Я считаю, что компаниям однозначно стоит начать внедрять JHipster. Причина не в том, чтобы все строго использовали этот инструмент, а в том, чтобы разработчики осознали его мощь и пользу. Использование JHipster позволит существенно сократить трудозатраты на стандартные задачи, что в свою очередь будет влиять на стоимость разработки проектов и сделает их более конкурентоспособными.

Заключение

JHipster — это инструмент, который может освободить вас от значительной части рутинных задач разработки. Реализация CRUD, фильтрации, пагинации и других типовых операций, которые повторяются от проекта к проекту, зачастую превращается в механическую работу. Благодаря JHipster эту рутину можно автоматизировать, что особенно ценно, когда хочется сосредоточиться на более интересных задачах.