Инструменты для генерации кода давно не моветон, особенно когда речь идет о реализации рутинных задач, например, 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 вы получаете готовую базу для реализации:
- Регистрации сотрудников с подтверждением e-mail.
- Блокировки учетных записей сотрудников, если они покидают компанию.
- Защиты API через JWT для мобильного приложения и веба.
Процесс генерации проекта с JHipster
JHipster позволяет генерировать только бэкенд, только фронтенд или оба компонента сразу. После завершения процесса на выходе вы получаете приложение с базовой структурой и множеством классов — в основном конфигурационных. Далее вы можете сосредоточиться на разработке своей бизнес-логики, используя готовую основу.

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

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

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

Чем отличаются Blueprints и модули
- Blueprints — расширения для генерации нового проекта «с нуля». Они добавляют возможности, которых нет в стандартной версии JHipster, например, использование других технологий или альтернативных подходов.
- Модули — инструменты для добавления функциональности в уже существующий проект. Это особенно полезно, если нужно внедрить что-то, чего JHipster изначально не поддерживает.
Доступные Blueprints
Некоторые из популярных Blueprints поддерживаются официально и активно развиваются сообществом. Вот несколько примеров:
- Kotlin — для генерации проектов на Kotlin вместо Java.
- .NET Core — альтернатива для разработки на платформе .NET.
- Entity Audit — реализует аудит сущностей с использованием библиотеки Javers.
- jOOQ — альтернатива JPA для работы с SQL-запросами на уровне Java-кода.
- Quarkus и Micronaut — для генерации проектов с использованием этих фреймворков вместо Spring Boot.
- React Native — генерация интерфейсов для мобильных приложений.
- Svelte — поддержка этого современного фреймворка для пользовательских интерфейсов.
- 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-кода, но при работе с инкрементальной моделью данных необходимо учитывать ограничения инструмента. Для сложных проектов, где данные эволюционируют, гибридный подход (генерация + ручные доработки) кажется наиболее жизнеспособным.
Для постепенного развития схемы данных можно рекомендовать:
- Использовать отдельные JDL-файлы для новых сущностей.
- Генерировать код небольшими порциями, избегая изменений в существующих моделях.
- Для сложных связей вносить изменения вручную или искать способы объединения JDL-файлов для конкретных случаев, где это критически важно.
Рутинные задачи — не для программистов?
«Зачем использовать инструменты автоматической генерации кода? Мы же программисты, нам не нужно генерировать — нам нужно писать!». Но на самом деле, если честно, выполнение рутинных задач не всегда приносит удовольствие, а программирование — это не только рутинная работа. Когда ты можешь быстро закрыть стандартные задачи, ты получаешь больше времени для творческих, нестандартных и более интересных задач. В этом и заключается основной плюс использования таких инструментов, как JHipster.
Я считаю, что компаниям однозначно стоит начать внедрять JHipster. Причина не в том, чтобы все строго использовали этот инструмент, а в том, чтобы разработчики осознали его мощь и пользу. Использование JHipster позволит существенно сократить трудозатраты на стандартные задачи, что в свою очередь будет влиять на стоимость разработки проектов и сделает их более конкурентоспособными.
Заключение
JHipster — это инструмент, который может освободить вас от значительной части рутинных задач разработки. Реализация CRUD, фильтрации, пагинации и других типовых операций, которые повторяются от проекта к проекту, зачастую превращается в механическую работу. Благодаря JHipster эту рутину можно автоматизировать, что особенно ценно, когда хочется сосредоточиться на более интересных задачах.
