Зарегистрируйтесь, чтобы продолжить обучение

Профили Spring Boot

Приложения, разрабатываемые программистами, запускаются в разных окружениях (или, как говорят, средах), которые требуют разных настроек для своей работы. Например, локально, на своей машине разработчик может использовать одну базу данных, а в продакшене другую. То же самое касается настроек логирования, правил безопасности и всех остальных аспектов работы приложения.

Возможность иметь свои наборы параметров под разные окружения в Spring Boot реализуется с помощью механизмов профайлов (Profiles). С помощью профайлов мы можем включать специфические бины или параметры конфигурации без необходимости изменения исходного кода.

Среды разработки

Как минимум выделяют две среды разработки:

  • Продакшен (Production). Место, где запускается проект для его реальной работы. Как правило, это происходит в облаках Amazon, Yandex или Google.
  • Девелопмент (Development). Почти всегда локальная машина разработчика. Обычно среда одна, даже если разработчиков больше одного человека.

Кроме указанных, часто, добавляют среду Staging. Это предпродакшен среда, где имитируется окружение, максимально приближенное к продакшену. Эту среду используют для тестирования приложения перед тем как выполнить его деплой на продакшен.

Итого, в типовых ситуациях, мы можем говорить о трех средах, для которых в Spring Boot будут определены три профайла:

  • production
  • development
  • staging

Активация профайла

Активация профайла выполняется двумя основными способами.

  • С помощью переменной окружения SPRING_PROFILES_ACTIVE

    export SPRING_PROFILES_ACTIVE=development
    java -jar myproject.jar
    
  • С помощью аргумента во время запуска приложения

    java -jar myproject.jar --spring.profiles.active=development
    // Или Gradle
    ./gradlew run --args='--spring.profiles.active=development'
    

Формирование профайла

Аннотация @Profile указанная для @Component или @Configuration указывает на то, что эти классы должны использоваться только в определенном окружении:

@Configuration
@Profile("development")
public class DevelopmentConfig {
    // Configuration for the development profile
}

Таким образом можно реализовать подмену как настроек, так и реализацию каких-то классов.

Конфигурационные параметры предпочтительно подменять с помощью файлов, специфичных для своих профилей: application-{profile}.yml расположенных рядом с оригинальным application.yml. Например:

  • application-production.yml
  • application-staging.yml

Наличие файлов специфичных для разных окружений не отменяет наличие общего application.yml, в котором полезно оставлять общие настройки, чтобы не дублировать их в каждом профайле.


Самостоятельная работа

В этом упражнении вы научитесь настраивать Spring Boot так, чтобы приложение могло работать с разными базами данных в зависимости от окружения. Это позволит безопасно запускать проект локально, тестировать его в памяти и подключаться к реальной PostgreSQL в продакшене.

Что нужно сделать

  1. Создать три профиля: production, development и test.
  2. Для production создать файл application-production.yml с настройками подключения к PostgreSQL.
  3. Для development создать файл application-development.yml с настройкой H2 базы в файле.
  4. Для test создать файл application-test.yml с H2 базой в памяти.
  5. При необходимости использовать аннотацию @Profile для бинов, специфичных для конкретного окружения (например, DataSource).
  6. Задеплоить приложение на Render.com с профилем production.
  7. Проверить работу приложения с разными профилями и убедиться, что подключение к базе соответствует выбранному окружению.

Пример файлов конфигурации

Нажмите, чтобы увидеть пример application.yml и профайл-специфичных файлов

application.yml — общие настройки

spring:
datasource:
    driver-class-name: org.h2.Driver   # общий драйвер (будет переопределен для prod)
jpa:
    hibernate:
    ddl-auto: update
    show-sql: true
    properties:
    hibernate:
        format_sql: true

application-development.yml — локальная H2 база в файле

spring:
profiles: development
datasource:
    url: jdbc:h2:file:./data/devdb;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE
    username: sa
    password:
    driver-class-name: org.h2.Driver
jpa:
    hibernate:
    ddl-auto: update

База хранится в файле ./data/devdb.mv.db, данные сохраняются между запусками.

application-production.yml — PostgreSQL

spring:
profiles: production
datasource:
    url: ${DB_URL:jdbc:postgresql://localhost:5432/myapp}
    username: ${DB_USERNAME:postgres}
    password: ${DB_PASSWORD:password}
    driver-class-name: org.postgresql.Driver
jpa:
    hibernate:
    ddl-auto: validate
    show-sql: false

В продакшене подключаемся к реальной PostgreSQL. ddl-auto: validate проверяет схему, но не меняет её.

application-test.yml — H2 в памяти для тестов

spring:
profiles: test
datasource:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
    driver-class-name: org.h2.Driver
    username: sa
    password:
jpa:
    hibernate:
    ddl-auto: create-drop  # схема создается для каждого теста и уничтожается после
    show-sql: false

Используем память: база создаётся на старте теста и очищается после.

Итог

  • Приложение использует H2 локально для быстрого запуска без внешней базы данных.
  • В тестах применяется in-memory H2 для изолированных и быстрых юнит-тестов.
  • В продакшене подключение идет к реальной PostgreSQL.
  • Профили позволяют гибко управлять конфигурацией и легко переключаться между окружениями.

Дополнительные материалы

  1. Use YAML for External Properties
  2. Using application.yml vs application.properties in Spring Boot

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff