Как стать автором
Обновить

Правильный API конфигурации библиотеки на примере TrueSql || причина бросить Spring Data

Уровень сложностиСредний
Время на прочтение4 мин
Количество просмотров856

Если никто не пишет нормальную библиотеку – надо написать её первым. (С) Владимир Торвальдс

Напомним, что TrueSql это новая Java-библиотека для работы с базами данных под лицензией Apache 2.0. Конфигурация, как и любая другая часть TrueSql, сделана правильно. Сегодня мы расскажем про то как настроить TrueSql на вашем новом (или старом добром) проекте. В статье вы узнаете о том как делать правильно и как делают неправильно неправильные разработчики библиотек.

pure Java, baby

Для конфигурации TrueSql понадобятся: одна Java-программа, открытость ума к правильным решениям и одна книжка по Spring Data JPA чтобы не забыть ее выбросить как только дочитаете эту статью. Итак, этап компиляции в TrueSql позволяет:

  • не запуская программу, проверить корректность SQL-запросов и соответствие количества и типов переданных аргументов

  • реализовать кодогенерацию мапперов и DTØ, следовательно получить максимальную производительность и минимальный boilerplate

  • гарантировать отсутствие SQL-инъекций

Чтобы настроить TrueSql нужно сделать два простых шага:

1. Создать класс, наследующий DataSourceW или ConnectionW.

public class PgDs extends DataSourceW {
    public PgDs(DataSource w) { super(w); }
}

Изначально мы не хотели заворачивать java.sql.DataSource в свои структуры чтобы сделать TrueSql ультра-тонкой надстройкой над JDBC. Однако, в какой-то момент стало понятно что нужно дать возможность оперировать сразу несколькими базами данных с разной схемой в рамках одного Java-модуля. В итоге, для различения баз данных появились DataSourceW и ConnectionW. ConnectionW нужен если вы хотите встроить TrueSql в ту часть кодовой базы, где вам доступно уже только соединение, а не ConnectionPool (например, плагины чего-нибудь).

2. Указать параметры подключения к базе данных на которой будут проходить проверки этапа компиляции. Этот шаг опционален, но крайне рекомендуем.

@Configuration(
    checks = @CompileTimeChecks(
        url = "jdbc:postgresql://localhost:5432/test_db",
        username = "user",
        password = "userpassword"
    )
) public class PgDs extends DataSourceW {
    public PgDs(DataSource w) { super(w); }
}

Очевидно, что нужна возможность поменять эти значения в зависимости от рабочей среды, например на CI/CD.  Для этого процессор аннотаций TrueSql использует переменные окружения. Названия этих переменных формируются исходя из имени класса из пункта 1. Для получения имен и применённых значений используйте флаг к системе сборки, пример на gradle:

./gradlew build -Dtruesql.printConfig=true
gradlew>
    truesql.xxx.PgDs.url=jdbc:postgresql://localhost:5432/test_db
    truesql.xxx.PgDs.username=user
    truesql.xxx.PgDs.password UNDEFINED
maven вариант
./mvnw clean install -Dtruesql.printConfig=true

Мы даже сделали так, что вы можете отличить “null” значение параметра от незаданного. В этом случае вы увидите UNDEFINED без знака =. Встанем и выпьем за те прекрасные времена, когда каждая UNIX-программа имела флаг -h.

х/ф ДМБ. «Хлебай ханку, унучки»
х/ф ДМБ. «Хлебай ханку, унучки»

У вас могли возникнуть следующие вопросы:

Вопрос 1: Как я буду работать с git, если у нас свои локальные тестовые базы с разными параметрами подключения?

Ответ: Сделайте одинаковые параметры подключения к локальным тестовым базам данных. (тривиально)

Вопрос 2: Но я пришел на проект, где порядка никогда не было и у нас общая тестовая база или я вообще тестирую на проде – у нас стартап. Закоммитить креды в git я не могу.

Ответ: Используйте переменные окружения. Способов много: прописать их в gradle.properties (jvm.config если maven),  IDE, shell, bashrc и так далее. Рекомендуется сделать это в gradle.properties, пример:

systemProp.truesql.xxx.PgDs.url=jdbc:postgresql://localhost:5432/truesqldb
systemProp.truesql.xxx.PgDs.username=user
systemProp.truesql.xxx.PgDs.password=userpassword

Пример для maven .mvn/jvm.config:

-Dtruesql.xxx.PgDs.url=jdbc:postgresql://localhost:5432/truesqldb
-Dtruesql.xxx.PgDs.username=user
-Dtruesql.xxx.PgDs.password=userpassword

Теперь вы можете убрать параметры подключения из аннотации @CompileTimeChecks.

Вопрос 3: Как мне добавить вторую базу данных в проект?

Ответ: Для второй БД повторить пункты 1 и 2, описанные выше. (тривиально)

Резюме: все настройки TrueSql проводятся в аннотации @Configuration и в классе, реализующем DataSourceW (ConnectionW). TrueSql автоматически, через переменные окружения, даёт вам возможность переопределить настройки зависящие от рабочей среды. Посмотреть примененные значения вы можете через флаг -Dtruesql.printConfig=true.

“Никто не пишет библиотеки так хорошо как это делаю я” (С) Дональд Трамп

Вспомните трудности при конфигурации других библиотек. В TrueSql этого нет. TrueSql отличная библиотека и сегодня мы доказали это в контексте конфигурации:

  1. Вся конфигурация пишется на Java, вам не нужно знать дополнительные языки вроде XML, YAML.

  2. Есть только один способ что-то настроить! Это освобождает вас от проблемы выбора. Приходя на проект с TrueSql вы сразу знаете куда смотреть. Можете сравнить это с %Spring Data%.

  3. Композиция. TrueSql не перехватывает управление (IoC) и не создает дополнительных абстракций потому что "это круто". Например, в jdbi придумали какие-то Handle... А в Spring есть микрочудовище LocalContainerEntityManagerFactoryBean, один из сотен кстати.

  4. Вы имеете 100% code-completion даже в community-idea или vscode. Значит вам не надо искать возможные ключи в интернете (вы же про yaml конфигурации подумали).

Главный кабан двора

Что делать с полученной властью? Держать любой ценой!

Создатели Spring придумали гениальную схему как сделать Spring незаменимым:

spring.datasource.todos.hikari.connectionTimeout=30000 
spring.datasource.todos.hikari.idleTimeout=600000 
spring.datasource.todos.hikari.maxLifetime=1800000

HikariCP находится в заложниках пока разработчики Spring не добавят поддержку конкретно этих ключей. Данный подход полностью уничтожает любую композицию, но зато делает Spring незаменимым! При попытке найти другой способ сконфигурировать HikariCP в Spring мы открыли 3 первых ссылки на Baeldung, а там то же самое!

TrueSql это не просто Java-библиотека – это источник здравого смысла на Java-платформе. Мы продолжим борьбу за здравый смысл в следующих статьях!

Документация

Сайт проекта

Теги:
Хабы:
Всего голосов 2: ↑1 и ↓1+2
Комментарии3

Публикации

Работа

Java разработчик
170 вакансий

Ближайшие события