За останні три роки 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 досі сильніша
- Високонавантажені low-latency сервіси. Знання з тюнінгу JVM, розбори GC та інструменти профілювання переважно орієнтовані на Java. Kotlin компілюється в той самий байт-код, але дебажити команда буде на Java-прикладах.
- Команди, де всі senior'и пишуть на Java 5+ років. Переучування коштує більше за виграш, тим паче що сучасна Java (records, pattern matching, virtual threads) суттєво скоротила ергономічний розрив.
- Статичний аналіз. Error Prone, NullAway і SpotBugs орієнтовані на Java. Для Kotlin ми використовуємо detekt і ktlint — вони хороші, але екосистема правил менша.
- Фреймворки, чутливі до байт-коду. Класи 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-сервіс
- Додайте Kotlin-плагін для Gradle або Maven разом із
kotlin-springіkotlin-jpa. Java і Kotlin можуть жити в одному модулі. - Спершу пишіть нові тести на Kotlin. Ризик мінімальний, а команда вивчає мову на реальному коді.
- Нові класи пишіть на Kotlin; наявні конвертуйте лише тоді, коли все одно їх змінюєте.
- Домовтеся про конвенції заздалегідь: правила 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 ми більше не починаємо.
Джерела
- Spring (2025). Spring Boot 4.0.0 available now.
- Spring (2025). Next level Kotlin support in Spring Boot 4.
- JetBrains (2025). Strengthening Kotlin for backend development: a strategic partnership with Spring.
- Spring Boot. Release notes Spring Boot 4.0 і гайд з міграції.
- Документація Spring Framework. Kotlin, coroutines, resilience features.
- Документація Kotlin. Null safety, плагіни all-open і no-arg, What's new in Kotlin 2.0.
- OpenJDK. JEP 444: Virtual Threads.
- Apache Kafka. Анонс Kafka 4.0.
- Netflix. Статус Hystrix.
- JSpecify — стандартні анотації nullness для Java.