За останні три роки 70% наших нових JVM-проєктів стартують на Kotlin. У статті — без хайпу і без релігії, тільки інженерні аргументи: де Kotlin перемагає Java на Spring Boot, де ми досі пишемо чисту Java і що в цьому рівнянні змінив Spring Boot 4. Наприкінці — точний стек мікросервісів, з якого ми починаємо нові проєкти у 2026 році, і шлях міграції для наявних сервісів на Spring Boot 3.

Spring Boot 3.5 чи 4.0 у 2026 році?

Spring Boot 4.0 вийшов 20 листопада 2025 року на базі Spring Framework 7 (блог Spring, 2025). Мінімальною версією залишається Java 17, з'явилася повноцінна підтримка Java 25, кодову базу розбито на менші модулі, а для REST-застосунків додано версіонування API та HTTP service clients.

Open-source підтримка Spring Boot 3.5 — останньої гілки 3.x — завершується 30 червня 2026 року; після цього виправлення доступні лише в межах комерційної підтримки (графік підтримки Spring Boot). Наше правило:

  • Нові сервіси: стартуємо на Spring Boot 4 з Kotlin.
  • Наявні сервіси на 3.x: спершу оновлюємо до 3.5, прибираємо deprecated-виклики, потім переходимо на 4.x за офіційним гайдом з міграції.

Чому ми обираємо Kotlin за замовчуванням

  • Null safety на рівні мови. Nullable і non-nullable — різні типи, тож цілий клас NullPointerException ловить компілятор (документація Kotlin: null safety).
  • Лаконічні data classes. Порівняно з класичними Java DTO з геттерами, equals, hashCode і білдерами код DTO скорочується приблизно на третину. Java records значно скоротили цей розрив, але Kotlin додає зверху значення за замовчуванням, іменовані параметри та copy().
  • Coroutines. Spring підтримує корутини Kotlin із Framework 5.2: suspend-методи контролерів, повернення Flow і WebClient з підтримкою корутин дають неблокувальний код, що читається як блокувальний, без операторів Reactor (документація Spring: coroutines).
  • Extension functions. Чистіший доменний код без статичних helper'ів у стилі StringUtils.
  • 100% сумісність із Java. Кожна Java-бібліотека — від Hibernate до клієнта Kafka — працює без змін (документація Kotlin: виклик Java з Kotlin).

Так виглядає типовий ендпоінт:

data class OrderDto(
    val id: UUID,
    val customerId: UUID,
    val total: BigDecimal,
    val note: String? = null,          // nullable за задумом, це контролює компілятор
)

@RestController
@RequestMapping("/orders")
class OrderController(private val orders: OrderService) {

    @GetMapping("/{id}")
    suspend fun get(@PathVariable id: UUID): OrderDto =
        orders.find(id) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)

    @GetMapping
    fun stream(): Flow<OrderDto> = orders.streamRecent()
}

Що Spring Boot 4 змінив для Kotlin

У травні 2025 року JetBrains і команда Spring оголосили стратегічне партнерство, щоб зробити Kotlin повноцінним вибором для бекендів на Spring (блог JetBrains, 2025). Spring Boot 4 — перший реліз, сформований цим партнерством (Next level Kotlin support in Spring Boot 4):

  • Мінімальна версія — Kotlin 2.2. Spring Boot 4 і Framework 7 вимагають Kotlin 2.2 або новішу.
  • JSpecify null-safety в усьому портфоліо. API Spring, Reactor і Micrometer анотовані JSpecify, тож Kotlin бачить коректні nullable і non-nullable типи замість небезпечних platform types. Це була найбільша діра в null safety Kotlin на Spring.
  • Стартер Kotlin Serialization. spring-boot-starter-kotlinx-serialization-json автоматично налаштовує kotlinx.serialization поруч із Jackson 3.
  • BeanRegistrarDsl. Програмна реєстрація бінів з if і for — те, чого не можна виразити методами з @Bean.
  • Передача контексту в корутинах. Трейсинг і observability тепер працюють і в suspend-функціях.
  • Гайди з Kotlin на першому місці. Більшість популярних гайдів Spring тепер мають Kotlin-версії.

Де Java досі сильніша

  1. Високонавантажені low-latency сервіси. Знання з тюнінгу JVM, розбори GC та інструменти профілювання переважно орієнтовані на Java. Kotlin компілюється в той самий байт-код, але дебажити команда буде на Java-прикладах.
  2. Команди, де всі senior'и пишуть на Java 5+ років. Переучування коштує більше за виграш, тим паче що сучасна Java (records, pattern matching, virtual threads) суттєво скоротила ергономічний розрив.
  3. Статичний аналіз. Error Prone, NullAway і SpotBugs орієнтовані на Java. Для Kotlin ми використовуємо detekt і ktlint — вони хороші, але екосистема правил менша.
  4. Фреймворки, чутливі до байт-коду. Класи Kotlin за замовчуванням final, що ламає проксі в Spring AOP і Hibernate. Компіляторні плагіни kotlin-spring і kotlin-jpa це виправляють, але про них треба знати (all-open plugin, no-arg plugin).

Корутини чи virtual threads?

Virtual threads з Java 21, які в Spring Boot вмикаються через spring.threads.virtual.enabled=true, дають звичайному блокувальному коду більшість переваг масштабованості, для яких раніше потрібен був реактивний стек (JEP 444). Наш розподіл:

  • Virtual threads — для класичних request-response сервісів на Spring MVC з JDBC. Нуль змін у коді, однаково працює з Java і Kotlin.
  • Корутини — коли потрібна структурована конкурентність у бізнес-логіці: паралельні виклики кількох сервісів, таймаути та скасування, що коректно поширюються.

Пастки, на які ми наступили в реальних проєктах

  • Не використовуйте data classes для JPA-сутностей. Згенеровані equals, hashCode і toString чіпають lazy-асоціації та ламають семантику ідентичності Hibernate. Використовуйте звичайні класи з equals за ID або Spring Data JDBC, який краще пасує до незмінних класів Kotlin.
  • Налаштуйте Jackson для Kotlin. Без Kotlin-модуля значення за замовчуванням і nullability ігноруються під час десеріалізації. Spring Boot реєструє модуль автоматично, якщо він є в classpath, — переконайтеся, що він там є.
  • Стежте за часом збірки. Компілятор K2 у Kotlin 2.0+ приблизно вдвічі прискорив компіляцію в бенчмарках JetBrains (What's new in Kotlin 2.0), але annotation processing через kapt досі повільний. Обирайте KSP там, де бібліотеки його підтримують.

Наш типовий стек у 2026

Шар Вибір Чому
Фреймворк Spring Boot 4.x + Kotlin 2.2+ JSpecify null-safety, корутини, модульні стартери
Runtime Java 21 або 25 LTS Virtual threads, сучасні GC
API gateway Spring Cloud Gateway Та сама модель програмування, що й у сервісах
Service discovery Kubernetes Services, Consul поза Kubernetes Eureka — тільки для legacy
База даних PostgreSQL + Hibernate 7 або Spring Data JDBC Hibernate 7.x постачається зі Spring Boot 4
Повідомлення Apache Kafka 4.x (KRaft) зі Spring for Apache Kafka Без ZooKeeper з Kafka 4.0
Resilience Resilience4j, @Retryable зі Spring Framework 7 Netflix Hystrix у режимі підтримки
Observability OpenTelemetry через spring-boot-starter-opentelemetry Один стандарт для трейсів, метрик і логів
Тести JUnit, Testcontainers 2, MockK Реальні залежності в інтеграційних тестах

Кілька коментарів до цього вибору. Kafka 4.0 повністю прибрала ZooKeeper і працює тільки в режимі KRaft (анонс Apache Kafka 4.0). Netflix перевів Hystrix у режим підтримки ще у 2018 році й рекомендує Resilience4j (README Hystrix); для простих повторів і обмеження конкурентності в Spring Framework 7 тепер є вбудовані @Retryable і @ConcurrencyLimit (документація Spring: resilience features). Spring Boot 4 оновлює Hibernate до 7.x, Kafka до 4.1, Jackson до 3 і Testcontainers до 2, а також додає окремий стартер OpenTelemetry (release notes Spring Boot 4.0). Testcontainers залишається найціннішим інструментом тестування в усьому стеку.

Kotlin не робить вас архітектором. Поганий код залишається поганим — просто красивішим синтаксично. Не плутайте інструмент з дисципліною.

Перформанс

У наших бенчмарках Spring Boot на Kotlin майже не відрізняється від Java: різниця в межах 1–3% у throughput і 2–5 МБ пам'яті. Обидві мови компілюються в JVM-байт-код і працюють на тому самому JIT. Відмінності, які ви побачите, походять із вашого коду — boxing у generic-колекціях, лямбди в гарячих циклах, — а не з мови.

Якщо потрібен швидкий старт і малий обсяг пам'яті, наприклад для навантажень з масштабуванням до нуля, використовуйте GraalVM Native Image. Spring Boot підтримує його і для Java, і для Kotlin через Spring AOT (документація Spring Boot: GraalVM native images). Розраховуйте на старт за десятки мілісекунд в обмін на довші збірки й частину конфігурації reflection.

Як впровадити Kotlin в наявний Java-сервіс

  1. Додайте Kotlin-плагін для Gradle або Maven разом із kotlin-spring і kotlin-jpa. Java і Kotlin можуть жити в одному модулі.
  2. Спершу пишіть нові тести на Kotlin. Ризик мінімальний, а команда вивчає мову на реальному коді.
  3. Нові класи пишіть на Kotlin; наявні конвертуйте лише тоді, коли все одно їх змінюєте.
  4. Домовтеся про конвенції заздалегідь: правила detekt і ktlint, коли використовувати корутини, як обробляти nullability на межі з Java.

На типовому сервісі обсягом 30–50 тисяч рядків команда стає продуктивною в Kotlin за два-три спринти.

Пов'язані гайди

Про платформу під капотом — у статтях Java 25 LTS: що нового і Віртуальні потоки в Spring Boot. Як структурувати великі сервіси без переходу на мікросервіси — у статті Модульний моноліт зі Spring Modulith, а про швидкий старт — GraalVM Native Image для Spring Boot.

Щоб додати LLM-функції в сервіс на Spring Boot, не виходячи за межі JVM, див. гайд зі Spring AI.

FAQ

Чи готовий Kotlin до продакшену на Spring Boot? Так. Spring офіційно підтримує Kotlin із Framework 5.0, а Spring Boot 4 зробив його повноцінною мовою з null-safety в усьому портфоліо (документація Spring: Kotlin).

Чи варто мігрувати зі Spring Boot 3 на 4 вже зараз? Нові сервіси починайте на 4. Для наявних плануйте перехід уже зараз: open-source підтримка 3.5 завершується в червні 2026 року, і безкоштовні виправлення отримуватиме лише гілка 4.x.

Чи повільніший Kotlin за Java? У типових сервісах — непомітно: обидві мови виконують той самий байт-код на тій самій JVM.

Корутини чи WebFlux? Для Kotlin-команд — корутини поверх WebFlux або Spring MVC з virtual threads. Нові проєкти на «сирих» операторах Reactor ми більше не починаємо.

Джерела

  1. Spring (2025). Spring Boot 4.0.0 available now.
  2. Spring (2025). Next level Kotlin support in Spring Boot 4.
  3. JetBrains (2025). Strengthening Kotlin for backend development: a strategic partnership with Spring.
  4. Spring Boot. Release notes Spring Boot 4.0 і гайд з міграції.
  5. Документація Spring Framework. Kotlin, coroutines, resilience features.
  6. Документація Kotlin. Null safety, плагіни all-open і no-arg, What's new in Kotlin 2.0.
  7. OpenJDK. JEP 444: Virtual Threads.
  8. Apache Kafka. Анонс Kafka 4.0.
  9. Netflix. Статус Hystrix.
  10. JSpecify — стандартні анотації nullness для Java.