Или, что в теле запроса есть JSON в определенном формате:
Аналогично, можно проверять и GET запросы на наличие параметров:
Какими еще возможностями WireMock вы пользуетесь?
verify(postRequestedFor(urlEqualTo("/submit"))
.withRequestBody(matchingJsonPath("$.user.id", equalTo("123"))));
Аналогично, можно проверять и GET запросы на наличие параметров:
verify(getRequestedFor(urlPathEqualTo("/list"))
.withQueryParam("page", equalTo("3")));
Какими еще возможностями WireMock вы пользуетесь?
🔥8👍4
Test Containers Shorts
Test Containers — это библиотека для запуска Docker-контейнеров прямо из тестов и сегодня будет короткая заметка об этой библиотеке.
Для примера запустим PostgreSQL прямо из теста (пока без интеграции с JUnit):
Для JUnit есть расширение, которое автоматически запускает и останавливает контейнеры до и после выполнения теста:
Test Containers довольно удобно интегрируются со спринговыми тестами через
А вы используете Test Containers в своей работе?
Test Containers — это библиотека для запуска Docker-контейнеров прямо из тестов и сегодня будет короткая заметка об этой библиотеке.
Для примера запустим PostgreSQL прямо из теста (пока без интеграции с JUnit):
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer;
import static org.assertj.core.api.Assertions.assertThat;
class PostgresTest {
// Поднимаем контейнер PostgreSQL
static final PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:15")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
static {
postgres.start();
}
@Test
void testDatabaseConnection() throws Exception {
var connection = postgres.createConnection("");
var result = connection.createStatement().executeQuery("SELECT 1");
assertThat(result.next()).isTrue();
assertThat(result.getInt(1)).isEqualTo(1);
}
}
Для JUnit есть расширение, которое автоматически запускает и останавливает контейнеры до и после выполнения теста:
@Testcontainers
class JUnit5Test {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15");
@Test
void testIsRunning() {
assertThat(postgres.isRunning()).isTrue();
}
}
Test Containers довольно удобно интегрируются со спринговыми тестами через
@DynamicPropertySource:
@SpringBootTest
@Testcontainers
class UserRepositoryTest {
@Container
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:15")
.withDatabaseName("testdb")
.withUsername("test")
.withPassword("test");
@DynamicPropertySource
static void overrideProps(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", postgres::getJdbcUrl);
registry.add("spring.datasource.username", postgres::getUsername);
registry.add("spring.datasource.password", postgres::getPassword);
}
@Autowired
private UserRepository userRepository;
@Test
void testSaveAndFindUser() {
User user = new User(null, "Alice");
userRepository.save(user);
var users = userRepository.findAll();
assertThat(users).hasSize(1);
assertThat(users.get(0).getName()).isEqualTo("Alice");
}
}
А вы используете Test Containers в своей работе?
👍10🔥6
Media is too big
VIEW IN TELEGRAM
Hibernate vs jOOQ vs SQL - Engineering Trade-offs
Hibernate долго был для меня инструментом по умолчанию в Java-разработке — быстрый, удобный, “магический”. Но со временем я стал всё чаще замечать его ограничения и переходить к jOOQ или plain SQL.
В этом видео мой взгляд на ORM глазами инженера, который работал с реальными системами: где Hibernate помогает, а где начинает усложнять жизнь.
Hibernate долго был для меня инструментом по умолчанию в Java-разработке — быстрый, удобный, “магический”. Но со временем я стал всё чаще замечать его ограничения и переходить к jOOQ или plain SQL.
В этом видео мой взгляд на ORM глазами инженера, который работал с реальными системами: где Hibernate помогает, а где начинает усложнять жизнь.
🔥14❤2
Media is too big
VIEW IN TELEGRAM
Hibernate - Спасение или проблема?
Hibernate — это мощный ORM, который идеально раскрывается в бизнес-приложениях: CRUD, сложные доменные модели, связи между сущностями и быстрый старт разработки без постоянного написания SQL.
В этом видео разбираем:
— где Hibernate реально помогает
— почему он так хорош для CRUD и агрегатов
— как работает lazy loading и где он может «стрельнуть в ногу»
— когда JPQL уже не хватает и приходится идти в native SQL
— и где проходит граница между удобством ORM и контролем над базой
А как ты используешь Hibernate в своих проектах?
Hibernate — это мощный ORM, который идеально раскрывается в бизнес-приложениях: CRUD, сложные доменные модели, связи между сущностями и быстрый старт разработки без постоянного написания SQL.
В этом видео разбираем:
— где Hibernate реально помогает
— почему он так хорош для CRUD и агрегатов
— как работает lazy loading и где он может «стрельнуть в ногу»
— когда JPQL уже не хватает и приходится идти в native SQL
— и где проходит граница между удобством ORM и контролем над базой
А как ты используешь Hibernate в своих проектах?
🔥7
Media is too big
VIEW IN TELEGRAM
Почему я всё реже выбираю Hibernate
В этом видео расскажу, где ORM создаёт больше проблем, чем решает, когда стоит использовать чистый SQL и почему jOOQ стал моим инструментом по умолчанию для работы с базой данных в Java.
В этом видео расскажу, где ORM создаёт больше проблем, чем решает, когда стоит использовать чистый SQL и почему jOOQ стал моим инструментом по умолчанию для работы с базой данных в Java.
👍8❤7
Media is too big
VIEW IN TELEGRAM
MCP сервер для Codex/Claude Code на Spring Boot
Создаём MCP Server на Spring Boot и подключаем его к Codex! В этом видео AI получит доступ к коллекции винила: поиск, просмотр и добавление пластинок через MCP. 🚀💿
Создаём MCP Server на Spring Boot и подключаем его к Codex! В этом видео AI получит доступ к коллекции винила: поиск, просмотр и добавление пластинок через MCP. 🚀💿
🔥12❤2👍2
Media is too big
VIEW IN TELEGRAM
MCP клиент на Spring Boot - подключаемся к Ollama и MCP Server
В этом видео собираем MCP Client на Spring Boot и подключаем его к локально запущенному Ollama и MCP серверу на Spring Boot.
MCP Server предоставляет инструменты для управления коллекцией виниловых пластинок и его мы уже делали в прошлом видео.
Как сейчас модно говорить - без маркетинговой шелухи, четко и по делу, только Spring Boot, только стартеры и минимум кода.
В этом видео собираем MCP Client на Spring Boot и подключаем его к локально запущенному Ollama и MCP серверу на Spring Boot.
MCP Server предоставляет инструменты для управления коллекцией виниловых пластинок и его мы уже делали в прошлом видео.
Как сейчас модно говорить - без маркетинговой шелухи, четко и по делу, только Spring Boot, только стартеры и минимум кода.
🔥8❤3
Media is too big
VIEW IN TELEGRAM
AI-агент теперь ПОМНИТ всё! Добавляем память в Spring AI
В прошлом видео мы научили AI работать с MCP Server и коллекцией виниловых пластинок. Но была одна проблема — после каждого сообщения агент забывал весь предыдущий разговор.
В этом видео исправим это с помощью ChatMemory из Spring AI. Теперь AI будет помнить историю диалога, учитывать контекст и отвечать намного естественнее.
В прошлом видео мы научили AI работать с MCP Server и коллекцией виниловых пластинок. Но была одна проблема — после каждого сообщения агент забывал весь предыдущий разговор.
В этом видео исправим это с помощью ChatMemory из Spring AI. Теперь AI будет помнить историю диалога, учитывать контекст и отвечать намного естественнее.
❤5👍5😁1
Media is too big
VIEW IN TELEGRAM
Микросервисы? Или лучше модульный монолит? | Engineering Trade-offs
Все слышали, что будущее за микросервисами. Но почему тогда Amazon, Shopify и другие компании всё чаще говорят о модульных монолитах?
В этом выпуске разбираемся:
* почему микросервисы вообще появились;
* какую цену приходится платить за распределённую систему;
* почему микросервисы часто решают организационные, а не технические проблемы;
* что такое модульный монолит и зачем нужен Spring Modulith;
* как AI меняет требования к архитектуре.
В инженерии редко бывают универсально правильные решения. Есть только trade-offs.
Все слышали, что будущее за микросервисами. Но почему тогда Amazon, Shopify и другие компании всё чаще говорят о модульных монолитах?
В этом выпуске разбираемся:
* почему микросервисы вообще появились;
* какую цену приходится платить за распределённую систему;
* почему микросервисы часто решают организационные, а не технические проблемы;
* что такое модульный монолит и зачем нужен Spring Modulith;
* как AI меняет требования к архитектуре.
В инженерии редко бывают универсально правильные решения. Есть только trade-offs.
❤11🔥3👍1
Media is too big
VIEW IN TELEGRAM
Spring Modulith - модульный монолит на Spring Boot
В этом видео разбираем Spring Modulith — новый подход к построению модульных монолитов в Spring Boot.
Вы узнаете:
• зачем вообще нужен Spring Modulith;
• как разделить приложение на независимые модули;
• как автоматически проверять архитектурные границы;
В этом видео разбираем Spring Modulith — новый подход к построению модульных монолитов в Spring Boot.
Вы узнаете:
• зачем вообще нужен Spring Modulith;
• как разделить приложение на независимые модули;
• как автоматически проверять архитектурные границы;
❤8🔥3👍2
Media is too big
VIEW IN TELEGRAM
Распиливаем монолит на микросервисы со Spring Modulith
В этом выпуске превращаем модульный монолит в полноценную микросервисную архитектуру. Покажу, какие изменения действительно нужны, как использовать Kafka и HTTP Interface Clients, и как здесь помогает Spring Modulith
В этом выпуске превращаем модульный монолит в полноценную микросервисную архитектуру. Покажу, какие изменения действительно нужны, как использовать Kafka и HTTP Interface Clients, и как здесь помогает Spring Modulith
👍7❤4
Media is too big
VIEW IN TELEGRAM
SQL vs NoSQL: История борьбы и сотрудничества - Engineering Trade-offs
В начале 2010-х все были уверены, что SQL скоро исчезнет, а будущее за NoSQL. Но прошло 15 лет, и PostgreSQL по-прежнему остается одной из самых популярных баз данных. Что пошло не так?
В этом выпуске Engineering Trade-offs разбираемся, почему появился NoSQL, какие реальные проблемы он решил, почему этого оказалось недостаточно и как SQL и NoSQL в итоге изменили друг друга.
В начале 2010-х все были уверены, что SQL скоро исчезнет, а будущее за NoSQL. Но прошло 15 лет, и PostgreSQL по-прежнему остается одной из самых популярных баз данных. Что пошло не так?
В этом выпуске Engineering Trade-offs разбираемся, почему появился NoSQL, какие реальные проблемы он решил, почему этого оказалось недостаточно и как SQL и NoSQL в итоге изменили друг друга.
👍9
Media is too big
VIEW IN TELEGRAM
Как разбить большую таблицу на партиции в PostgreSQL
Рассказываю о том, как работать с партициями в PostgreSQL. Несколько примеров:
1. Создаем таблицу с несколькими партициями сразу.
2. Мигрируем существующие данные в таблицу с партициями.
Пишите в комментариях, какой подход при миграции использовали вы.
Рассказываю о том, как работать с партициями в PostgreSQL. Несколько примеров:
1. Создаем таблицу с несколькими партициями сразу.
2. Мигрируем существующие данные в таблицу с партициями.
Пишите в комментариях, какой подход при миграции использовали вы.
🔥9
Media is too big
VIEW IN TELEGRAM
MongoDB Sharding: как разделить миллион документов между серверами
Разбираемся, как работает MongoDB Sharding: поднимаем sharded cluster, распределяем миллион документов между серверами, смотрим на chunks, balancer и разбираемся, как MongoDB выбирает нужный shard для запроса
Разбираемся, как работает MongoDB Sharding: поднимаем sharded cluster, распределяем миллион документов между серверами, смотрим на chunks, balancer и разбираемся, как MongoDB выбирает нужный shard для запроса
❤5👍2