BackEnd๐ฑ/Spring37 ThreadPoolExecutor ๋์์ ๊ดํ ์คํด ๊ฐ์ Java์์ ์ค๋ ๋ํ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ThreadPoolExecutor, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋์ฑ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก Spring์์ ์ ๊ณตํ๋ ThreadPoolTaskExecutor์ ๋์ ๋ฐฉ์์ ๊ดํด ์ ๊ฐ ๊ทธ๋์ ์๋ชป ์ดํดํ๊ณ ์์๋ ๋ ๊ฐ์ง์ ์คํด๋ฅผ ์ ๋ฆฌํ๊ณ ์ ๊ธ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค. ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ณ๋์ ์ค์ ์ ํ์ง ์์ผ๋ฉด ์๋ฒ ์คํ ์์ ์ง์ ํ ์ค๋ ๋ ํ ํฌ๊ธฐ๋งํผ ์ค๋ ๋๊ฐ ์๋์ผ๋ก ์์ฑ๋์ง ์๋๋ค. corePoolSize์ maxPoolSize๋ ์๋ก ์๊ด์๋ค. ํ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ฃผ์ง ์์ผ๋ฉด maxPoolSize์ ์ฌ์ค์ ์๋ฏธ ์๋ ์ค์ ์ด๋ค. corePoolSizeํฌ๊ธฐ ์ด์์ ์์ฒญ์ด ๋ค์ด์จ๋ค๊ณ ํด์ maxPoolSize๋งํผ ์ค๋ ๋๋ฅผ ์์ฑํ์ง ์๋๋ค. https:.. 2024. 3. 11. MySQL ๋ฒ์ ์ ๋ฐ๋ฅธ @Transactional(readOnly=true)์ ๋์ ๊ณผ์ ๊ฐ์ ์ด ๊ธ์ ํํ๋์ ๋ธ๋ก๊ทธ ๊ฒ์๊ธ์์ ์๊ฐ์ ๋ฐ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ํตํด RDBMS๋ฅผ ํ์ฉํ๋ ๊ณผ์ ์์, ์ฐ๋ฆฌ๋ ์ฑ๋ฅ ์ต์ ํ, ๊ฐ๋ ์ฑ ํฅ์, ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง ๋ฑ ์ฌ๋ฌ ์ด์ ๋ก ๋น์ฆ๋์ค ๋ก์ง์ @Transactional(readOnly=true) ์ด๋ ธํ ์ด์ ์ ์์ฃผ ์ฌ์ฉํ๊ณค ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์ด๋ ธํ ์ด์ ์ ์ด๋ ํ ์๋ฆฌ๋ก ๋์ํ๋ ๊ฒ์ผ๊น์? ์ด๋ฒ ๊ธ์์๋ @Transactional(readOnly=true)์ JDBC ๋จ๊ณ์์์ ๋์ ๊ณผ์ ์ ์์ฃผ๋ก ์ดํด๋ณด๋ ค ํฉ๋๋ค. ๋์ ๊ณผ์ ๋น์ฆ๋์ค ๋ก์ง์ @Transactional(readOnly=true)์ ๊ฑธ๊ณ ์คํํ๋ ๊ฒฝ์ฐ ๋์ํ๋ ์ ์ฒด์ ์ธ ๊ณผ์ ์ ์๋์ ๊ฐ์ต๋๋ค. ํธ๋์ญ์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค๋น ์ฝ๊ธฐ ์ ์ฉ ์ํ ์ ํ ๋น์ฆ๋์ค.. 2024. 1. 24. Hibernate์ @Formula๋ฅผ ์ด์ฉํ ์ฐ๊ด ๊ด๊ณ ์ํฐํฐ ์ง๊ณ ๊ฐ์ Hibernate์ @Formula ์ด๋ ธํ ์ด์ ์ ์ํฐํฐ ํด๋์ค ๋ด์์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ์กด์ฌํ์ง ์๋ '๊ฐ์ ์ปฌ๋ผ'์ ์ ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. @Formula๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ปฌ๋ผ๋ค์ ๊ฐ์ ๊ธฐ๋ฐํ์ฌ ๊ณ์ฐ๋ ๊ฐ์ ํํํ ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋๋ง ๊ณ์ฐ๋์ด ์ฌ์ฉ๋ฉ๋๋ค. ์์ ์ฝ๋ @Formula ์ด๋ ธํ ์ด์ ์ ์ ํ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์ฐ๊ด๋ ๋ฐ์ดํฐ์ ์ง๊ณ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์๊ธ๊ณผ ์ฐ๊ฒฐ๋ ๋๊ธ์ ์๋ฅผ ๊ณ์ฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ ์์ต๋๋ค. ์๋๋ ๊ฐ๋จํ ์์ ์ฝ๋์ ๋๋ค. ์ ์ฒด ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) pri.. 2023. 12. 20. 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. @Scheduled ์ฌ์ฉํ ๋ ์ค๋ ๋ ์ค์ ๊ฐ์ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ @Scheduled ์ด๋ ธํ ์ด์ ์ ๋ฉ์๋์ ์ค์ผ์ค๋ง ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก @Scheduled ์ด๋ ธํ ์ด์ ๋ง์ ์ฌ์ฉํ๋ฉด ์คํ๋ง์ ๋จ์ผ ์ค๋ ๋์์ ์ค์ผ์ค๋ง ์์ ๋ค์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ฐ, ์ด๋ ํ๋์ ์ค์ผ์ค๋ง ์์ ์ด ์๋ฃ๋์ด์ผ๋ง ๋ค์ ์ค์ผ์ค๋ง ์์ ์ด ์คํ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ๋ถ๊ฐ์ ์ธ ์ค์ ์์ด ์ฌ๋ฌ ๊ฐ์ ์ค์ผ์ค๋ฌ๋ฅผ ์์ฑํ๋ฉด, ์ผ๋ถ ์์ ์ด ์์์น ๋ชปํ ์๊ฐ์ ๋์ํ ์ ์์ต๋๋ค. ์์ ์ํฉ์ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค. @Configuration @EnableScheduling public class ScheduledTasks { private final Logger log = LoggerFactory.getLogger(ScheduledTasks.c.. 2023. 11. 9. ArchUnit์ผ๋ก ์ํคํ ์ฒ ๊ฒ์ฌํ๊ธฐ ๊ฐ์ ArchUnit์ Java ์ฝ๋์ ์ํคํ ์ฒ๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํ ๊ฐ๊ฒฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ArchUnit์ Java์ ๊ธฐ๋ณธ ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ์ฌ, ์ฃผ์ด์ง Java ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๋ชจ๋ ํด๋์ค์ ๊ตฌ์กฐ๋ฅผ ํด์ํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํคํ ์ฒ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ํ ์คํธํ ์ ์๊ฒ ํด ์ค๋๋ค. ํจํค์ง ๋ฐ ํด๋์ค ์์กด์ฑ ๊ฒ์ฌ: ํจํค์ง์ ํด๋์ค ๊ฐ์ ์์กด ๊ด๊ณ๋ฅผ ๋ถ์ํ๊ณ , ๊ฒฉ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋์ง ํ์ธ ์์ ๊ด๊ณ ๋ฐ ์ํ ์ฐธ์กฐ ๊ฒ์ฌ: ํด๋์ค ๊ฐ์ ์์ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ๊ณ , ์ํ ์ฐธ์กฐ๊ฐ ์๋์ง ๊ฒ์ฌ ๋ ์ด์ด ์ํคํ ์ฒ ๊ฒ์ฌ: ๋ ์ด์ด ๊ฐ์ ์์กด์ฑ์ ๊ฒ์ฌํ์ฌ, ๋ช ํํ๊ณ ๊ฒฌ๊ณ ํ ๋ ์ด์ด ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋์ง ํ์ธ ์ฝ๋ฉ ์ปจ๋ฒค์ ๊ฒ์ฌ: ์ฌ์ฉ์๊ฐ ์ ์ํ ์ฝ๋ฉ ๊ท์น์ ๊ฒ์ฌํ์ฌ, ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ์ ์งํ๋.. 2023. 10. 28. LocalStack์ ํ์ฉํ AWS S3 ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ ๊ฐ์ ์ด๋ฒ ๊ธ์์๋ ์ด์ ๊ฒ์๊ธ 'TestContainer๋ก ํตํฉ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ'์ ์ฐ์ฅ์ ์ผ๋ก, LocalStack์ ์ด์ฉํ์ฌ AWS์ S3 ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๊ด๋ จ ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค. LocalStack์ด๋? LocalStack์ AWS์ ๋ค์ํ ์๋น์ค๋ค์ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋ชจ๋ฐฉํ์ฌ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์คํ์์ค์ ๋๋ค. ์ด๋ฅผ ํ์ฉํ๋ฉด, AWS์ ์ฃผ์ ์๋น์ค๋ค์ ์ค์ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ด ์๋ ๋ก์ปฌ์์ ์๋ฎฌ๋ ์ด์ ํ๋ฉฐ ๊ฐ๋ฐ ๋ฐ ํ ์คํธ๋ฅผ ํ ์ ์์ต๋๋ค. LocalStack์ AWS์ ๋ค์ํ ์๋น์ค, ํนํ S3, Lambda, DynamoDB, API Gateway, Kinesis, SQS ๋ฑ์ ์ฃผ์ ์๋น์ค๋ค์ ์ง์ํ๋ฉฐ, Docker ํ๊ฒฝ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ .. 2023. 10. 22. ์ด์ 1 2 3 4 5 ๋ค์