BackEnd๐ฑ116 MySQL ๋ฒ์ ์ ๋ฐ๋ฅธ @Transactional(readOnly=true)์ ๋์ ๊ณผ์ ๊ฐ์ ์ด ๊ธ์ ํํ๋์ ๋ธ๋ก๊ทธ ๊ฒ์๊ธ์์ ์๊ฐ์ ๋ฐ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ํตํด RDBMS๋ฅผ ํ์ฉํ๋ ๊ณผ์ ์์, ์ฐ๋ฆฌ๋ ์ฑ๋ฅ ์ต์ ํ, ๊ฐ๋ ์ฑ ํฅ์, ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง ๋ฑ ์ฌ๋ฌ ์ด์ ๋ก ๋น์ฆ๋์ค ๋ก์ง์ @Transactional(readOnly=true) ์ด๋ ธํ ์ด์ ์ ์์ฃผ ์ฌ์ฉํ๊ณค ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์ด๋ ธํ ์ด์ ์ ์ด๋ ํ ์๋ฆฌ๋ก ๋์ํ๋ ๊ฒ์ผ๊น์? ์ด๋ฒ ๊ธ์์๋ @Transactional(readOnly=true)์ JDBC ๋จ๊ณ์์์ ๋์ ๊ณผ์ ์ ์์ฃผ๋ก ์ดํด๋ณด๋ ค ํฉ๋๋ค. ๋์ ๊ณผ์ ๋น์ฆ๋์ค ๋ก์ง์ @Transactional(readOnly=true)์ ๊ฑธ๊ณ ์คํํ๋ ๊ฒฝ์ฐ ๋์ํ๋ ์ ์ฒด์ ์ธ ๊ณผ์ ์ ์๋์ ๊ฐ์ต๋๋ค. ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค๋น ์ฝ๊ธฐ ์ ์ฉ ์ํ ์ ํ ๋น์ฆ๋์ค.. 2024. 1. 24. [Kafka] ๋ฆฌ๋ฐธ๋ฐ์ฑ ์ข ๋ฅ์ ํํฐ์ ํ ๋น ์ ๋ต ๊ฐ์์นดํ์นด ์ปจ์๋จธ๋ ํ ํฝ์ ๊ฐ ํํฐ์ ์์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ํน์ ์ปจ์๋จธ๊ฐ ๋ฌธ์ ๋ฅผ ๊ฒช๊ฒ ๋๋ฉด ๊ทธ ์ปจ์๋จธ๊ฐ ์ฒ๋ฆฌํ๋ ํํฐ์ ์ ์์ ๊ถ์ ๋ค๋ฅธ ์ปจ์๋จธ๋ก ๋๊ฒจ์ผ ํฉ๋๋ค. ์ด๋ฐ ๊ณผ์ ์ '๋ฆฌ๋ฐธ๋ฐ์ฑ'์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ์ฃผ๋ก ์๋ ๋ค ๊ฐ์ง ์ํฉ์์ ๋ฐ์ํฉ๋๋ค.์ปจ์๋จธ ๊ทธ๋ฃน์ ์๋ก์ด ์ปจ์๋จธ๊ฐ ์ถ๊ฐ๋ ๋๊ธฐ์กด ์ปจ์๋จธ๊ฐ ๊ทธ๋ฃน์์ ๋๊ฐ ๋๊ตฌ๋ ํ๋ ํ ํฝ์ ์๋ก์ด ํํฐ์ ์ด ์๊ธธ ๋์ปจ์๋จธ๊ฐ ๊ตฌ๋ ํ๋ ํ ํฝ์ด ๋ณ๊ฒฝ๋ ๋๋ฆฌ๋ฐธ๋ฐ์ฑ์ด ๊ฐ์ฅ ๋ง์ด ์ผ์ด๋๋ ์ผ๋ฐ์ ์ธ ์ํฉ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์์ ๋๋ค. ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ํ ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ฉด์, ๊ธฐ์กด ์ปจ์๋จธ๊ฐ ์ญ์ ๋๊ณ ์๋ก์ด ์ปจ์๋จธ๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๊ณผ์ ์์ ๋ฆฌ๋ฐธ๋ฐ์ฑ์ด ์ต์ ๋ ๋ฒ ์ด์ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋ฐธ๋ฐ์ฑ ๊ณผ์ ์ ์๋์ ๊ฐ์ ๋ฌธ์ ์ ์ ๋๋ฐํฉ๋๋ค.. 2024. 1. 7. Hibernate์ @Formula๋ฅผ ์ด์ฉํ ์ฐ๊ด ๊ด๊ณ ์ํฐํฐ ์ง๊ณ ๊ฐ์ Hibernate์ @Formula ์ด๋ ธํ ์ด์ ์ ์ํฐํฐ ํด๋์ค ๋ด์์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ์กด์ฌํ์ง ์๋ '๊ฐ์ ์ปฌ๋ผ'์ ์ ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. @Formula๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ปฌ๋ผ๋ค์ ๊ฐ์ ๊ธฐ๋ฐํ์ฌ ๊ณ์ฐ๋ ๊ฐ์ ํํํ ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋๋ง ๊ณ์ฐ๋์ด ์ฌ์ฉ๋ฉ๋๋ค. ์์ ์ฝ๋ @Formula ์ด๋ ธํ ์ด์ ์ ์ ํ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ฐ๊ด๋ ๋ฐ์ดํฐ์ ์ง๊ณ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์๊ธ๊ณผ ์ฐ๊ฒฐ๋ ๋๊ธ์ ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ ์์ต๋๋ค. ์๋๋ ๊ฐ๋จํ ์์ ์ฝ๋์ ๋๋ค. ์ ์ฒด ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) pri.. 2023. 12. 20. [Java] CompletableFuture๋ก ๋น๋๊ธฐ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๊ธฐ Future vs CompletableFuture Future์ CompletableFuture๋ ๋ชจ๋ Java์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค. Java 5์์ ๋์ ๋ Future๋ ๋น๋๊ธฐ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, Java 8์์ ๋์ ๋ CompletableFuture๋ Future๋ฅผ ํ์ฅํ์ฌ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. CompletableFuture์ Future์ฐจ์ด๋ ๋ฌด์์ผ๊น์? Future์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ด๋ฒ ํฌ์คํ ์ ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ ๊ฐ์ ๊ฐ๋จํ๊ฒ CompletableFuture์์ ์ฐจ์ด์ ๋ง ๋น๊ตํด ๋ณด์์ต๋๋ค. Blocking vs Non-Blocking Future๋ get() ๋ฉ์๋๋ฅผ ํตํด ๋น๋๊ธฐ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค. ํ์ง๋ง ์ด ๋ฉ์๋๋ ์ฐ์ฐ์ด ์๋ฃ.. 2023. 12. 12. Bucket4j๋ก ํธ๋ํฝ ์ ํํ๊ธฐ(Redis & MariaDB) ๊ฐ์ ์ต๊ทผ ์ ๋ฌด ํ๋ก์ ํธ์์ ํน์ (์๊ธ์ด ๋ถ๊ฐ๋๋) ๋ก์ง์ ๋ํด ์๋ณ ์ฌ์ฉ๋์ ์ ํํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด์ผ ํ์ต๋๋ค. ์ด์ ๊ด๋ จํ์ฌ ์ฒ๋ฆฌ์จ ์ ํ ๊ธฐ์ ์ ์์๋ณด์๋๋ฐ Bucket4j, Guava, RateLimitj, Resilience4j ๋ฑ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๊ฑธ ์๊ฒ ๋์๊ณ , ํ๋ก์ ํธ ํ๊ฒฝ์ธ Spring Boot 2.7.x, MariaDB(nosql & in-momory๋ถ์ฌ), Java 11์ ์๋ง์ Bucket4j๋ฅผ ์ ํํ๊ฒ ๋์์ต๋๋ค. ๋ค์์ ๊ณ ๋ คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํน์ง๊ณผ ๊ทธ ์ ํ ์ด์ ์ ๋๋ค. Guava: ๋ค์ํ ํต์ฌ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง๋ง, ๋จ์ํ Rate Limiting ๊ธฐ๋ฅ๋ง์ ์ํด ์ฌ์ฉํ๊ธฐ์๋ ๋ค์ ๋ฌด๊ฑฐ์ด ๋๋์ด๋ค. Resilience4j: ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก .. 2023. 12. 3. ShedLock์ผ๋ก ๋ค์ค ์ธ์คํด์ค ํ๊ฒฝ์์ ๋จ์ผ ์ค์ผ์ค๋ฌ ๋์ ๋ณด์ฅํ๊ธฐ ๊ฐ์ ์คํ๋ง์์ ์ ๊ณตํ๋ @EnableScheduling ์ด๋ ธํ ์ด์ ์ ๊ฐํธํ๊ฒ ์ค์ผ์ค๋ง ์์ ์ ์ค์ ํ ์ ์๊ฒ ํด ์ฃผ์ง๋ง, ๋ค์ค ์ธ์คํด์ค ํ๊ฒฝ์์๋ ๋์ผํ ์์ ์ด ์ฌ๋ฌ ๋ฒ ์คํ๋ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ShedLock์ด๋ผ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. ShedLock์ ์คํ๋ง ์ค์ผ์ค๋ง๊ณผ ํจ๊ป ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ๋์ผํ ์ค์ผ์ค๋ง ์์ ์ ๋์์ ์คํํ๋ ๊ฒ์ ๋ฐฉ์งํด ์ค๋๋ค. ํ ์คํธ ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค. ShedLock ์ดํดํ๊ธฐ ShedLock์ ๋ถ์ฐ๋ ์์คํ ํ๊ฒฝ์์ ๋์ผํ ์ค์ผ์ค๋ง ์์ ์ด ์ค๋ณต์ผ๋ก ์ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ง์ ๋ ์์ ์ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ .. 2023. 11. 24. default method๋ก JpaRepository ์ข ๋ ์ฐ์ํ๊ฒ ์จ๋ณด๊ธฐ ๊ฐ์ Spring Data JPA์์ JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ๋ Java 8์์ ๋์ ๋ default method๋ฅผ ํ์ฉํ๋ฉด ๊ธฐ์กด ์ฝ๋๋ฅผ ์ข ๋ ๊น๋ํ๊ณ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. Optional ์ ๊ฑฐํ๊ธฐ Spring Data JPA์ findByXX ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก Optional์ ๋ฐํํ๋ค. ์ด๋ก ์ธํด ๋น์ฆ๋์ค ๋ก์ง์์ Optional ์ฒ๋ฆฌ๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๊ฒ ๋๋๋ฐ, ์ด๋ด ๋ default ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ฐ์ํ๊ฒ ํด๊ฒฐํ ์ ์๋ค. public interface UserRepository extends JpaRepository { // Default ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ findById์ Optional์ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ default User fin.. 2023. 11. 16. [Docker MySQL] Proxy Layer ๊ตฌ์ถํ๊ธฐ ๊ฐ์ ์ด์ ๊ฒ์๊ธ [Docker MySQL] Orchestrator๋ฅผ ์ด์ฉํ High Availability(HA) ๊ตฌ์ถํ๊ธฐ์์ ๋ง์คํฐ ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ ๋ง์คํฐ ์๋ฒ๋ก ์น๊ฒฉ์ํค๋ ๊ณผ์ ์ ์๋ํํ๋ Orchestrator๋ฅผ ํ์ฉํ ๊ณ ๊ฐ์ฉ์ฑ(High Availability, HA) ๊ตฌ์ฑ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ง์คํฐ ์๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๋๊ธฐํ๋๊ฒ ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ง์คํฐ ์๋ฒ์ ๋ถํ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ถ์ฐ์ํฌ ์ ์์์ต๋๋ค. ํ์ง๋ง, HA ๊ตฌ์ฑ๋ง์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB ์๋ฒ ์ฌ์ด์ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๋ณด์๋ ์ฅ์ ๊ฐ ๋ฐ์ํ db001์ด ๋ง์คํฐ DB๋ก ์ค์ ๋์ด ์๋ค๋ฉด.. 2023. 11. 12. @Scheduled ์ฌ์ฉํ ๋ ์ค๋ ๋ ์ค์ ๊ฐ์ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ @Scheduled ์ด๋ ธํ ์ด์ ์ ๋ฉ์๋์ ์ค์ผ์ค๋ง ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก @Scheduled ์ด๋ ธํ ์ด์ ๋ง์ ์ฌ์ฉํ๋ฉด ์คํ๋ง์ ๋จ์ผ ์ค๋ ๋์์ ์ค์ผ์ค๋ง ์์ ๋ค์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ, ์ด๋ ํ๋์ ์ค์ผ์ค๋ง ์์ ์ด ์๋ฃ๋์ด์ผ๋ง ๋ค์ ์ค์ผ์ค๋ง ์์ ์ด ์คํ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ๋ถ๊ฐ์ ์ธ ์ค์ ์์ด ์ฌ๋ฌ ๊ฐ์ ์ค์ผ์ค๋ฌ๋ฅผ ์์ฑํ๋ฉด, ์ผ๋ถ ์์ ์ด ์์์น ๋ชปํ ์๊ฐ์ ๋์ํ ์ ์์ต๋๋ค. ์์ ์ํฉ์ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค. @Configuration @EnableScheduling public class ScheduledTasks { private final Logger log = LoggerFactory.getLogger(ScheduledTasks.c.. 2023. 11. 9. ์ด์ 1 2 3 4 5 6 ยทยทยท 13 ๋ค์