Please open Telegram to view this post
VIEW IN TELEGRAM
🎯 Как настроить CORS в Spring Boot
Когда фронт и бэк живут на разных доменах — CORS становится головной болью. Но Spring Boot даёт достаточно способов это настроить — от простых аннотаций до централизованной фильтрации.
1️⃣ Минимальная настройка — через @CrossOrigin
Если нужно открыть доступ только к одному контроллеру или методу:
Удобно для быстрого прототипа, но неудобно для масштабируемого решения.
2️⃣ Глобальная настройка через WebMvcConfigurer
Если CORS нужен везде, лучше использовать конфигурационный класс:
Даёт полный контроль. Можно задать разные правила для разных путей.
3️⃣ Настройка CORS через application.yml (Spring Cloud Gateway)
Если вы используете Gateway, настройка может быть ещё проще:
Подходит, если CORS должен работать до попадания запроса в конкретный микросервис.
4️⃣ CORS + безопасность
Если CORS работает «через раз», возможно, его блокирует Spring Security. Добавьте .cors() в конфигурацию:
5️⃣ Тестирование CORS
✅ Проверьте через curl:
Ответ должен содержать заголовки:
📌 Не оставляйте allowedOrigins("*") в проде. Это дыра в безопасности. Нужно чётко указывать домены.
💬 Как вы обычно настраиваете CORS в своих микросервисах?
🐸 Библиотека джависта #буст
Когда фронт и бэк живут на разных доменах — CORS становится головной болью. Но Spring Boot даёт достаточно способов это настроить — от простых аннотаций до централизованной фильтрации.
Если нужно открыть доступ только к одному контроллеру или методу:
@CrossOrigin(origins = "https://example.com")
@RestController
public class ApiController {
@GetMapping("/data")
public String getData() {
return "OK";
}
}
Удобно для быстрого прототипа, но неудобно для масштабируемого решения.
Если CORS нужен везде, лучше использовать конфигурационный класс:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}
Даёт полный контроль. Можно задать разные правила для разных путей.
Если вы используете Gateway, настройка может быть ещё проще:
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOrigins: "https://example.com"
allowedMethods:
- GET
- POST
allowedHeaders: "*"
Подходит, если CORS должен работать до попадания запроса в конкретный микросервис.
Если CORS работает «через раз», возможно, его блокирует Spring Security. Добавьте .cors() в конфигурацию:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.cors() // 👈 Без этого CORS не заработает
.and()
.authorizeHttpRequests(auth -> auth.anyRequest().permitAll());
return http.build();
}
}
✅ Проверьте через curl:
curl -H "Origin: https://example.com" \
-H "Access-Control-Request-Method: GET" \
-X OPTIONS http://localhost:8080/data -v
Ответ должен содержать заголовки:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Please open Telegram to view this post
VIEW IN TELEGRAM
DTO — штука вроде очевидная: "не светить сущностями наружу". Но что дальше?
🔹 Кто-то делает DTO только в контроллерах, а внутри работает с доменными объектами.
🔹 Кто-то строит слоистую модель DTO-шек, даже между сервисами и репозиториями.
🔹 А кто-то вообще говорит: «DTO везде — меньше связность, проще миграции, лучше тестируемость».
— Где заканчивается польза от DTO, а где начинается бессмысленная бюрократия?
— DTO только на границах приложения или вообще везде?
— Или пора забить и возвращать UserEntity напрямую в контроллер?
Please open Telegram to view this post
VIEW IN TELEGRAM
Работаете в большом проекте и устали искать, где находится метод или переменная? IntelliJ IDEA умеет молниеносно прыгать к исходному коду — всё, что нужно, это Ctrl + B (или Cmd + B на macOS).
🔹 Зачем это нужно
— Вместо ручного поиска по файлам вы сразу попадаете в нужное место в коде.
— Работает с методами, классами, интерфейсами, переменными, импортами и даже с SQL-мэппингами в JPA.
🔹 Как использовать
— Наведите курсор на интересующий метод, переменную или класс.
— Нажмите Ctrl + B (или Cmd + B на macOS).
— IDEA мгновенно откроет определение — будь то в вашем коде, в сторонней библиотеке или в decompiled-классе.
Очень удобно, когда нужно быстро понять, что именно делает вызываемый метод, особенно если работаете с чужим кодом.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Азбука айтишника
🎓 Как выбрать свою роль в Data Science и не потеряться в терминах
Если вы только начинаете разбираться в Data Science — перед вами лабиринт из названий: data scientist, аналитик, ML-инженер, BI, архитектор... Кто чем занимается? Что нужно учить?
➡️ Что внутри статьи
— Кто такие Data Engineer
— Чем отличается Data Architect от инженера и зачем он нужен в big data проектах
— Чем занимаются Data Analyst и почему это отличная точка входа в карьеру
— Что делает настоящий Data Scientist
В статье разобрано всё: от задач до технологий, которые реально спрашивают на собеседованиях.
📎 Ссылка
Азбука айтишника #ликбез
Если вы только начинаете разбираться в Data Science — перед вами лабиринт из названий: data scientist, аналитик, ML-инженер, BI, архитектор... Кто чем занимается? Что нужно учить?
— Кто такие Data Engineer
— Чем отличается Data Architect от инженера и зачем он нужен в big data проектах
— Чем занимаются Data Analyst и почему это отличная точка входа в карьеру
— Что делает настоящий Data Scientist
В статье разобрано всё: от задач до технологий, которые реально спрашивают на собеседованиях.
📎 Ссылка
Азбука айтишника #ликбез
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍 Загадка для разработчиков
Что за паттерн загадан на картинке? Пишите в комменты ответ под спойлером.
💬 Рассказывайте интересные кейсы реализации из практики
🐸 Библиотека джависта #междусобойчик
Что за паттерн загадан на картинке? Пишите в комменты ответ под спойлером.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 Spring-потрошитель
Автор делится опытом анализа и оптимизации Spring-приложений, выявляя скрытые зависимости и избыточные компоненты.
Рассматриваются методы обнаружения неиспользуемых бинов, циклических зависимостей и других архитектурных дефектов, влияющих на производительность и поддерживаемость кода.
🔹 Тестирование CAP-теоремы на примере MongoDB
Автор проводит серию тестов с различными параметрами writeConcern и readConcern, анализируя их влияние на согласованность и доступность данных.
Рассматриваются реальные сценарии, включая сбои и аварийные ситуации, с целью выявления оптимальных настроек для обеспечения требуемых свойств системы.
🔹 Clean your Memory: From Finalize to Cleaner
Рассматриваются проблемы, связанные с finalize(), такие как непредсказуемость вызова и возможные утечки памяти.
Введение в Cleaner предоставляет более гибкий и эффективный механизм для освобождения ресурсов, улучшая производительность и стабильность приложений.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека задач по Java | тесты, код, задания
Как улучшить код? Отвечайте на опрос и добавляйте варианты в комментарии.
Forwarded from Библиотека задач по Java | тесты, код, задания
Как можно улучшить архитектуру этого сервиса?
Anonymous Quiz
7%
Перенести метод calculateTotal в контроллер
10%
Объединить OrderRepository и EmailService в один фасад
47%
Вынести отправку email в доменное событие (OrderCreatedEvent)
21%
Использовать @Transactional в методе calculateTotal
15%
Добавить логирование
🔥 Конкурс: 30 000 ₽ за самую смешную IT-новость
Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.
📅 Сроки: прием новостей до 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Осталась неделя — ждем ваших новостей!
Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.
📅 Сроки: прием новостей до 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Осталась неделя — ждем ваших новостей!
Google Docs
Конкурс на самую смешную IT-новость
Библиотека программиста запускает конкурс, который взорвет вашу ленту: создайте самую смешную альтернативную версию реальной IT-новости!
Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переворачиваете её с ног на голову, чтобы смеялись…
Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переворачиваете её с ног на голову, чтобы смеялись…
Java Developer — 250 000 — 450 000 ₽ — гибрид (Москва, Санкт-Петербург, Екатеринбург, Нижний Новгород, Казань, Новосибирск, Симферополь, Минск)
Java-разработчик (стажер/intern) — до 60 000 ₽ — гибрид (Екатеринбург)
Разработчик на Java (Кинопоиск) — 300 000 — 370 000 ₽ — гибрид (Москва, Санкт-Петербург)
Java Developer — до 500 000 ₽ — гибрид (Москва)
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Инструмент недели: Apache Sling
Apache Sling — это фреймворк для создания контент-ориентированных приложений на Java. Он использует RESTful архитектуру, в которой URL-адреса напрямую соответствуют структуре контента в репозитории, что позволяет создавать гибкие и масштабируемые веб-приложения.
Фичи: интеграция с репозиториями JCR, поддержка различных языков шаблонов и скриптов, динамическая загрузка компонентов с помощью OSGi, модульность и масштабируемость. Apache Sling идеально подходит для разработки приложений, ориентированных на управление контентом.
🔗 Apache Sling на GitHub
🐸 Библиотека джависта #буст
Apache Sling — это фреймворк для создания контент-ориентированных приложений на Java. Он использует RESTful архитектуру, в которой URL-адреса напрямую соответствуют структуре контента в репозитории, что позволяет создавать гибкие и масштабируемые веб-приложения.
Фичи: интеграция с репозиториями JCR, поддержка различных языков шаблонов и скриптов, динамическая загрузка компонентов с помощью OSGi, модульность и масштабируемость. Apache Sling идеально подходит для разработки приложений, ориентированных на управление контентом.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧘♂️ Скучная работа в IT: путь к счастью или упущенные возможности?
В мире IT царит культ престижных компаний — FAANG, стартапов, хайпа. Но что, если настоящая гармония скрыта в «скучной» работе с мягкими дедлайнами, стабильным графиком и отсутствием стресса. Может ли спокойная работа в нетехнических компаниях быть ключом к удовлетворению и балансу между работой и личной жизнью?
🔹 Основные тезисы:
— Сотрудники «скучных» компаний отмечают спокойный темп работы, что позволяет уделять больше времени хобби и семье.
— Отсутствие переработок и гибкий график способствуют лучшему самочувствию и удовлетворенности жизнью.
— Хотя зарплаты могут быть ниже, стабильность и льготы компенсируют это.
💬 Стоит ли жертвовать карьерными амбициями ради спокойствия?
🔗 Подробнее в статье
🐸 Библиотека джависта #буст
В мире IT царит культ престижных компаний — FAANG, стартапов, хайпа. Но что, если настоящая гармония скрыта в «скучной» работе с мягкими дедлайнами, стабильным графиком и отсутствием стресса. Может ли спокойная работа в нетехнических компаниях быть ключом к удовлетворению и балансу между работой и личной жизнью?
🔹 Основные тезисы:
— Сотрудники «скучных» компаний отмечают спокойный темп работы, что позволяет уделять больше времени хобби и семье.
— Отсутствие переработок и гибкий график способствуют лучшему самочувствию и удовлетворенности жизнью.
— Хотя зарплаты могут быть ниже, стабильность и льготы компенсируют это.
Please open Telegram to view this post
VIEW IN TELEGRAM
Нужно быстро набросать сервис для бизнес-функции? AI поможет сэкономить часы на шаблонах, валидации и boilerplate.
📝 Промпт:
Generate a Spring Boot REST endpoint that handles [описание бизнес-логики]. Include request/response DTOs, validation, exception handling, and service-layer interaction. Use best practices and explain design decisions.
— Добавьте
Use Java 17+ features if possible
, чтобы сразу писать современно— Добавьте
Add unit tests for controller and service
, чтобы не откладывать на потом— Добавьте
Make it modular for future feature extension
, если планируется масштабированиеPlease open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🎯 Как добавить кастомные метрики в Spring Boot Actuator
В проде важно не просто «чтобы работало», а знать, как работает. Spring Boot Actuator позволяет получать системную информацию, но по-настоящему полезным он становится с кастомными метриками.
1️⃣ Добавьте зависимости
Также добавьте экспорт метрик в application.yml:
2️⃣ Создайте кастомную метрику
Например, метрика количества обращений к сервису:
Теперь можно вызывать countRequest() в любом месте.
3️⃣ Интегрируйте в проект
Каждый вызов /hello увеличивает счётчик.
4️⃣ Проверьте метрику
Откройте в браузере или через curl:
Найдите строку:
📌 Реальный профит: такие метрики позволяют строить Grafana-дэшборды, ставить алерты в Prometheus и быстро ловить аномалии.
💬 Используете кастомные метрики или довольствуетесь встроенными?
🐸 Библиотека джависта #буст
В проде важно не просто «чтобы работало», а знать, как работает. Spring Boot Actuator позволяет получать системную информацию, но по-настоящему полезным он становится с кастомными метриками.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Также добавьте экспорт метрик в application.yml:
management:
endpoints:
web:
exposure:
include: health, info, metrics, prometheus
metrics:
export:
prometheus:
enabled: true
Например, метрика количества обращений к сервису:
@Component
public class CustomMetrics {
private final Counter requestCounter;
public CustomMetrics(MeterRegistry registry) {
this.requestCounter = Counter.builder("custom_requests_total")
.description("Total custom requests")
.register(registry);
}
public void countRequest() {
requestCounter.increment();
}
}
Теперь можно вызывать countRequest() в любом месте.
@RestController
@RequiredArgsConstructor
public class MetricsTestController {
private final CustomMetrics customMetrics;
@GetMapping("/hello")
public String hello() {
customMetrics.countRequest();
return "Hello!";
}
}
Каждый вызов /hello увеличивает счётчик.
Откройте в браузере или через curl:
http://localhost:8080/actuator/prometheus
Найдите строку:
custom_requests_total{...} 42.0
Please open Telegram to view this post
VIEW IN TELEGRAM
С выходом Java 21 в стабильный релиз sealed-типы наконец-то стали полноценным инструментом. Формально они позволяют явно ограничивать наследование, делают модель более предсказуемой и защищённой.
Казалось бы — бери и используй везде, особенно там, где важна неизменность и контроль, как в DDD, CQRS или API-слоях.
Но в реальности мнения расходятся. Одни начинают всё новое писать через sealed, чтобы убрать "лишнюю гибкость", другие придерживаются старого доброго interface + impl, ссылаясь на читаемость, тестируемость и простоту изменений.
Sealed — это реальный шаг вперёд в проработке модели, или ненужный контроль там, где раньше всё было гибко и понятно?
Please open Telegram to view this post
VIEW IN TELEGRAM
Знаете, как в Java обычно обновить одно поле в неизменяемом объекте? Нужно создавать копию с нужным значением. Муторно. Lombok умеет делать это элегантно.
🔹 Что делает @With
Генерирует методы withX(...), которые создают копию объекта с изменённым полем. Подходит для immutable-моделей и паттерна builder. Класс при этом должен быть final (например, через @Value или вручную).
🔹 Пример
@Value
@With
public class User {
String name;
int age;
}
Теперь можно:
User user1 = new User("Alice", 25);
User user2 = user1.withAge(30); // создаётся новый объект с новым age
Объекты остаются неизменяемыми, но при этом легко "обновляемыми".
🔹 Зачем это нужно
— Удобно при работе с immutable-классами.
— Простой способ "копировать с изменением".
— Чистый, декларативный стиль без boilerplate.
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 HTTP/2: эволюция веб-протокола
Если вы работаете с REST API, микросервисами или веб-приложениями на Spring Boot, понимание HTTP/2 — не просто полезно, а необходимо.
В отличие от HTTP/1.1, где каждое TCP-соединение обрабатывает только один запрос одновременно, HTTP/2 позволяет осуществлять параллельную передачу нескольких запросов и ответов по одному соединению.
Это означает:
— Экономия ресурсов сервера и клиента.
— Одновременная передача нескольких потоков данных.
— Уменьшение объема передаваемой информации.
🔗 Подробнее в статье
🐸 Библиотека джависта #буст
Если вы работаете с REST API, микросервисами или веб-приложениями на Spring Boot, понимание HTTP/2 — не просто полезно, а необходимо.
В отличие от HTTP/1.1, где каждое TCP-соединение обрабатывает только один запрос одновременно, HTTP/2 позволяет осуществлять параллельную передачу нескольких запросов и ответов по одному соединению.
Это означает:
— Экономия ресурсов сервера и клиента.
— Одновременная передача нескольких потоков данных.
— Уменьшение объема передаваемой информации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM