🔥 Полезная подборка каналов только код, практика и самые передовые инструменты, которые используют разработчики прямо сейчас.👇
🖥 ИИ: t.me/ai_machinelearning_big_data
🖥 Python: t.me/pythonl
🖥 Linux: t.me/linuxacademiya
🖥 C++ t.me/cpluspluc
🖥 Docker: t.me/DevopsDocker
🖥 Хакинг: t.me/linuxkalii
🖥 Devops: t.me/DevOPSitsec
👣 Golang: t.me/Golang_google
🖥 Аналитика: t.me/data_analysis_ml
🖥 Javascript: t.me/javascriptv
🖥 C#: t.me/csharp_ci
🖥 Java: t.me/javatg
🖥 Базы данных: t.me/sqlhub
👣 Rust: t.me/rust_code
🤖 Технологии: t.me/vistehno
💰 Экономика и инвестиции в ИИ t.me/financeStable
💼 Актуальные вакансии: t.me/addlist/_zyy_jQ_QUsyM2Vi
🖥 Подборка по Golang: https://xn--r1a.website/addlist/MUtJEeJSxeY2YTFi
⚡️ Лучшие ИИ ресурсы: https://xn--r1a.website/addlist/2Ls-snqEeytkMDgy
Max ИИ: https://max.ru/ai_machinelearning_big_data
Max Ml: https://max.ru/vistehno
Max python: https://max.ru/pythonl
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Max Java: https://max.ru/javatg
Max Sql: https://max.ru/sqlhub
Max Devops: https://max.ru/DevOPSitsec
Анализ данных: https://max.ru/data_analysis_ml
C++ : https://max.ru/cpluspluc
C#: https://max.ru/csharp_ci
🖥 Chatgpt бот в тг: t.me/Chatgpturbobot
📚 Бесплатные ит-книги: https://xn--r1a.website/addlist/HwywK4fErd8wYzQy
💰 Экономика и инвестиции в ИИ t.me/financeStable
💼 Актуальные вакансии: t.me/addlist/_zyy_jQ_QUsyM2Vi
⚡️ Лучшие ИИ ресурсы: https://xn--r1a.website/addlist/2Ls-snqEeytkMDgy
Max ИИ: https://max.ru/ai_machinelearning_big_data
Max Ml: https://max.ru/vistehno
Max python: https://max.ru/pythonl
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Max Java: https://max.ru/javatg
Max Sql: https://max.ru/sqlhub
Max Devops: https://max.ru/DevOPSitsec
Анализ данных: https://max.ru/data_analysis_ml
C++ : https://max.ru/cpluspluc
C#: https://max.ru/csharp_ci
📚 Бесплатные ит-книги: https://xn--r1a.website/addlist/HwywK4fErd8wYzQy
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2😁1
Forwarded from Java
🚀 Java 26 стала умнее — особенно в pattern matching
Теперь работа с pattern matching выражениями стала заметно стабильнее и предсказуемее
Что улучшили:
🟢 Более надёжный type inference
компилятор лучше понимает типы в сложных условиях
🟢 Меньше edge-case ошибок
меньше неожиданных падений и предупреждений
🟢 Консистентное поведение
одинаковая логика в if и switch
Что это даёт на практике:
раньше при усложнении условий
компилятор мог “теряться”
теперь:
- анализ потока стал умнее
- переменные из pattern matching корректно распознаются
- код становится чище и безопаснее
Java становится всё ближе к современным языкам
с удобным и предсказуемым контролем типов
#Java #JavaDev
⚡️ Полезные ресурсы по Java 🚀 Max
@javatg
Теперь работа с pattern matching выражениями стала заметно стабильнее и предсказуемее
Что улучшили:
🟢 Более надёжный type inference
компилятор лучше понимает типы в сложных условиях
🟢 Меньше edge-case ошибок
меньше неожиданных падений и предупреждений
🟢 Консистентное поведение
одинаковая логика в if и switch
Что это даёт на практике:
раньше при усложнении условий
компилятор мог “теряться”
теперь:
- анализ потока стал умнее
- переменные из pattern matching корректно распознаются
- код становится чище и безопаснее
Java становится всё ближе к современным языкам
с удобным и предсказуемым контролем типов
#Java #JavaDev
⚡️ Полезные ресурсы по Java 🚀 Max
@javatg
❤5👍2🔥1😁1
🚀 Spring Boot: не делай эту ошибку с filters / interceptors
Многие используют фильтры и интерцепторы неправильно 👇
👉 Они должны быть только для cross-cutting задач
(то, что применяется ко ВСЕМ запросам)
Примеры нормального использования:
🟢 Filters:
- CORS
- Encoding
🟢 Interceptors:
- аутентификация / авторизация
- метрики / логирование
- locale
- общие headers
❌ Главная ошибка:
кладут туда бизнес-логику
Например:
- запрос в БД
- проверка подписки
- сложная логика
Почему это плохо:
- выполняется на КАЖДЫЙ запрос
- создаёт лишнюю нагрузку
- ломает архитектуру
- усложняет тестирование
📉 Итог:
interceptor превращается в «мусорный слой»
💡 Как правильно:
- бизнес-логика → в сервисах
- контроллеры → orchestration
⚡️ Полезные ресурсы по Java 🚀 Max
Многие используют фильтры и интерцепторы неправильно 👇
👉 Они должны быть только для cross-cutting задач
(то, что применяется ко ВСЕМ запросам)
Примеры нормального использования:
🟢 Filters:
- CORS
- Encoding
🟢 Interceptors:
- аутентификация / авторизация
- метрики / логирование
- locale
- общие headers
❌ Главная ошибка:
кладут туда бизнес-логику
Например:
- запрос в БД
- проверка подписки
- сложная логика
Почему это плохо:
- выполняется на КАЖДЫЙ запрос
- создаёт лишнюю нагрузку
- ломает архитектуру
- усложняет тестирование
📉 Итог:
interceptor превращается в «мусорный слой»
💡 Как правильно:
- бизнес-логика → в сервисах
- контроллеры → orchestration
⚡️ Полезные ресурсы по Java 🚀 Max
❤7👍6🔥4
🧠 Можно ли переопределить
Нет, нельзя.
Метод
📌 Почему:
-
-
- Гарантирует, что при вызове
💡 Если хотите вернуть “свой” тип, делайте отдельный метод:
⚠️ Переопределяемый
⚡️ Полезные ресурсы по Java 🚀 Max
getClass() в Java?Нет, нельзя.
Метод
getClass() в java.lang.Object объявлен так:
public final native Class<?> getClass();
📌 Почему:
-
final — запрещает переопределение в наследниках.-
native — реализован в JVM, а не на Java.- Гарантирует, что при вызове
obj.getClass() всегда вернётся реальный класс объекта, без подмен и сюрпризов.💡 Если хотите вернуть “свой” тип, делайте отдельный метод:
class MyClass {
public String getTypeName() {
return "CustomType";
}
}
⚠️ Переопределяемый
getClass() сломал бы рефлексию, сериализацию и кучу системных механизмов. Именно поэтому Java защищает его.⚡️ Полезные ресурсы по Java 🚀 Max
❤9👍6🔥2
🔥 Лучшие БЕСПЛАТНЫЕ ресурсы по Linux в 2026 году
1. Linux Foundation Training
https://training.linuxfoundation.org/training/introduction-to-linux/
2. Linux Journey
https://linuxjourney.com
3. Ubuntu Tutorials
https://ubuntu.com/tutorials
4. Red Hat Training Resources
https://developers.redhat.com/learn
5. Документация GNU
https://gnu.org/manual
6. OverTheWire Bandit (Linux-варгеймы)
https://overthewire.org/wargames
7. Книга The Linux Command Line
https://linuxcommand.org/tlcl.php
8. MIT Missing Semester (Linux и CLI)
https://missing.csail.mit.edu
9. Туториалы по Linux от DigitalOcean
https://digitalocean.com/community/tutorials
10. Linux From Scratch
https://linuxfromscratch.org
11. Arch Linux Wiki
https://wiki.archlinux.org
12. Курс по Linux от freeCodeCamp
https://freecodecamp.org/news/tag/linux
13. Linux Survival (интерактивное обучение)
https://linuxsurvival.com
14. NDG Linux Essentials
https://netacad.com/courses/os-it/ndg-linux-essentials
15. Bash Guide (руководство по Bash)
https://tldp.org/LDP/Bash-Beginners-Guide/html
1. Linux Foundation Training
https://training.linuxfoundation.org/training/introduction-to-linux/
2. Linux Journey
https://linuxjourney.com
3. Ubuntu Tutorials
https://ubuntu.com/tutorials
4. Red Hat Training Resources
https://developers.redhat.com/learn
5. Документация GNU
https://gnu.org/manual
6. OverTheWire Bandit (Linux-варгеймы)
https://overthewire.org/wargames
7. Книга The Linux Command Line
https://linuxcommand.org/tlcl.php
8. MIT Missing Semester (Linux и CLI)
https://missing.csail.mit.edu
9. Туториалы по Linux от DigitalOcean
https://digitalocean.com/community/tutorials
10. Linux From Scratch
https://linuxfromscratch.org
11. Arch Linux Wiki
https://wiki.archlinux.org
12. Курс по Linux от freeCodeCamp
https://freecodecamp.org/news/tag/linux
13. Linux Survival (интерактивное обучение)
https://linuxsurvival.com
14. NDG Linux Essentials
https://netacad.com/courses/os-it/ndg-linux-essentials
15. Bash Guide (руководство по Bash)
https://tldp.org/LDP/Bash-Beginners-Guide/html
❤6
🚀 Java - regex без боли
Нашли интересную библиотеку - Sift. Она заменяет весь этот ад с регулярками на нормальный fluent API.
Теперь вместо нечитаемых строк вида:
^[0-9a-fA-F]{6}$
Пишешь код, который реально понимаешь:
.char('#')
.then()
.exactly(6)
.hexDigits()
📌 Что это дает:
- Читаемый и понятный код
- Меньше ошибок в regex
- Быстрее разработка и поддержка
По сути — это как “переводчик” с языка регулярных выражений на человеческий Java-код.
Если когда-нибудь ломал голову над regex -это прям must-have.
#Java #JavaDev
Нашли интересную библиотеку - Sift. Она заменяет весь этот ад с регулярками на нормальный fluent API.
Теперь вместо нечитаемых строк вида:
^[0-9a-fA-F]{6}$
Пишешь код, который реально понимаешь:
.char('#')
.then()
.exactly(6)
.hexDigits()
📌 Что это дает:
- Читаемый и понятный код
- Меньше ошибок в regex
- Быстрее разработка и поддержка
По сути — это как “переводчик” с языка регулярных выражений на человеческий Java-код.
Если когда-нибудь ломал голову над regex -это прям must-have.
#Java #JavaDev
❤9👍5🤔2
⚡️ Java лайфхак: не убивай производительность боксингом
Многие даже не замечают, как теряют скорость из-за автoboxing в Stream API.
❌ Плохо (создаются объекты Integer):
Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sum = boxed.reduce(0, Integer::sum);
Каждое число → объект → лишняя память + нагрузка на GC
✅ Хорошо (работа с примитивами):
int sum = IntStream.of(1, 2, 3, 4, 5).sum();
Без лишних объектов. Быстрее. Чище.
Запомни:
- IntStream → для int
- LongStream → для long
- DoubleStream → для double
Если работаешь с числами — всегда используй primitive streams.
Это мелочь, которая на больших данных превращается в реальную экономию ресурсов.
Сохрани, чтобы не писать медленный код.
Многие даже не замечают, как теряют скорость из-за автoboxing в Stream API.
❌ Плохо (создаются объекты Integer):
Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sum = boxed.reduce(0, Integer::sum);
Каждое число → объект → лишняя память + нагрузка на GC
✅ Хорошо (работа с примитивами):
int sum = IntStream.of(1, 2, 3, 4, 5).sum();
Без лишних объектов. Быстрее. Чище.
Запомни:
- IntStream → для int
- LongStream → для long
- DoubleStream → для double
Если работаешь с числами — всегда используй primitive streams.
Это мелочь, которая на больших данных превращается в реальную экономию ресурсов.
Сохрани, чтобы не писать медленный код.
❤7👍5🔥2
Это не просто подборка, а реально огромные библиотеки
от художки до научных статей, диссертаций и учебников.
И главное
базы постоянно обновляются
• planetebook.com
• oceanofpdf.com
• freecomputerbooks.com
• zlibrary.to
• bookboon.com
• gutenberg.org
• manybooks.net
• pdfdrive.com
• digilibraries.com
• openlibrary.org
• standardebooks.org
• librivox.org
• getfreeebooks.com
• authorama.com
Если читаешь и прокачиваешься
сохрани, пригодится
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
Spring Boot может уронить API из-за одного лишнего поля в JSON
Классика: приходит запрос с дополнительным полем, которого нет в DTO и ты ловишь UnrecognizedPropertyException. Клиент добавил поле, ты не обновил модель - всё падает.
Решение в одну строку:
Теперь Jackson просто игнорирует лишние поля вместо того, чтобы ломать приложение.
Полезно, когда API живёт долго, клиенты обновляются быстрее бэка, а ломать совместимость нельзя.
Классика: приходит запрос с дополнительным полем, которого нет в DTO и ты ловишь UnrecognizedPropertyException. Клиент добавил поле, ты не обновил модель - всё падает.
Решение в одну строку:
@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}
Теперь Jackson просто игнорирует лишние поля вместо того, чтобы ломать приложение.
Полезно, когда API живёт долго, клиенты обновляются быстрее бэка, а ломать совместимость нельзя.
❤6👍6🔥1😁1
🚀 Ты всё ещё называешь обёртку над ChatGPT «AI-продуктом»?
Пока ты пишешь промпты - рынок уже ушёл дальше.
Сейчас выигрывают не те, кто умеет красиво формулировать запросы, а те, кто строит агентные системы:
- принимают решения сами
- ходят в API
- работают с Postgres и Redis
- управляют браузером через Playwright
- доводят задачи до результата без человека
И вот правда, о которой мало говорят:
90% таких систем умирают между ноутбуком и продом.
Работает локально. Ломается в реальности.
Нет архитектуры. Нет устойчивости. Нет деплоя.
AI Agents Engineering - курс со Stepik, который закрывает этот разрыв.
- LangGraph, AutoGen, Computer Use
- архитектура агентов, а не «скрипты на коленке»
- LLMOps, логирование, стабильность
- деплой в Docker и работа в проде
8 модулей, 120+ шагов, всё через практику.
На выходе не «сертификат ради галочки», а:
- рабочий production-агент
- понимание, как строить такие системы с нуля
- навыки, за которые уже платят
Сейчас самое окно входа.
Через полгода это станет базой, а не преимуществом.
Скидка 55% действует ещё 48 часов: https://stepik.org/a/276971/
Пока ты пишешь промпты - рынок уже ушёл дальше.
Сейчас выигрывают не те, кто умеет красиво формулировать запросы, а те, кто строит агентные системы:
- принимают решения сами
- ходят в API
- работают с Postgres и Redis
- управляют браузером через Playwright
- доводят задачи до результата без человека
И вот правда, о которой мало говорят:
90% таких систем умирают между ноутбуком и продом.
Работает локально. Ломается в реальности.
Нет архитектуры. Нет устойчивости. Нет деплоя.
AI Agents Engineering - курс со Stepik, который закрывает этот разрыв.
- LangGraph, AutoGen, Computer Use
- архитектура агентов, а не «скрипты на коленке»
- LLMOps, логирование, стабильность
- деплой в Docker и работа в проде
8 модулей, 120+ шагов, всё через практику.
На выходе не «сертификат ради галочки», а:
- рабочий production-агент
- понимание, как строить такие системы с нуля
- навыки, за которые уже платят
Сейчас самое окно входа.
Через полгода это станет базой, а не преимуществом.
Скидка 55% действует ещё 48 часов: https://stepik.org/a/276971/
❤5👍1🔥1
⚡️ Перестаём писать методы с 7+ параметрами
Если сигнатура выглядит как:
Это уже сигнал, что модель данных развалилась.
Проблема не только в читаемости.
Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок.
Нормальный вариант - собрать связанные данные в объект:
Получаем:
- чище API
- проще добавлять поля
- меньше ошибок при передаче параметров
- код начинает отражать доменную модель, а не список строк
Это базовый приём, но именно на нём чаще всего экономят, а потом платят сложностью.
Если сигнатура выглядит как:
createUser(firstName, lastName, email, phone, address, city, country)
Это уже сигнал, что модель данных развалилась.
Проблема не только в читаемости.
Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок.
Нормальный вариант - собрать связанные данные в объект:
UserInfo userInfoПолучаем:
- чище API
- проще добавлять поля
- меньше ошибок при передаче параметров
- код начинает отражать доменную модель, а не список строк
Это базовый приём, но именно на нём чаще всего экономят, а потом платят сложностью.
❤11👎3👍2✍1🔥1
Представьте: через три месяца вы открываете чужой Rust-код и читаете его как книгу.
Arc<Mutex<T>> не вызывает панику. impl Future не пугает. Вы точно знаете, почему компилятор ругается и как это починить за 10 секунд.
Это не фантазия. Это результат 50 уроков, в которых каждая концепция объясняется через код и закрепляется практикой.
Ownership, traits, generics, async, unsafe - всё, что казалось магией, станет рабочим инструментом.А бонусом - портфолио проектов: от CLI-утилит до REST API и WebAssembly.
Вы и так знаете, что Rust - ваш следующий язык. Этот курс просто сделает это реальностью.
Сегодня - 55% процентов от цены, торопись: https://stepik.org/a/269250/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1🔥1
Если frontend и backend живут на разных доменах или портах, браузер начнет резать запросы по CORS. Это не баг Spring Boot и не проблема React. Это нормальный механизм безопасности браузера.
Правильный способ - настроить CORS на стороне backend.
В Spring Boot это можно сделать глобально через
WebMvcConfigurer: указать маршруты, разрешенные origins, HTTP-методы, заголовки и работу с credentials.Главное - не ставить бездумно
* везде подряд, особенно если используете cookies, токены или allowCredentials(true). В проде лучше явно перечислять доверенные домены, например frontend-домен приложения.Такой подход дает централизованный контроль: вы один раз задаете политику CORS и не размазываете настройки по каждому контроллеру.
Для Java backend-разработчика это базовая, но важная вещь: CORS должен быть частью архитектуры API, а не случайной правкой перед деплоем.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍5🔥1
Небольшой, но полезный совет для Spring Boot.
Если у вас есть scheduled task, не стоит хардкодить интервал прямо в аннотации:
Лучше вынести значение в конфиг:
А в
Почему так лучше:
• интервал можно менять без правки кода;
• настройки проще различать для dev, staging и production;
• меньше магических чисел в бизнес-логике;
• конфигурация становится прозрачнее.
Мелочь, но именно из таких мелочей и складывается нормальная поддерживаемость Spring Boot-проекта.
Если у вас есть scheduled task, не стоит хардкодить интервал прямо в аннотации:
`@Scheduled(fixedRate = 5000)`
Лучше вынести значение в конфиг:
`@Scheduled(fixedRateString = "${task.interval}")`
А в
application.properties указать:
`task.interval=5000`
Почему так лучше:
• интервал можно менять без правки кода;
• настройки проще различать для dev, staging и production;
• меньше магических чисел в бизнес-логике;
• конфигурация становится прозрачнее.
Мелочь, но именно из таких мелочей и складывается нормальная поддерживаемость Spring Boot-проекта.
👍10❤7
13 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
N+1 в Spring Boot выглядит безобидно, пока прод не начинает молиться на базу данных.
Классический сценарий:
Вы грузите список заказов:
А потом в цикле обращаетесь к
Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
В итоге Hibernate может сгенерировать один запрос с
Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
Классический сценарий:
Вы грузите список заказов:
orderRepository.findAll()А потом в цикле обращаетесь к
order.getItems().Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
@EntityGraph.Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
@EntityGraph(attributePaths = {"items"})В итоге Hibernate может сгенерировать один запрос с
JOIN, вместо десятков лишних походов в базу.Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
LAZY сам по себе не зло. Зло - когда вы не контролируете, где и как он срабатывает.@EntityGraph - один из самых простых способов держать N+1 под контролем в Spring Boot.❤12👍4
Spring Boot: уберите try/catch из контроллеров
В Spring Boot не нужно размазывать обработку ошибок по каждому endpoint через бесконечные
Для этого есть
Идея простая: вы выносите обработку исключений в один глобальный класс, а контроллеры оставляете чистыми.
Например:
После этого контроллер может выглядеть спокойно:
Если пользователь не найден - сервис кидает ResourceNotFoundException, а Spring сам отправит нормальный 404.
Что это даёт:
• меньше мусора в контроллерах
• единый формат ошибок
• проще поддерживать API
• легче логировать исключения
• меньше копипасты в endpoint-ах
Контроллер должен описывать сценарий запроса, а не превращаться в свалку обработки ошибок.
В Spring Boot не нужно размазывать обработку ошибок по каждому endpoint через бесконечные
try/catch.Для этого есть
@RestControllerAdvice.Идея простая: вы выносите обработку исключений в один глобальный класс, а контроллеры оставляете чистыми.
Например:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<?> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse("NOT_FOUND", ex.getMessage()));
}
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<?> handleBadRequest(IllegalArgumentException ex) {
return ResponseEntity
.badRequest()
.body(new ErrorResponse("BAD_REQUEST", ex.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleGeneric(Exception ex) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("INTERNAL_ERROR", "Something went wrong"));
}
}
После этого контроллер может выглядеть спокойно:
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
Если пользователь не найден - сервис кидает ResourceNotFoundException, а Spring сам отправит нормальный 404.
Что это даёт:
• меньше мусора в контроллерах
• единый формат ошибок
• проще поддерживать API
• легче логировать исключения
• меньше копипасты в endpoint-ах
Контроллер должен описывать сценарий запроса, а не превращаться в свалку обработки ошибок.
❤5👍2🥰1
Твой код — в сердце мощного ИИ! 💚
Команда GigaChat зовёт на One Day Offer амбициозных Java-разработчиков, которые готовы создавать AI‑продукты уровня BigTech и стать частью крупнейшего AI-комьюнити.
Если ты дружишь с Java (версии 8–25), ладишь со Spring и Hibernate, а PostgreSQL и ClickHouse для тебя — не просто слова, переходи по ссылке и занимай слот на One Day Offer.
Встречаемся 23 мая — очень ждём именно тебя!
Команда GigaChat зовёт на One Day Offer амбициозных Java-разработчиков, которые готовы создавать AI‑продукты уровня BigTech и стать частью крупнейшего AI-комьюнити.
Если ты дружишь с Java (версии 8–25), ладишь со Spring и Hibernate, а PostgreSQL и ClickHouse для тебя — не просто слова, переходи по ссылке и занимай слот на One Day Offer.
Встречаемся 23 мая — очень ждём именно тебя!
❤3
Forwarded from Java
N+1 в Spring Boot выглядит безобидно, пока прод не начинает молиться на базу данных.
Классический сценарий:
Вы грузите список заказов:
А потом в цикле обращаетесь к
Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
В итоге Hibernate может сгенерировать один запрос с
Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
Классический сценарий:
Вы грузите список заказов:
orderRepository.findAll()А потом в цикле обращаетесь к
order.getItems().Hibernate сначала делает один запрос за заказами, а потом ещё по одному запросу на каждый заказ, чтобы достать items.
100 заказов = 101 SQL-запрос.
И вот здесь спасает
@EntityGraph.Он позволяет явно сказать репозиторию, какие связи нужно подтянуть сразу:
@EntityGraph(attributePaths = {"items"})В итоге Hibernate может сгенерировать один запрос с
JOIN, вместо десятков лишних походов в базу.Что получаем:
- меньше SQL-запросов
- меньше нагрузки на БД
- чище код репозитория
- без ручного JPQL
- fetch-стратегия управляется точечно под конкретный кейс
LAZY сам по себе не зло. Зло - когда вы не контролируете, где и как он срабатывает.@EntityGraph - один из самых простых способов держать N+1 под контролем в Spring Boot.❤2