Slide 1

Slide 1 text

RAD на Spring Boot для эффективного создания корпоративных приложений

Slide 2

Slide 2 text

О докладчике и компании Константин Кривопустов, менеджер продукта Jmix Сообщество разработчиков Custom development Корпоративные системы Инструменты эффективной разработки Spring Buddy – on the way Компания ~500 чел Jmix ~20K JPA Buddy ~1M

Slide 3

Slide 3 text

Про что будет речь  Обзор традиционного современного подхода к разработке корпоративных приложений  Обзор RAD как альтернативного подхода  Реализация RAD на примере Jmix  Live coding - создаем Issue Tracker  Как устроен Jmix  Ограничения Jmix

Slide 4

Slide 4 text

Универсальная архитектура

Slide 5

Slide 5 text

Преимущества универсальной архитектуры  Отвязывание слоя хранения данных от слоя представления  Гибкая настройка безопасности через слой API и DTO  Тестируемость слоев по отдельности

Slide 6

Slide 6 text

Преимущества универсальной архитектуры  Отвязывание слоя хранения данных от слоя представления  Гибкая настройка безопасности через слой API и DTO  Тестируемость слоев по отдельности  Как у всех!

Slide 7

Slide 7 text

Корпоративные информационные системы Системы обеспечения бизнеса предприятий, пользователями которых являются сотрудники предприятия.  Слой хранения максимально приближен к бизнес-сущностям  Большое количество сущностей и типовых экранов  Функциональный пользовательский интерфейс

Slide 8

Slide 8 text

DRY, который мы заслужили

Slide 9

Slide 9 text

DRY, который мы заслужили

Slide 10

Slide 10 text

DRY, который мы заслужили

Slide 11

Slide 11 text

DRY, который мы заслужили

Slide 12

Slide 12 text

DRY, который мы заслужили А теперь повторим DTO и их валидации на клиенте!

Slide 13

Slide 13 text

Кто будет писать столько boilerplate-a?

Slide 14

Slide 14 text

Автоматическая генерация boilerplate-а не освобождает от его дальнейшей поддержки!

Slide 15

Slide 15 text

Преимущества универсальной архитектуры?  Отвязывание слоя хранения данных от слоя представления  Вы когда-нибудь заменяли слой хранения целиком?  Нужна ли возможность трансформации для всей модели?

Slide 16

Slide 16 text

Преимущества универсальной архитектуры?  Развязывание слоя хранения данных со слоем представления  Вы когда-нибудь заменяли отдельно слой хранения?  Нужна ли возможность трансформации для всей модели?  Гибкая настройка безопасности через слой API и DTO  Нужен ли вам API для всех функций системы?  Контролировать доступ к данным можно другим способом

Slide 17

Slide 17 text

Преимущества универсальной архитектуры?  Развязывание слоя хранения данных со слоем представления  Вы когда-нибудь заменяли отдельно слой хранения?  Нужна ли возможность трансформации для всей модели?  Гибкая настройка безопасности через слой API и DTO  Нужен ли вам API для всех функций системы?  Контролировать доступ к данным можно другим способом  Тестируемость слоев по отдельности  Интеграционные тесты!  Testcontainers

Slide 18

Slide 18 text

Преимущества универсальной архитектуры?  Развязывание слоя хранения данных со слоем представления  Вы когда-нибудь заменяли отдельно слой хранения?  Нужна ли возможность трансформации для всей модели?  Гибкая настройка безопасности через слой API и DTO  Нужен ли вам API для всех функций системы?  Контролировать доступ к данным можно другим способом  Тестируемость слоев по отдельности  Интеграционные тесты!  Как у всех!  Без комментариев

Slide 19

Slide 19 text

Rapid Application Development "First make it work, then make it right." --Kent Beck

Slide 20

Slide 20 text

Зачем Jmix? Почему бы просто не воспользоваться JPA + Spring Data + Vaadin?

Slide 21

Slide 21 text

Зачем Jmix? Почему бы просто не воспользоваться JPA + Spring Data + Vaadin?  Декларативное создание UI  UI-компоненты для корпоративных приложений

Slide 22

Slide 22 text

Зачем Jmix? Почему бы просто не воспользоваться JPA + Spring Data + Vaadin?  Декларативное создание UI  UI-компоненты для корпоративных приложений  Детализированный декларативный контроль доступа к данным

Slide 23

Slide 23 text

Зачем Jmix? Почему бы просто не воспользоваться JPA + Spring Data + Vaadin?  Декларативное создание UI  UI-компоненты для корпоративных приложений  Детализированный декларативный контроль доступа к данным  Готовые функциональные модули (аудит, отчеты, BPM, ...)  Механизм обеспечения модульности и расширяемости  Конфигурируемость многих механизмов в runtime

Slide 24

Slide 24 text

Зачем Jmix? Почему бы просто не воспользоваться JPA + Spring Data + Vaadin?  Декларативное создание UI  UI-компоненты для корпоративных приложений  Детализированный декларативный контроль доступа к данным  Готовые функциональные модули (аудит, отчеты, BPM, ...)  Механизм обеспечения модульности и расширяемости  Конфигурируемость многих механизмов в runtime  Мощная поддержка в IDE, визуальные дизайнеры

Slide 25

Slide 25 text

Компоненты Jmix  Framework  Free, open source  Studio  Freemium plugin for IntelliJ IDEA  Add-ons  Большинство аддонов - free, open source

Slide 26

Slide 26 text

Пишем Issue Tracker Бизнес-требования:  Роль Reporter  Видит только экраны списка и редактирования Issue  Не может изменять поле Milestone  Не может редактировать и удалять чужие тикеты  Отсылать email автору тикета, если он изменен кем-то другим  Журналировать все изменения в тикетах

Slide 27

Slide 27 text

Особенности фреймворка Jmix  Модель данных и метаданные  DataManager  Оптимизация доступа к БД  Элементы UI  Подсистема контроля доступа  Модульность и расширяемость

Slide 28

Slide 28 text

Модель данных и метаданные JPA Entity External Service DB 1 DB 2 JPA Entity JPA Entity JPA Entity JPA Entity DTO Entity DTO Entity MetaClass MetaClass MetaClass MetaClass MetaClass MetaClass MetaClass Metadata API

Slide 29

Slide 29 text

Модель данных и метаданные JPA Entity External Service DB 1 DB 2 JPA Entity JPA Entity JPA Entity JPA Entity DTO Entity DTO Entity MetaClass MetaClass MetaClass MetaClass MetaClass MetaClass MetaClass Metadata API

Slide 30

Slide 30 text

DataManager DataManager UI Screen UI Screen Service JPA DataStore Custom DataStore EntityManager ??? • Data access control • Cross-datastore references • Entity events • Lazy loading of references • Add-ons: Search, Dynamic Attributes REST Controller

Slide 31

Slide 31 text

DataManager DataManager UI Screen Data Repository UI Screen Service JPA DataStore Custom DataStore EntityManager UI Screen ??? • Data access control • Cross-datastore references • Entity events • Lazy loading of references • Add-ons: Search, Dynamic Attributes

Slide 32

Slide 32 text

DataManager DataManager UI Screen REST Controller Data Repository UI Screen Service JPA DataStore Custom DataStore EntityManager Service JDBC UI Screen ??? • Data access control • Cross-datastore references • Entity events • Lazy loading of references • Add-ons: Search, Dynamic Attributes

Slide 33

Slide 33 text

Оптимизация доступа к БД Lazy loading Issue 42 milestone == null issue.getMilestone() Issue 42 milestone == M1 DataManager.load(Milestone) .id(1) Проблема: N+1 запросов к БД DataManager.load(Issue) .id(42)

Slide 34

Slide 34 text

Оптимизация доступа к БД Fetch Plans Issue 42 milestone == M1 DataManager.load(Issue) .id(42) .fetchPlan("with-milestone")  Возможны частичные сущности  Не нужны проекции

Slide 35

Slide 35 text

UI: дескрипторы и контроллеры IssueBrowse.java issue-edit.xml

Slide 36

Slide 36 text

UI: обработчики событий и делегаты

Slide 37

Slide 37 text

UI: контейнеры данных

Slide 38

Slide 38 text

UI: DataContext DataContext Issue 42 Milestone 1 1) Open screen and load data 3) User edits issue Title DataContext Issue 42 Milestone 1 4) User clicks OK 6) DataManager .save() DataContext Issue 42* Milestone 1 5) DataContext .commit() 7) DataContext .merge() 2) DataContext .merge()

Slide 39

Slide 39 text

Подсистема контроля доступа  Аутентификация  Встроенная  Внешняя через OpenID Connect или LDAP  Авторизация  Ресурсные роли  Доступ к CRUD операциям, атрибутам сущностей, экранам, меню  Роли уровня строк  Ограничение доступа к определенным экземплярам на уровне запросов JPQL и в памяти после загрузки

Slide 40

Slide 40 text

MyAccessConstraint Подсистема контроля доступа Принятие решения об авторизации MyService в точке авторизации AccessManager 2) applyRegisteredConstraints() MyAccessContext 1) create MyAccessConstraint 3) apply() 4) modify state 5) check state AccessContext AccessConstraint implements implements можно дополнять

Slide 41

Slide 41 text

Модульность и расширяемость Email Sending Add-on email email-starter email-ui email-ui-starter Дерево модулей позволяет: • Задавать порядок: • Выполнения Liquibase changelogs • Переопределять: • Свойства приложения • Локализованные сообщения • Экраны • Системные классы типов данных и пр.

Slide 42

Slide 42 text

Ограничения Jmix  Server-side-state UI ограничивает вертикальную масштабируемость  5-10M на пользовательскую сессию  Кастомизация UI сложнее, чем с классическим фронтендом  Нужна готовность идти на компромисс при разработке требований  Data-centric  Не дает значительного преимущества, если модель бизнес-объектов сильно отличается от модели хранения

Slide 43

Slide 43 text

Спасибо за внимание! www.jmix.io www.jmix.ru www.haulmont.ru