uz
Feedback

Firibgarlarga uchmang! Telemetrio bunday kanallarni topadi va belgilaydi πŸ‘‰ Belgini koβ€˜rmoqchi boβ€˜lsangiz, obuna boβ€˜ling

Developer's Sandbox

Developer's Sandbox

Kanalga Telegram’da oβ€˜tish

ΠžΠΏΡ‹Ρ‚ ΠΈ самообучСниС ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Бвязь с Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ: @alpa1479

Ko'proq ko'rsatish
1 059
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kun
Ma'lumot yo'q30 kun
Postlar arxiv
πŸ”₯ Π­Ρ‚ΠΎ Π±Π°Π·Π° с 1700 вопросами с собСсСдований Π½Π° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Ѐишка Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ просчитана Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ вопрос Π±ΡƒΠ΄Π΅Π½ Π·Π°Π΄Π°Π½ ΠΈ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ„Ρ„Π΅Ρ€, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ самым популярным вопросам 😏

❓ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Spring Boot ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ? 🌱 Spring Boot β€” open-source Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Spring ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ прилоТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Код, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ лишь Π·Π° запуск прилоТСния, услоТняСтся. Благодаря convention over configuration ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ, Spring Boot позволяСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. НапримСр: β€” ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ² spring-boot-starter-actuator Π² Maven/Gradle ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° β€” ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ² flyway-core ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΠ² Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ db/migration, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ❓ Π—Π° счСт Ρ‡Π΅Π³ΠΎ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? Π—Π° счСт исполнСния ΠΊΠΎΠ΄Π° Π°Π²Ρ‚ΠΎΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ Автоконфигурация β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π±ΠΈΠ½, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ Configuration ΠΈΠ»ΠΈ Autoconfiguration ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ META-INF/spring.factories [Π΄ΠΎ вСрсии 2.7] ΠΈΠ»ΠΈ META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.import [c вСрсии 2.7] Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, содСрТащая Π°Π²Ρ‚ΠΎΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Spring Boot Starter ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ Π² наш ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ starter, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ автоматичСски исполняСт ΠΊΠΎΠ΄ Π°Π²Ρ‚ΠΎΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ, создавая Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π±ΠΈΠ½Ρ‹ ΠΈ исполняя Π»ΠΎΠ³ΠΈΠΊΡƒ, Π·Π°Π΄ΡƒΠΌΠ°Π½Π½ΡƒΡŽ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ А благодаря Conditional аннотациям, такая Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π³ΠΈΠ±ΠΊΠΎΠΉ. НапримСр: β€” ConditionalOnMissingBean создаст Π±ΠΈΠ½, Ссли Π½Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ β€” ConditionalOnProperty создаст Π±ΠΈΠ½ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ свойства Π² application.yaml ❓ Π§Ρ‚ΠΎ Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ? Spring Boot прСдоставляСт BOM [Bill Of Materials] spring-boot-dependencies, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ совмСстимых ΠΌΠ΅ΠΆΠ΄Ρƒ собой вСрсий Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ явно вСрсии для большого количСства зависимостСй Π² Maven/Gradle Π’ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π‘Π” Π±Ρ‹Π»ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΊΠΎΠ΄Π°. Π― вынСс ΠΎΠ±Ρ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² starter ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ всС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ API ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚: πŸ“š JDBC πŸ’‘ jOOQ 🐦 MyBatis πŸͺž Hibernate 🌱 Spring JDBC 🌱 Spring Data JDBC 🌱 Spring Data JPA #sandbox #java_database_tools_starter ➿ МСню ➿ Подпишись: @developer_sandbox

πŸ”₯ Π­Ρ‚ΠΎ Π±Π°Π·Π° с 1700 вопросами с собСсСдований Π½Π° Java Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Ѐишка Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ просчитана Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ вопрос Π±ΡƒΠ΄Π΅Π½ Π·Π°Π΄Π°Π½ ΠΈ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ„Ρ„Π΅Ρ€, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ²ΡˆΠΈΡΡŒ ΠΊ самым популярным вопросам 😏

Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ постом я ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡΡŒ с нюансами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² самом постС. НапримСр, ΠΈΠ·-Π·Π° объСма Π»ΠΈΠ±ΠΎ нСподходящСго контСкста Однако ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΈ для этого я создал Ρ‡Π°Ρ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎ Π½ΡŽΠ°Π½ΡΠ°Ρ… [ΠΊΠ°ΠΊ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚] Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ‡Π°Ρ‰Π΅, вСдь для этого Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ пост ❓ Как Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π°Ρ‚? β€” Анонсы ΠΈ обсуТдСниС Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… постов β€” ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ вопросы любого уровня β€” Π‘ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ вмСстС Π½Π° Ρ‚Π΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ [ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ свободно, Π° Π½ΡŽΠ°Π½ΡΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π±ΡƒΠ΄Ρƒ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚Π΅Π³Π°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π½Π°ΠΉΡ‚ΠΈ] НСдавно посмотрСл ΠΎΠ΄ΠΈΠ½ интСрСсный Π΄ΠΎΠΊΠ»Π°Π΄, ΠΈ ΠΌΠΎΠΉ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ пСрСсказ со ссылкой Π½Π° сам Π΄ΠΎΠΊΠ»Π°Π΄ ΠΊΠ°ΠΊ Ρ€Π°Π· Π±ΡƒΠ΄ΡƒΡ‚ Π² Ρ‡Π°Ρ‚Π΅ ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎ ссылкС β€” πŸ“¦ Developer's Chat

Π’ ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π· ΠΌΡ‹ рассмотрСли ΠΊΠ°ΠΊ выглядит ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡ€ΠΈ использовании Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ β€” JDBC, Spring JDBC, Hibernate ΠΈ Spring Data JPA. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ β€” Spring Data JDBC, MyBatis, JOOQ. 🌱 Spring Data JDBC β€” рСализация ORM Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° ΠΎΡ‚ Spring. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Hibernate, Π° отправляСт запросы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ JdbcTemplate. Π˜ΠΌΠ΅Π΅Ρ‚ свои Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ [Id, Column, MappedColleсtion ΠΈ Ρ‚.Π΄.] Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ org.springframework.data.annotation. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ SQL Π½Π° основС ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ. ❓ КакиС отличия ΠΎΡ‚ Hibernate? β€” ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ свой язык запросов [Π½Π΅Ρ‚ JPQL, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ SQL] β€” ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Lazy Loading [one-to-many ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ сразу, вмСстС с N+1 ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ] β€” ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ [Π½Π΅ отслСТиваСтся состояниС сущности. НуТно явно Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ рСпозитория] β€” По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ поддСрТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΈΠΏ Identity для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ id [ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Sequence, UUID Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ самим] β€” По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Batch ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ [ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· свой абстрактный Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ] ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ являСтся DDD [Domain-Driven Design], ΠΈ понятиС Aggregate являСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: β€” НСт явной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ many-to-one [ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ id связанной сущности Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ AggregateReference] β€” НСт явной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ many-to-many [Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ] β€” ΠšΠ°ΡΠΊΠ°Π΄Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π°Π³Ρ€Π΅Π³Π°Ρ‚Π° [ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°, Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ сущности ΠΏΠ΅Ρ€Π΅ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ] ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github 🐦 MyBatis β€” persistence framework. Π˜ΠΌΠ΅Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ API, Ρ‡Π΅ΠΌ Spring Data JDBC/JPA, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ высокоуровнСвый, Ρ‡Π΅ΠΌ JDBC/Spring JDBC. ❓ КакиС основныС особСнности? β€” Π’ качСствС сущности ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ POJO [Plain Old Java Object] β€” ВмСсто Repository ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ понятиС Mapper [ΠΈΠΌΠ΅Π΅Ρ‚ свой Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ синтаксис ΠΏΡ€ΠΈ написании SQL] β€” ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XML Π»ΠΈΠ±ΠΎ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ β€” Π˜ΠΌΠ΅Π΅Ρ‚ свой Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ простой CRUD ΠΈ сами сущности Π½Π° основС Π‘Π” ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github πŸ’‘ jOOQ [java Object Oriented Querying] β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ DSL [Domain Specific Language] для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SQL Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ type safe Ρ‡Π΅Ρ€Π΅Π· fluent API. ❓ КакиС основныС особСнности? β€” Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сущности Π½Π° основС Π‘Π”, Π° Ρ‚Π°ΠΊΠΆΠ΅ DAO классы с Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² β€” Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π³ΠΈΠ±ΠΊΠΎ настраиваСтся [ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ equals, hashCode. Аннотации JPA ΠΈ Spring Context ΠΈ Ρ‚.Π΄.] β€” По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ имСнования сгСнСрированных классов ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ [Ссли ΠΈΡ… Π½Π°Π·Π²Π°Ρ‚ΡŒ Π²ΠΎ мноТСствСнном числС, Ρ‚Π°ΠΊΠΈΠ΅ классы ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ. Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· свою ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ имСнования] β€” Иногда ΡΠΎΠ²ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ с Π±ΠΎΠ»Π΅Π΅ высокоуровнСвыми Spring Data JDBC/JPA ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github #sandbox #java_database_tools ➿ МСню ➿ Подпишись: @developer_sandbox

НовогодниС ΠΏΡ€Π°Π·Π΄Π½ΠΈΠΊΠΈ внСсли свои ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ "Π‘ΡƒΠ΄Ρƒ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ/Π΄Π²Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π² нСдСлю" Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ 🫠 Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… инструмСнтах Apache Kafka ❓ ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ…? Π•ΡΡ‚ΡŒ большоС количСство ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… UI для Apache Kafka, срСди Π½ΠΈΡ…: 1⃣ UI for Apache Kafka, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… 2⃣ AKHQ 3⃣ Confluent Control Centre 4⃣ Offset Explorer 5⃣ Kafka IDEA Plugin Однако, судя ΠΏΠΎ ΠΎΠΏΡ‹Ρ‚Ρƒ, Π½Π΅ всСгда Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π΅ΡΡ‚ΡŒ Web UI, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ прямого доступа ΠΈΠ· локальной ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π° Π½Π° сСрвСрС Ρ‚Π°ΠΊΠΈΡ… инструмСнтов Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Помимо этого, Π΄Π°Π½Π½Ρ‹Π΅ инструмСнты ΡƒΠΌΠ΅ΡŽΡ‚ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΡ… ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ, Π° Ссли ΠΈ ΡƒΠΌΠ΅ΡŽΡ‚, Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Π½ΠΎ ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΌ инструмСнтам, Π° срСди Π½ΠΈΡ…: 1⃣ Kafka tools β€” инструмСнты входящиС Π² состав самой Apache Kafka 2⃣ Kcat β€” прСдоставляСт Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ установки Π”Π°Π²Π°ΠΉΡ‚Π΅ остановимся Π½Π° Kafka tools, ΠΈ посмотрим, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ: πŸ“– kafka-configs.sh βž– ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°/Ρ‚ΠΎΠΏΠΈΠΊΠ° βž– Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°/Ρ‚ΠΎΠΏΠΈΠΊΠ° βž– Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π΄ΠΎ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π±Ρ€ΠΎΠΊΠ΅Ρ€Π°/Ρ‚ΠΎΠΏΠΈΠΊΠ° πŸ“– kafka-topics.sh βž– ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список всСх Ρ‚ΠΎΠΏΠΈΠΊΠΎΠ² βž– ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ Ρ‚ΠΎΠΏΠΈΠΊΡƒ βž– Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠΏΠΈΠΊ с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ βž– Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΏΠΈΠΊΡƒ количСство ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΉ βž– Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠΏΠΈΠΊ βž– Π£Π΄Π°Π»ΠΈΡ‚ΡŒ всС сообщСния Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅ πŸ“– kafka-delete-records.sh βž– Π£Π΄Π°Π»ΠΈΡ‚ΡŒ сообщСния Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅ с самого Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ offset'a πŸ“– kafka-console-consumer.sh βž– ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всС сообщСния с самого Π½Π°Ρ‡Π°Π»Π° Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ consumer-group βž– ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ сообщСниС с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ ΠΈ offset'a πŸ“– kafka-console-producer.sh βž– ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ указания key,value,headers βž– Если ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ kafka-console-consumer ΠΈ kafka-console-producer, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС сообщСния ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΏΠΈΠΊΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ [НапримСр ΠΈΠ· DLT Π² основной, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ сообщСния] πŸ“– kafka-consumer-groups.sh βž– ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ всСх/ΠΎΠ΄Π½ΠΎΠΉ consumer group βž– ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π½ ΠΏΠΎ ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Π½ΠΈΡŽ offset'a для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ consumer group βž– Π‘Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ offset Π΄ΠΎ самого Π½Π°Ρ‡Π°Π»Π° ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ значСния для Π·Π°Π΄Π°Π½Π½ΠΎΠΉ consumer group πŸ“– kafka-log-dirs.sh βž– ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± объСмС Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ суммарно πŸ“– kafka-run-class.sh βž– ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ послСдний offset Π² Ρ‚ΠΎΠΏΠΈΠΊΠ΅ βž– Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ partition log dump πŸ“– kafka-reassign-partitions.sh βž– Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ reassigning plan, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρ‚ΠΈΡ†ΠΈΠΈ Π² кластСрС πŸ“– kafka-producer-perf-test.sh βž– ΠŸΡ€ΠΎΠ²Π΅ΡΡ‚ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ΅ тСстированиС со стороны Producer'a ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ πŸ“– kafka-consumer-perf-test.sh βž– ΠŸΡ€ΠΎΠ²Π΅ΡΡ‚ΠΈ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ΅ тСстированиС со стороны Consumer'a ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ И это Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС возмоТности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Π΅ инструмСнты. Π― ΠΏΡ€ΠΈΠ²Π΅Π» лишь основныС. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… сами, ΠΎΠ½ΠΈ доступны Π½Π° πŸ™Github, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ сначала ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с quick-start.md Π”ΠΎ Π½ΠΎΠ²Ρ‹Ρ… встрСч! #sandbox_kafka #cheatsheet #console_tools ➿ ΠœΠ΅Π½ΡŽ ➿ ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡΡŒ: @developer_sandbox

НаступаСт 2024 Π³ΠΎΠ΄ β™₯️ Π₯ΠΎΡ‡Ρƒ ΠΏΠΎΠΆΠ΅Π»Π°Ρ‚ΡŒ всСм успСхов Π² Новом Π“ΠΎΠ΄Ρƒ! πŸŽ„πŸŽ Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ ΠΈΡ‰Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ - Π½Π°ΠΉΡ‚ΠΈ Π΅Π΅ ΠΈ ΡΡ‚Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ 🎁 Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ - ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… достиТСний ΠΈ ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½Ρ‹Ρ… сроков 🎁 Какой Π±Ρ‹ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π·Π½Π°Π½ΠΈΠΉ Π½ΠΈ Π±Ρ‹Π», ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚, Π° обмСниваясь ΠΈΠΌ, ΠΌΡ‹ экономим врСмя ΠΈ силы Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π° βœ… Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€ΡŽ вас Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ этот ΠΊΠ°Π½Π°Π», ставитС Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ! 🐱 И ΠΏΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΡŽ Вас с Π½Π°ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠΌ 2024 Π³ΠΎΠ΄ΠΎΠΌ!❄️ β€”β€”β€” НСбольшая статистика: Канал создан 14.06.2022 ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ пост я ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» 15.07.2023, Π²Ρ‹ΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ ΠΈΠ΄Π΅ΠΈ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡˆΠ΅Π» Π³ΠΎΠ΄ ΠΈ 1 мСсяц На сСгодняшний дСнь '31.12.2023', написано 28 постов ΠΈ 41 ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° πŸ™Github, ΠΎΠ½ΠΈ доступны Π² ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‰Π΅ΠΌΡΡ МСню β€”β€”β€” ОбновлСниС: Π’ IDEA Π΅ΡΡ‚ΡŒ Run Configurations, благодаря ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠΊΡƒ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ, ΠΈ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ» Π’.Π΅. ΠΊΠΎΠ³Π΄Π° ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π· IDEA ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρƒ Π½Π΅Π³ΠΎ доступны Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΈΡ… Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ: πŸ“¦ sandbox β˜•οΈ sandbox-java 🌱 sandbox-spring-context 🌱 sandbox-web 🐘 sandbox-postgresql 🌱 sandbox-spring-data-jpa πŸ“– sandbox-kafka ОсобСнно это ΡƒΠ΄ΠΎΠ±Π½ΠΎ для πŸ“–sandbox-kafka, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ кластСр с ΠΎΠ΄Π½ΠΈΠΌ Π±Ρ€ΠΎΠΊΠ΅Ρ€ΠΎΠΌ, Π»ΠΈΠ±ΠΎ с двумя, Π»ΠΈΠ±ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³, ΠΈ Π΅Ρ‰Π΅, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊ confluentinc image, добавились ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ β€” bitnami ΠΈ wurstmeister

❓ КакиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ связСй Π² JPA? Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅, ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… связСй Π² рСляционных Π‘Π”. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² JPA, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ нашСй Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ β€” Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π³Π΄Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ сущности β€” Author ΠΈ Book НачнСм с One to One, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ двумя способами: 1⃣ Π§Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ MapsId [этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΌΡ‹ рассмотрим Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅] 2⃣ Π§Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ OneToOne:
    // Book.class

    @OneToOne
    // Annotation @JoinColumn(name = "author_id", nullable = false, unique = true) can be skipped,
    // because of default name mapping
    private Author author;
❓ А Ρ‡Ρ‚ΠΎ Π² классС Author? ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ вновь Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с SQL. Π’ΠΎΠ³Π΄Π°, зная id сущности Author, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ самого Π°Π²Ρ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊ ΠΈ Π΅Π³ΠΎ ΠΊΠ½ΠΈΠ³Ρƒ. [Π°Π²Ρ‚ΠΎΡ€Π° ΠΏΠΎ id, Π° ΠΊΠ½ΠΈΠ³Ρƒ ΠΏΠΎ author_id]. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, возвращаСмся ΠΊ JPA. Если Ρƒ нас Π½Π΅Ρ‚Ρƒ ссылки Π½Π° класс Book Π² классС Author, Ρ‚ΠΎ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, самого Π°Π²Ρ‚ΠΎΡ€Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ, Π° Π²ΠΎΡ‚ Π΅Π³ΠΎ ΠΊΠ½ΠΈΠ³Ρƒ β€” Π½Π΅Ρ‚. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ связь ΠΈ Π² классС Author:
     // Author.class
    
     /*
     * One Author to One Book
     * Bidirectional relationship
     * Owner of the relationship is Book [because books table contains foreign key to authors table],
     * linked by 'author' field in Book class
     */
    @OneToOne(mappedBy = "author")
    private Book book;
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² JPA Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° связСй: 1⃣ Unidirectional β€” ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ взаимодСйствуСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с owning side [Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ foreign key, Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” Book.class] 2⃣ Bidirectional β€” ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‡Π΅Ρ€Π΅Π· unowned side [Ρ‚ΠΎΡ‚, Π½Π° ΠΊΠΎΠ³ΠΎ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· foreign key, Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” Author.class], ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ owning side [Book.class]. Для этого сущСствуСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ mappedBy, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ указываСтся ΠΏΠΎΠ»Π΅ ΠΈΠ· owning side [Book.class], ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ссылаСтся Ρ‡Π΅Ρ€Π΅Π· foreign key Π½Π° unowned side [Author.class]. ΠŸΡ€ΠΈ использовании Bidirectional связи, ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ❌ Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… equals, hashCode, toString, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ сСриализации ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ java.lang.StackOverflowError ❌ Если ΠΌΡ‹ мСняСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ unowned side, Π±Π΅Π· измСнСния owning side, Ρ‚ΠΎ автоматичСски Ρ‚Π°ΠΊΠΈΠ΅ измСнСния Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ синхронизорованы с Π‘Π” ❌ Для write ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Bidirectional setter'Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡΡ‚Π°Π²Π°Π»ΠΈΡΡŒ консистСнтными Π² Π‘Π” Unidirectional ΠΏΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github Bidirectional ΠΏΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github One to Many ΠΈ Many to One:
    // Book.class
    
    @ManyToOne
    // Annotation @JoinColumn(name = "author_id", nullable = false) can be skipped,
    // because of default name mapping
    private Author author;
    // Author.class
    
    /*
     * One Author to Many Books
     * Bidirectional relationship
     * Owner of the relationship is Book [because books table contains foreign key to authors table],
     * linked by 'author' field in Book class
     */
    @OneToMany(mappedBy = "author")
    private Set<Book> books;
Hibernate Π½Π΅ совСтуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ OneToMany Π±Π΅Π· ManyToOne, ΠΎ Ρ‡Π΅ΠΌ упоминаСтся Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Unidirectional ΠΏΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github Bidirectional ΠΏΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github Many to Many:
    // Book.class
    
    @ManyToMany
    @JoinTable(
            name = "books_authors",
            joinColumns = @JoinColumn(name = "book_id", nullable = false),
            inverseJoinColumns = @JoinColumn(name = "author_id", nullable = false)
    )
    private Set<Author> authors;
}
    // Author.class
    
    /*
     *
     * Many Authors to Many Books
     * Bidirectional relationship
     * Owner of the relationship is Book,
     * linked by 'authors' field in Book class. If required, Author can be owner side
     */
    @ManyToMany(mappedBy = "authors")
    private Set<Book> books;
Если Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ со связями ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ρ‚ΠΎ придСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Entity. Об этом случаС Ρ…ΠΎΡ€ΠΎΡˆΠΎ написано Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Unidirectional ΠΏΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github Bidirectional ΠΏΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github #sandbox_spring_data_jpa #relationships ➿ ΠœΠ΅Π½ΡŽ ➿ ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡΡŒ: @developer_sandbox

❓ Как ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с JDBC Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SQL запросов? ΠŸΡ€ΠΈ использовании ORM Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎ
❓ Как ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с JDBC Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SQL запросов? ΠŸΡ€ΠΈ использовании ORM Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ SQL запрос гСнСрируСтся для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² Π‘Π”, Ρ‡Ρ‚ΠΎΠ±Ρ‹ воврСмя ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ошибки ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ запрос с Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ Π–Π΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ подставлСны для сгСнСрированного SQL запроса, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π΅Π³ΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” DBeaver, DataGrip, pgAdmin, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π»ΠΈΠ±ΠΎ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ πŸͺž Hibernate ΠΈΠΌΠ΅Π΅Ρ‚ свойства show_sql, format_sql, highlight_sql, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ сгСнСрированный ORM’ом SQL запрос Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ Если Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π»ΠΎΠ³Π³Π΅Ρ€ β€” org.hibernate.orm.jdbc.bind: trace, Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π΅Ρ‰Π΅ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π½ΠΎ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ мСсто Π² запросС Π½Π°ΠΌ придСтся ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ❓ КакиС Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹? На ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ отобраТаСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π»ΠΎΠ³ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ SQL запроса ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° πŸ™Github. На консоль выводится: 1⃣ Connection URL с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ 2⃣ SQL запрос с подставлСнными ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ 3⃣ ResultSet Π² Π²ΠΈΠ΄Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния запроса 4⃣ Json ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сбора ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· ResultSet’a Π² ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Для получСния Ρ‚Π°ΠΊΠΈΡ…, Π»ΠΈΠ±ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… Π»ΠΎΠ³ΠΎΠ², Π΅ΡΡ‚ΡŒ нСсколько инструмСнтов: 1⃣ log4jdbc β€” proxy для JDBC Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. Π›ΠΎΠ³ΠΈΡ€ΡƒΠ΅Ρ‚ SQL запрос с подставлСнными ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ врСмя Π΅Π³ΠΎ выполнСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github 2⃣ log4jdbc-remix β€” Ρ„ΠΎΡ€ΠΊ log4jdbc ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‚ самый Π²Ρ‹Π²ΠΎΠ΄ ResultSet'a Π² Π²ΠΈΠ΄Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π‘Ρ‹Π» ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² log4jdbc-log4j2 ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°Π±Ρ€ΠΎΡˆΠ΅Π½. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github 3⃣ p6spy β€” Π±ΠΎΠ»Π΅Π΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ свои formatter'Ρ‹, настраиваСтся Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· spy.properties. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github 4⃣ datasource-proxy β€” особых прСимущСств Π½Π°Π΄ стандартными срСдствами Hibernate Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Π½ΠΎ свою Π·Π°Π΄Π°Ρ‡Ρƒ выполняСт. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github #sandbox #java_database_tools ➿ ΠœΠ΅Π½ΡŽ ➿ ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡΡŒ: @developer_sandbox

Π₯ΠΎΡ‚Π΅Π» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… связСй Π² рСляционных Π‘Π”, ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² JPA Однако Π² ΠΎΠ΄Π½Ρƒ ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ΄Π° Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΠ»ΠΎΡΡŒ, поэтому Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ» Π½Π° Π΄Π²Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ создал ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ: 🐘 sandbox-postgresql 🌱 sandbox-spring-data-jpa Если Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ SQL ΠΊΠΎΠ΄ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ отобраТаСтся, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Telegram. ❓ КакиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ связСй Π² рСляционных Π‘Π”? Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ нашСй любимой Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ β€” Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π£ нас Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π²Π΅ сущности β€” Книга, Автор Π’ зависимости ΠΎΡ‚ Π½Π°ΡˆΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ систСмС, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ связь ΠΌΠ΅ΠΆΠ΄Ρƒ сущностями Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅: Π’ нашСй систСмС ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π°Π²Ρ‚ΠΎΡ€. А Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Π²Ρ‚ΠΎΡ€ ΠΈΠΌΠ΅Π» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΊΠ½ΠΈΠ³Ρƒ. РСшСниС: Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ One to One [читаСтся ΠΊΠ°ΠΊ β€œΠΎΠ΄ΠΈΠ½ Π°Π²Ρ‚ΠΎΡ€ β€” ΠΎΠ΄Π½Π° книга”]:
CREATE TABLE authors
(
    id   BIGSERIAL   NOT NULL PRIMARY KEY,
    name VARCHAR(64) NOT NULL
);

CREATE TABLE books
(
    id        BIGSERIAL    NOT NULL PRIMARY KEY,
    title     VARCHAR(128) NOT NULL,
    author_id BIGINT       NOT NULL UNIQUE REFERENCES authors (id)
);
Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ UNIQUE constraint, Π² нашСм случаС Π½Π° ΠΏΠΎΠ»Π΅ author_id, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠ½ΠΈΠ³ΠΈ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΡ€Π°. Π’Π°ΠΊΠΆΠ΅ вмСсто author_id, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ book_id Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ authors, ΠΈ нашС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠΆΠ΅ выполнится. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ, ΠΊΡ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ связи, Book ΠΈΠ»ΠΈ Author [ΠΎΠ± этом Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΎ Spring Data JPA, Π½ΠΎ Ссли ΠΊΡ€Π°Ρ‚ΠΊΠΎ, Ρ‚ΠΎΡ‚ Ρƒ ΠΊΠΎΠ³ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ foreign key] ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅: Π’ нашСй систСмС ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π°Π²Ρ‚ΠΎΡ€. Однако, Π°Π²Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΊΠ½ΠΈΠ³. РСшСниС: Π’ этом случаС Π½Π°ΠΌ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ One to Many [читаСтся ΠΊΠ°ΠΊ β€œΠΎΠ΄ΠΈΠ½ Π°Π²Ρ‚ΠΎΡ€ β€” мноТСство книг”] Иногда Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Many to One [читаСтся ΠΊΠ°ΠΊ β€œΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΠΊΠ½ΠΈΠ³ β€” ΠΎΠ΄ΠΈΠ½ автор”], Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π½Π΅Ρ‚Ρƒ, ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ мСняСм Π°ΠΊΡ†Π΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ с Ρ‡Π΅ΠΌ связано
CREATE TABLE authors
(
    id   BIGSERIAL   NOT NULL PRIMARY KEY,
    name VARCHAR(64) NOT NULL
);

CREATE TABLE books
(
    id        BIGSERIAL    NOT NULL PRIMARY KEY,
    title     VARCHAR(128) NOT NULL,
    author_id BIGINT       NOT NULL REFERENCES authors (id)
);
ЕдинствСнная Ρ€Π°Π·Π½ΠΈΡ†Π° Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ One to One ΠΈ One to Many, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π½Π΅Ρ‚Ρƒ UNIQUE constraint для поля author_id Π’Π°ΠΊΠΆΠ΅ Ссли ΠΌΡ‹ сдСлаСм book_id Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ authors вмСсто author_id Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ books, Ρ‚ΠΎ нашС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ выполнится, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π°Π²Ρ‚ΠΎΡ€ смоТСт ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ ΠΊΠ½ΠΈΠ³Ρƒ [ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² JPA Ρƒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ManyToOne Π½Π΅Ρ‚Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° mappedBy, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ такая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ являСтся Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ связи, Ρ‚.Π΅. ΠΈΠΌΠ΅Π΅Ρ‚ foreign key Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ] ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅: Π’ нашСй систСмС ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Π±Ρ‹Π»ΠΎ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ². А Ρ‚Π°ΠΊΠΆΠ΅, Π°Π²Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сколько ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΊΠ½ΠΈΠ³. РСшСниС: Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Many to Many [читаСтся ΠΊΠ°ΠΊ β€œΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² β€” мноТСство книг”]:
CREATE TABLE authors
(
    id   BIGSERIAL   NOT NULL PRIMARY KEY,
    name VARCHAR(64) NOT NULL
);

CREATE TABLE books
(
    id    BIGSERIAL    NOT NULL PRIMARY KEY,
    title VARCHAR(128) NOT NULL
);

CREATE TABLE books_authors
(
    id        BIGSERIAL NOT NULL PRIMARY KEY,
    book_id   BIGINT    NOT NULL REFERENCES books (id),
    author_id BIGINT    NOT NULL REFERENCES authors (id),
    UNIQUE (book_id, author_id)
);
БоздаСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π° books_authors, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π½ΡƒΠΆΠ½Ρ‹Π΅ связи ΠΌΠ΅ΠΆΠ΄Ρƒ сущностями НС стоит Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ UNIQUE constraint’a Π½Π° связь book_id ΠΈ author_id, Ρ‡Ρ‚ΠΎΠ±Ρ‹ связь Π±Ρ‹Π»Π° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github #sandbox_postgresql #relationships ➿ ΠœΠ΅Π½ΡŽ ➿ ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡΡŒ: @developer_sandbox

ПослС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€Ρ‹Π²Π°, я вСрнулся с Π½ΠΎΠ²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ. Π‘ΡƒΠ΄Ρƒ ΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ/Π΄Π²Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π² нСдСлю. Π”Π°Π²Π°ΠΉΡ‚Π΅ напишСм ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ JDBC, Spring JDBC, Hibernate ΠΈ Spring Data JPA. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ наглядно, ΠΊΠ°ΠΊ историчСски ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π»ΡΡ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π‘Π” Π² Java ΠΌΠΈΡ€Π΅. ❓ КакоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ напишСм? CRUD для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ Book ΠΈ Π΅Π΅ связями β€” Author, Comment, Genre Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ API для: 1⃣ ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ всСх ΠΊΠ½ΠΈΠ³ ΠΈ Π΅Π΅ связСй 2⃣ ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎ id ΠΈ Π΅Π΅ связСй 3⃣ Боздания ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ Π΅Π΅ связСй 4⃣ ОбновлСния ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ Π΅Π΅ связСй 5⃣ УдалСния ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ Π΅Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΆΠ°Π½Ρ€Π°Ρ… МодСль Π΄Π°Π½Π½Ρ‹Ρ… опишСм Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ: 1⃣ books β€” Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ… 2⃣ authors β€” Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± Π°Π²Ρ‚ΠΎΡ€Π°Ρ…. Π‘ books β€œone-to-one” 3⃣ genres β€” Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ ΠΆΠ°Π½Ρ€Π°Ρ… 4⃣ comments β€” Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ коммСнтариях ΠΊ ΠΊΠ½ΠΈΠ³Π°ΠΌ. Π‘ books β€œone-to-many” 5⃣ books_genres β€” промСТуточная Ρ‚Π°Π±Π»ΠΈΡ†Π° для создания β€œmany-to-many” ΠΌΠ΅ΠΆΠ΄Ρƒ books ΠΈ genres НачнСм Π² порядкС ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ уровня абстракции: πŸ“š JDBC [Java Database Connectivity] β€” спСцификация синхронного API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с рСляционными Π‘Π” ΠΈΠ· Java ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав Java SE. Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ API прСдоставляСт JDBC Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€. НапримСр, для PostgresSQL Π΅ΡΡ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ postgresql-42.6.0.jar, Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΅ΡΡ‚ΡŒ класс PgResultSet, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс java.sql.ResultSet ΠΈΠ· JDBC спСцификации. Для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ SQL запроса, Π½ΡƒΠΆΠ½ΠΎ: 1⃣ ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Connection 2⃣ Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Statement, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² SQL запрос Π² Π²ΠΈΠ΄Π΅ String 3⃣ Если это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ запрос, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‡Π΅Ρ€Π΅Π· .set ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² Statement’e 4⃣ Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ResultSet 5⃣ Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ResultSet, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΈΠ· Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Book, Author, Comment, Genre 6⃣ Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ResultSet 7⃣ Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Statement 8⃣ Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Connection ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github 🌱 Spring JDBC β€” Π½Π°Π±ΠΎΡ€ абстракций, ΡƒΠΏΡ€ΠΎΡ‰ΡΡŽΡ‰ΠΈΠΉ написаниС ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с JDBC. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС шагов ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ самому. НапримСр, аннотация Transactional для ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, класс NamedParameterJdbcOperations для выполнСния запросов. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Connection ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ вмСстС с Statement ΠΈ ResultSet. Однако Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ResultSet'a всС Π΅Ρ‰Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github πŸͺž Hibernate β€” ORM [Object Relational Mapping] Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ. Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ JPA ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ рСляционной ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ Π² ООП ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡƒ. ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ ΠΈΠ· Π‘Π” ΠΊΠ°ΠΊ с Java ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. УбираСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° ResultSet'ΠΎΠ². Вводится понятиС HQL [Π² спСцификации JPA называСтся JPQL], ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ языка запросов, для обСспСчСния нСзависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π‘Π”. Однако появляСтся N+1 ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ мноТСство Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠ°ΠΌΠ½Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ORM Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π» ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ SQL. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github 🌱 Spring Data JPA β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ абстракции Π½Π°Π΄ JPA. По-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Hibernate ΠΊΠ°ΠΊ JPA Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π’Π²ΠΎΠ΄ΠΈΡ‚ понятиС Repository ΠΈ позволяСт Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запросы Π½Π° основС ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, убирая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ JPQL. Помимо этого ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… возмоТностСй, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоряя написаниС ΠΊΠΎΠ΄Π°. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ всС Ρ‚Π΅ ΠΆΠ΅ нСдостатки Ρ‡Ρ‚ΠΎ ΠΈ Hibernate [Π² случаС Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ ΠΊΠ°ΠΊ рСализация JPA]. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ доступСн Π½Π° πŸ™Github #sandbox #java_database_tools ➿ ΠœΠ΅Π½ΡŽ ➿ ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡΡŒ: @developer_sandbox

ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΡŽ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ для ΠΊΠ°Π½Π°Π»Π°, Ρ‡Ρ‚ΠΎ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅?
Anonymous voting

КакоС количСство тСхничСских собСсСдований Ρƒ вас Π±Ρ‹Π»ΠΎ?
Anonymous voting

❓ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ delivery semantics Π² Apache Kafka? Delivery semantics [delivery guarantees, processing guarantees] β€” это способы доставки сообщСний, Ρ‚.Π΅. ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Producer, Broker ΠΈ Consumer для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сообщСниС. Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ классичСской схСмы. Π£ нас Π΅ΡΡ‚ΡŒ: 1⃣ Kafka Cluster с Π»ΡŽΠ±Ρ‹ΠΌ количСством Broker’ов 2⃣ Producer β€” Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π‘Π” ΠΈ отправляСт ΠΈΡ… Π² Π²ΠΈΠ΄Π΅ сообщСния Broker’у Π² demo.topic 3⃣ Consumer β€” подписан Π½Π° demo.topic, Ссли сообщСниС ΠΏΡ€ΠΈΡˆΠ»ΠΎ, Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΈ сохраняСт Π΄Π°Π½Π½Ρ‹Π΅ Π² Π‘Π” Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π΅Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π‘Π” Ρƒ Consumer’a ΠΈ Producer’a Доставка сообщСния Π² нашСм случаС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· шагов: Π¨Π°Π³ 1. Producer Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π‘Π” Π¨Π°Π³ 2. Producer отправляСт сообщСниС Broker’y Π² demo.topic Π¨Π°Π³ 3. Broker сохраняСт сообщСниС Π² demo.topic’e Π¨Π°Π³ 4. Broker увСдомляСт Producer’a, подтвСрТдая Ρ‡Ρ‚ΠΎ сообщСниС сохранСно [acknowledgment] Π¨Π°Π³ 5. Consumer Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ сообщСниС ΠΈΠ· demo.topic’a Π¨Π°Π³ 6. Consumer увСдомляСт Broker’a, Ρ‡Ρ‚ΠΎ сообщСниС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ [offset commit] Π¨Π°Π³ 7. Consumer сохраняСт Π΄Π°Π½Π½Ρ‹Π΅ Π² Π‘Π” ❓ Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΉΡ‚ΠΈ Π½Π΅ Ρ‚Π°ΠΊ? На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ сбой, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ❌ Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ опСративная ΠΏΠ°ΠΌΡΡ‚ΡŒ β€” OutOfMemoryError ❌ Π—Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΎΡΡŒ мСсто Π½Π° дискС ❌ Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ сбой Π² сСти ❌ Π‘лучился timeout, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π¨Π°Π³ 3 β€” Broker слишком Π΄ΠΎΠ»Π³ΠΎ сохранял сообщСниС Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² случаС Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ€Π°Π·Π½Ρ‹Π΅ delivery semantics. βœ”οΈ Delivery semantics Π΄Π»Ρ Producer’a: 1⃣ At most once β€” сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ максимум 1 Ρ€Π°Π·. Producer отправляСт сообщСниС ΠΈ Π½Π΅ ΠΆΠ΄Π΅Ρ‚ ΠΎΡ‚ Broker’a acknowledgment, Π° Ссли Broker Π½Π΅ смог Π΅Π³ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, сообщСниС большС ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΎΠ½ΠΎ утСряно. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ β€˜fire-and-forget’. 2⃣ At least once β€” сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 1 Ρ€Π°Π·. Producer отправляСт сообщСниС ΠΈ ΠΆΠ΄Π΅Ρ‚ acknowledgment, Π° Ссли Broker Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» acknowledgment, Ρ‚ΠΎ Producer Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ сообщСниС. Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ситуация, Ссли Broker записал сообщСниС, Π½ΠΎ Π²Ρ‹ΡˆΠ΅Π» ΠΈΠ· строя Π½Π° этапС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ acknowledgment’a, ΠΈ ΠΊΠΎΠ³Π΄Π° Broker восстановится ΠΈ Producer ΠΏΠ΅Ρ€Π΅ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ сообщСниС, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎ сути создадим Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚, сохранив Π² Broker’e Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΎΠ΄Π½ΠΎ сообщСниС. 3⃣ Exactly once β€” сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 Ρ€Π°Π·. Producer отравляСт сообщСниС ΠΈ ΠΆΠ΄Π΅Ρ‚ acknowledgment, Π° Ссли Broker Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» acknowledgment, Ρ‚ΠΎ Producer Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ сообщСниС, ΠΈ Ссли Broker ΡƒΠΏΠ°Π΄Π΅Ρ‚ Π½Π° этапС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ acknowledgment’a ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚, ΠΎΠ½ это ΠΏΠΎΠΉΠΌΠ΅Ρ‚ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎΠΆΠ΅ сообщСниС Π΄Π²Π°ΠΆΠ΄Ρ‹. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π½Π΅ тСряСм сообщСния ΠΈ Π½Π΅ создаСм Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹. βœ”οΈ Delivery semantics Π΄Π»Ρ Consumer’a: 1⃣ At most once β€” сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ максимум 1 Ρ€Π°Π·. Consumer Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ сообщСниС ΠΈΠ· Broker’a ΠΈ Ссли ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π£ нас Π¨Π°Π³ 7, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Spring ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Consumer ΡƒΠΏΠ°Π»ΠΎ с OOM ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ поднялось, Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСниС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΡ‚ΡŒ ΠΈ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² Π‘Π”. Π’ΡƒΡ‚ ΠΌΡ‹ тСряСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния. 2⃣ At least once β€” сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ 1 Ρ€Π°Π·. Consumer Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ сообщСниС ΠΈΠ· Broker’a ΠΈ Ссли ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΎΠ½ Π·Π°Π½ΠΎΠ²ΠΎ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Π΅Ρ‚. Π£ нас Π¨Π°Π³ 6 ΠΈ Π¨Π°Π³ 7 ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ мСстами, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π² Π‘Π”, Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ commit offset ΠΈ ΠΏΠ°Π΄Π°Π΅ΠΌ с OOM, ΠΈ ΠΊΠΎΠ³Π΄Π° поднимаСмся, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ сообщСниС ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ Π² Π‘Π”. 3⃣ Exactly once β€” сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 Ρ€Π°Π·. Consumer Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ сообщСниС ΠΈΠ· Broker’a ΠΈ Ссли ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΎΠ½ Π·Π°Π½ΠΎΠ²ΠΎ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Π°Π΅Ρ‚. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ ΠΈ Π½Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния Ρƒ нас Π΅ΡΡ‚ΡŒ 2 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: β€” Вранзакция Π² Π‘Π” ΠΈΠ΄Π΅ΠΌΠΏΠΎΡ‚Π΅Π½Ρ‚Π½Π° ΠΈ Ссли ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ Π΅Π΅, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ измСнится β€” ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ commit offset Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΊ Π‘Π” [Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ offset Π² Broker’e, ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π‘Π”], Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π¨Π°Π³ 6 ΠΈ Π¨Π°Π³ 7 Π±Ρ‹Π» ΠΎΠ΄Π½ΠΈΠΌ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ шагом. Π’ΠΎΠ³Π΄Π° Ρƒ нас Π½Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСния ΠΌΡ‹ Π½Π΅ тСряСм НСмного Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° β€” πŸ™Github #sandbox_kafka #spring_boot_kafka β€”β€”β€”β€”β€”β€”β€”β€” ➿ ΠœΠ΅Π½ΡŽ ➿ ΠŸΠΎΠ΄ΠΏΠΈΡˆΠΈΡΡŒ: @sandbox_big_decimal

НСдавно Π²Ρ‹ΡˆΠ»Π° общСдоступная вСрсия Java 21, которая являСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ LTS (Long-term support) вСрсиСй послС Java 17 Π‘ΠΌΠΎΡ‚Ρ€Π΅Π»
НСдавно Π²Ρ‹ΡˆΠ»Π° общСдоступная вСрсия Java 21, которая являСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ LTS (Long-term support) вСрсиСй послС Java 17 Π‘ΠΌΠΎΡ‚Ρ€Π΅Π» ΠΊΠ°ΠΊΠΈΠ΅ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² язык, ΠΈ Π·Π°Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π²Π°ΠΌΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ рСсурсом, Π³Π΄Π΅ я ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΌΠΎΡ‚Ρ€ΡŽ обновлСния β€” javaalmanac Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ вСрсии Java, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ заканчивая Ρ‚ΠΎΠΉ, Ρ‡Ρ‚ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ (Java 22) ❓ Π§Ρ‚ΠΎ Ρ‚ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ? β€” Бсылки Π½Π° спСцификации β€” языка, API, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ β€” Бсылки Π½Π° release notes β€” Если ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Ρ‚ΠΎ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ (JVM, Language, API), ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ список Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Ρ„ΠΈΡ‡, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ β€” Π’ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ΅ "Compare API to" ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ вСрсии, сравнив API Π΄ΠΎ самых ΠΌΠ΅Π»ΠΎΡ‡Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ΅ΠΆΠ΄Ρƒ Java 21 ΠΈ Java 20 добавился ΠΌΠ΅Ρ‚ΠΎΠ΄ isEmoji(int) Π² Character классС Π—Π°ΠΎΠ΄Π½ΠΎ Ρ€Π΅ΡˆΠΈΠ» ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ свои ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½Π° самыС послСдниС вСрсии: β€” ΠŸΠ΅Ρ€Π΅ΡˆΠ΅Π» Π½Π° Java 21 β€” ΠžΡ‚Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ» build.gradle ΠΈ ΠΏΠ΅Ρ€Π΅ΡˆΠ΅Π» Π² Π½Π΅ΠΌ с Groovy Π½Π° Kotlin β€” Обновил всС вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π° Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ docker β€” ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» вСрсии imag'Π΅ΠΉ Π’Π΅ΠΏΠ΅Ρ€ΡŒ структура ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΡ‰Π΅: 🌱 sandbox-spring-context 🌱 sandbox-spring-web πŸ“– sandbox-kafka β˜•οΈ sandbox-java #note #sources β€”β€”β€”β€”β€”β€”β€”β€” ➿ МСню ➿ Подпишись: @sandbox_big_decimal

πŸ”€πŸ”€πŸ”€πŸ”€
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”

Javaβ˜•οΈ πŸ”€Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌ классом ΠΈ Ξ»-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ? πŸ”€ΠšΠ°ΠΊΠΈΠ΅ Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΈΠΏΡ‹ Ξ»-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ? πŸ”€ΠšΠ°ΠΊ Capturing Ξ»-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ влияСт Π½Π° GC? πŸ”€Π’ΡΠ΅Π³Π΄Π° Π»ΠΈ method reference Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΊΠ°ΠΊ ΠΈ Ξ»-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅? πŸ”€Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Happens-before ΠΈ ΠΊΠ°ΠΊ воспроизвСсти эту Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡŽ? πŸ”€Π”Π»Ρ Ρ‡Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ volatile ΠΈ synchronized? Spring Context🌱 πŸ”€Annotation-based config ΠΈ ΠΊΠ°ΠΊ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ½ Π² runtime? πŸ”€Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² случаС возникновСния цикличСской зависимости? πŸ”€ΠšΠ°ΠΊΠΈΠ΅ Π±Ρ‹Π²Π°ΡŽΡ‚ способы Dependency Injection? πŸ”€ΠšΠ°ΠΊ Spring создаСт Π±ΠΈΠ½ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π΅Π³ΠΎ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ»?🫘 Spring Web🌱 πŸ”€ΠžΠ±Π·ΠΎΡ€ Π²ΠΈΠ΄Π΅ΠΎΡƒΡ€ΠΎΠΊΠ° "АрхитСктура ΠΊΠΎΠ΄Π° (Java)" πŸ”€Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ SSL сСртификаты ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹?πŸ“œ πŸ”€ΠžΡ‚ΠΊΡƒΠ΄Π° Π²Π·ΡΡ‚ΡŒ сСртификаты ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π²ΠΈΠ΄Ρ‹?πŸ“œ πŸ”€ΠšΠ°ΠΊ происходит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сСртификата?πŸ“œ Apache KafkaπŸ“– πŸ”€Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Apache Kafka ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ области Π΅Π΅ примСнСния? πŸ”€ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ сущности Apache Kafka. Π§Π°ΡΡ‚ΡŒ 1 πŸ”€ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ сущности Apache Kafka. Π§Π°ΡΡ‚ΡŒ 2 πŸ”€Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ DLT ΠΈ ΠΊΠ°ΠΊ это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Apache Kafka? OtherπŸ“ πŸ”€Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΊΠ°Π½Π°Π»Π° πŸ”€ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π² ЯндСкс, Π’ΠΈΠ½ΡŒΠΊΠΎΡ„Ρ„ πŸ”€ΠžΠ±Π·ΠΎΡ€ ΠΊΠ½ΠΈΠ³ΠΈ β€œΠžΡ‚ Π”ΠΆΡƒΠ½Π° Π΄ΠΎ Π‘Π΅Π½ΡŒΠΎΡ€Π°" πŸ”€Π‘ΠΏΠΈΡΠΎΠΊ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

#sandbox_spring_web #https ΠžΡ‚Π²Π΅Ρ‚ΠΈΠΌ Π½Π° вопрос ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ: ❔Если ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ сСртификат Π²Ρ‹Π΄Π°Π½Π½Ρ‹ΠΉ CA, Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π΅ΠΌΡƒ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ? Π’Π΅Π΄ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π°Π½Π½Ρ‹ΠΉ сСртификат Π½Π΅ появится Π²ΠΎ всСх ОБ ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΊΠ°ΠΊ Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΉ Π² ΠΈΡ… truststore. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° этот вопрос, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ провСряСтся сСртификат. Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: ΠŸΠ΅Ρ€Π΅Π΄ запросом сСртификата ΠΎΡ‚ CA, ΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ private key ΠΈ CSR (Certificate Signing Request). Π’ CSR хранится информация ΠΎ нашСм сайтС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΏΠΎΠ»Π΅ subject ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ»Π΅ CN=<Π΄ΠΎΠΌΠ΅Π½>), Π° Ρ‚Π°ΠΊΠΆΠ΅ public key, связанный с нашим private key. ❔Что Ρ‚Π°ΠΊΠΎΠ΅ private key ΠΈ public key? Π­Ρ‚ΠΎ понятия ΠΈΠ· ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· ассимСтричного ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ RSA). Π—Π΄Π΅ΡΡŒ Π½Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ сущСствуСт связанная ΠΏΠ°Ρ€Π° ΠΊΠ»ΡŽΡ‡Π΅ΠΉ: β€” Public key ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ людям, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ signature (цифровая подпись) β€” Private key слСдуСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² сСкрСтС, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ создания signature ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ CA ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» CSR, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π³ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ свой CA сСртификат ΠΈ CA private key, ΠΎΠ½ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π°ΠΌ сСртификат (Π² ΠΏΠΎΠ»Π΅ issuer нашСго сСртификата Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π° информация ΠΈΠ· subject'a CA сСртификата) ΠΈ ΠΌΡ‹ устанавливаСм Π΅Π³ΠΎ Π½Π° сСрвСр. На этом этапС Π½Π° нашСм сСрвСрС Π΅ΡΡ‚ΡŒ: β€” Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π°ΠΌΠΈ private key β€” Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π°ΠΌ ΠΎΡ‚ CA сСртификат, содСрТащий наш public key ΠΈ подпись, ΡΠ΄Π΅Π»Π°Π½Π½ΡƒΡŽ CA private key ❔А Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ запрос Π½Π° наш сСрвСр? β€” Π£ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ CA сСртификат, ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ установлСнный Π² truststore Π΅Π³ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ отправляСт запрос Π½Π° сСрвСр, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сСртификата происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: 1️⃣ ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сСртификат сСрвСра 2️⃣ Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ issuer ΠΈ ΠΈΡ‰Π΅ΠΌ Π² truststore сСртификат, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠΉ subject (ΠΌΡ‹ Π΅Π³ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ, это CA сСртификат) 3️⃣ Π‘Π΅Ρ€Π΅ΠΌ public key ΠΈΠ· CA сСртификата, Π° signature Π±Π΅Ρ€Π΅ΠΌ ΠΈΠ· сСртификата сСрвСра 4️⃣ Π’.ΠΊ. signature Π±Ρ‹Π»Π° сдСлана ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ CA private key, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ CA public key ΠΌΡ‹ провСряСм Π΅Π΅ ΠΈ достаСм ΠΈΠ· signature ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ hash'e сСртификата сСрвСра. 5️⃣ Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠ°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ использовался для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ hash'a сСртификата сСрвСра 6️⃣ ΠžΡ‚ΠΊΠΈΠ΄Ρ‹Π²Π°Π΅ΠΌ signature ΠΈ считаСм hash для body (body это вСсь Ρ„Π°ΠΉΠ» сСртификата, ΠΊΡ€ΠΎΠΌΠ΅ signature) 7️⃣ Если hash ΠΈΠ· signature ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ рассчитанный hash для body Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ сСртификат сСрвСра Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Ρ‹Π» подписан CA ΠΈ Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, имСя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ CA сСртификат, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ всС Π²Ρ‹Π΄Π°Π½Π½Ρ‹Π΅ этим CA сСртификаты. Π­Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ сСртификатов (certificate chain): β€” НапримСр, ΠΎΠ΄ΠΈΠ½ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΉ CA Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΎΠΌ сСртификаты Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ CA помСньшС, Π° ΠΎΠ½ ΡƒΠΆΠ΅ Π²Ρ‹Π΄Π°Π΅Ρ‚ сСртификаты физичСским Π»ΠΈΡ†Π°ΠΌ. β€” Π’ΠΎΠ³Π΄Π° Π½Π° сСрвСрС Π±ΡƒΠ΄Π΅Ρ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° сСртификатов ΠΎΡ‚ Ρ€Π°Π·Π½Ρ‹Ρ… CA (ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² Ρ‚ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΈ Π²Ρ‹Π΄Π°Π²Π°Π»ΠΈΡΡŒ) β€” Но ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ всС Ρ€Π°Π²Π½ΠΎ достаточно ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ сСртификат Π² truststore, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ ΠΊΡ€ΡƒΠΏΠ½ΠΎΠ³ΠΎ CA β€” ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ, описанному Π²Ρ‹ΡˆΠ΅, ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΠΎ всСй Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅, начиная ΠΎΡ‚ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ сСртификата Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ провСсти Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΠΏΠΎ ссылкС Π½ΠΈΠΆΠ΅, я описал скрипт для Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ сСртификата (поиск ΠΏΠΎ Manual certificate validation), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» https ΠΊΠ»ΠΈΠ΅Π½Ρ‚: https://github.com/alpa1479/sandbox-spring-web/blob/main/examples/https/bash_scripts/generate-certificates.sh

Как Π²Ρ‹ Π±Ρ‹ ΠΎΡ†Π΅Π½ΠΈΠ»ΠΈ свой ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π·Π½Π°Π½ΠΈΠΉ?
Anonymous voting

#sandbox_spring_web #https ΠžΡ‚Π²Π΅Ρ‚ΠΈΠΌ Π½Π° Ρ‡Π°ΡΡ‚ΡŒ вопросов ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ: β”ΠžΡ‚ΠΊΡƒΠ΄Π° Π²Π·ΡΡ‚ΡŒ сСртификаты? β”ΠšΠ°ΠΊΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ сСртификатов Π΅ΡΡ‚ΡŒ? Π‘Π΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ нСсколькими способами: β€” Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ β€” ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ бСсплатно, Π»ΠΈΠ±ΠΎ ΠΊΡƒΠΏΠΈΡ‚ΡŒ Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ статус Π‘ertificate Authority (CA) ⚠️ Π•сли любой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСртификаты, Ρ‚ΠΎ ΠΊΠ°ΠΊ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π»ΠΈΠ±ΠΎ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΎΠ±Ρ‰Π°ΡŽΡ‰ΠΈΠΉΡΡ с HTTPS сСрвСром, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ сСртификату сСрвСра ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ? Для ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° этот вопрос Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ сСртификатов, ΠΈ Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ сСртификатами ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, Ρ‡Ρ‚ΠΎ находятся Π² этом Π½Π°Π±ΠΎΡ€Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ truststore. Π’ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах ΠΈ JDK Ρ‚Π°ΠΊΠΈΠ΅ Π½Π°Π±ΠΎΡ€Ρ‹ сСртификатов ΠΈΠ΄ΡƒΡ‚ сразу с установкой. А сами сСртификаты бСрутся Ρƒ Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… CA ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ (НапримСр DigiCert, Let's Encrypt). Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ сгСнСрируСтС свой сСртификат, Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΅ΠΌΡƒ смогут Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прилоТСния, Π³Π΄Π΅ Ρƒ вас Π΅ΡΡ‚ΡŒ прямой доступ ΠΊ ΠΈΡ… truststore. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²ΠΈΠ΄Ρ‹ сСртификатов ΠΏΠΎ ΡƒΡ€ΠΎΠ²Π½ΡŽ довСрия ΠΊ Π½ΠΈΠΌ: πŸ“ Self-signed - самоподписанныС сСртификаты. МоТно ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ openssl. Π”ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ сСртификатам смоТСтС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ добавят ΠΈΡ… Π² свой truststore. ВСхничСски, ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Π΅ сСртификаты ΠΎΡ‚ CA, установлСнныС ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈ ОБ, Ρ‚ΠΎΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ самоподписанными, Π½ΠΎ ΠΈΠΌ принято Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ. Если ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сСртификат Ρ‡Π΅Ρ€Π΅Π· CA, Ρ‚ΠΎ Π² зависимости ΠΎΡ‚ количСства ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ со стороны CA, Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ сСртификатов: πŸ“ DV (Domain Validation) - CA организация провСряСт, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обратился Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ сСртификата. Π­Ρ‚ΠΎ самая минимальная ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, ΠΌΠΎΠΆΠ½ΠΎ провСсти автоматичСски ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сСртификат бСсплатно, Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π΅Ρ‚ CA организация - Let's Encrypt. πŸ“ OV (Organization Validation) - CA ΠΏΠΎΠΌΠΈΠΌΠΎ Π΄ΠΎΠΌΠ΅Π½Π°, провСряСт Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ ваша организация Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сущСствуСт ΠΈ Ρƒ Π½Π΅Π΅ Π΅ΡΡ‚ΡŒ ΡŽΡ€ΠΈΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ адрСс. Π’Π°ΠΊΠΎΠΉ сСртификат Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ ΠΏΠ»Π°Ρ‚Π½Ρ‹ΠΉ. πŸ“ EV (Extended Validation) - CA ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Ρ‚ ряд Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ вашСй ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΎΠΉ сСртификат Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ Π΄ΠΎΡ€ΠΎΠΆΠ΅. Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ корпорациям, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΎΠΉ сСртификат ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° сайтС apple. ΠžΡΡ‚Π°ΡŽΡ‚ΡΡ вопросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ рассмотрим Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ…: ❔Б тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ сСртификат? (ΠŸΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ TLS-handshake) ❔Если ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ сСртификат Π²Ρ‹Π΄Π°Π½Π½Ρ‹ΠΉ CA, Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π΅ΠΌΡƒ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ? Π’Π΅Π΄ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π΄Π°Π½Π½Ρ‹ΠΉ сСртификат Π½Π΅ появится Π²ΠΎ всСх ОБ ΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΊΠ°ΠΊ Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΉ Π² ΠΈΡ… truststore. (ΠŸΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ certificate chain) Π—Π°Ρ€Π°Π½Π΅Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ сСртификатов: https://github.com/alpa1479/sandbox-spring-web/blob/main/examples/https/bash_scripts/generate-certificates.sh

#sandbox_spring_web #https Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ SSL сСртификаты ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹? Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅: Π£ нас Π΅ΡΡ‚ΡŒ сайт, Π³Π΄Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π°Π½Π½Ρ‹Π΅ банковских ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ, паспорта, Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ΠΎΠ² ΠΈ Ρ‚.Π΄.) Если ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½Π° сайтС HTTP ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: ❌ ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ сСти Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст, ΠΈ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ доступ ΠΊ сСти, ΠΌΠΎΠΆΠ΅Ρ‚ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. ❌ Поисковики (google ΠΈ Π΄Ρ€.) ΠΏΠΎΠ½ΠΈΠΆΠ°ΡŽΡ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… поиска сайты, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ HTTP ❌ Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ (google chrome ΠΈ Π΄Ρ€.) ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° HTTP сайт ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ нСбСзопасный ❌ НСт Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° Ρ‡Ρ‚ΠΎ наш сайт, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ нашСй ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’.Π΅. Π½Π΅Ρ‚Ρƒ сСртификата, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ это прописано. И Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΏΠΈΠΈ нашСго сайта. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этих ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° HTTPS. И здСсь ΠΌΡ‹ Π²Π²ΠΎΠ΄ΠΈΠΌ понятия SSL ΠΈ TLS: SSL - Secure Sockets Layer - ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π² ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ для бСзопасной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти. SSL являСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ ΠΈ вмСсто Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Π½Π° Π΅Π³ΠΎ основС TLS - Transport Layer Security, ΠΎΠ΄Π½Π°ΠΊΠΎ тСрминология часто встрСчаСтся ΠΈΠ· старого ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, ΠΈ ΠΊΠΎΠ³Π΄Π° говорят SSL сСртификат, ΠΈΠΌΠ΅ΡŽΡ‚ Π²Π²ΠΈΠ΄Ρƒ TLS сСртификат. HTTPS ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ TLS для обСспСчСния бСзопасной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. ЀактичСски HTTPS это HTTP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Π½ΠΈΠΆΠ΅ TLS. Благодаря использованию TLS ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ: βœ… ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ - Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ сСти Π² Π·Π°ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ наши ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст. βœ… ΠŸΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ - Π² сСртификатС нашСго сайта Π±ΡƒΠ΄Π΅Ρ‚ связь ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌ ΠΈ нашСй ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. ΠŸΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ сСртификат ΠΈ смоТСт ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠΎΠΏΠ°Π» Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ сайт. βœ… Π¦Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ - Π΄Π°Π½Π½Ρ‹Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ/сСрвСром Π² Ρ‚ΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ/сСрвСром. Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ Π½Π΅ смоТСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ссли ΠΎΠ½ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚. (ДостигаСтся это благодаря Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ MAC (Message Authentication Code). ΠšΠ»ΠΈΠ΅Π½Ρ‚ вычисляСт Ρ…Π΅Ρˆ сообщСния ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ сСрвСру вмСстС с сообщСниСм, сСрвСр вычисляСт Ρ…Π΅Ρˆ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ сообщСния ΠΈ сравниваСт с Ρ…Π΅ΡˆΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Если Ρ…Π΅Ρˆ совпадаСт, Π·Π½Π°Ρ‡ΠΈΡ‚ сообщСниС Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ.) Π‘Π°ΠΌΠ° рСализация ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° TLS Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ сСртификата. Π‘Π΅Π· Π½Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. SSL (TLS) сСртификат - логичСски прСдставляСт собой Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ паспорт сСрвСра, Π° физичСски это Ρ„Π°ΠΉΠ», ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .cer ΠΈΠ»ΠΈ .pem Π’ Π½Π΅ΠΌ содСрТится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ основная информация: πŸ“ Subject - Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ сСртификата (содСрТит ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² CN (Common Name) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΄ΠΎΠΌΠ΅Π½) πŸ“ Issuer - Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ подписчикС сСртификата (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ CA (Certificate Authority) подписал этот сСртификат) πŸ“ Public key - ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ сСртификата, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ подписи ΠΈ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ session key (ΠΎ Π½Π΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅) πŸ“ Valid from - Π΄Π°Ρ‚Π° создания сСртификата πŸ“ Valid until - срок дСйствия сСртификата πŸ“ Signature - цифровая подпись сСртификата, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ подписанная CA Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ прСдставляСм Ρ‡Ρ‚ΠΎ это ΠΈ для Ρ‡Π΅Π³ΠΎ это Π½ΡƒΠΆΠ½ΠΎ. ΠžΡΡ‚Π°ΡŽΡ‚ΡΡ вопросы: β”ΠžΡ‚ΠΊΡƒΠ΄Π° Π²Π·ΡΡ‚ΡŒ сСртификаты? β”ΠšΠ°ΠΊΠΈΠ΅ Π²ΠΈΠ΄Ρ‹ сСртификатов Π΅ΡΡ‚ΡŒ? ❔Б тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ сСртификат? Об этом Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ…. Однако для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ быстрСС ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Spring Boot сСрвСра c mTLS ΠΈ скрипт с эмуляциСй Π²Ρ‹Π΄Π°Ρ‡ΠΈ CA клиСнтского ΠΈ сСрвСрного сСртификата, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΏΠΎ ссылкС: https://github.com/alpa1479/sandbox-spring-web/blob/main/examples/https/bash_scripts/generate-certificates.sh