๐ Spring Framework59 [Spring Boot] Restclient & HttpInterface ์กฐํฉ ์ฌ์ฉ ์, ์์ฒญ ์๋ต์ Logging ํด๋ณด์ ๋ง์ Spring ๊ฐ๋ฐ์๋ค์ด RestClient ๋ฅผ ์ฌ์ฉํ๋ฉด์, Spring์ด API ํธ์ถ ๋๊ตฌ์ ๊ณตํต์ ์ ์ถ์ํํด์ ํ๋์ Adapter ์ธ Http Interface ์กฐํฉ์ ์ฌ์ฉํ๊ณ ์๋ ๋ฏ ํ๋ค. ์ฅ์ ์ ๋ฐ๋ณต๋๋ RestClient ์ ์ฒด์ด๋ ์ฝ๋๋ฅผ ๊ณตํตํ ํ ์ ์์ผ๋ฉฐ, Open feign ์ ์ฌ์ฉํ๋ฏ์ด Interface ํ๋๋ก ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค. ์๋น์ค ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ค๋ฉด, ์ข ๋ ๊ณ ๋ํ๋ฅผ ํด์ผํ์ง ์๊ฒ ๋๊ฐ.์ด์์์๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ด logging ์ด๋ค.๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒญ๊ณผ ์๋ต์ logging ํด๋๋ ํธ์ด trace ๋ฅผ ์ถ์ ํ๊ธฐ ํจ์ฌ ์์ํ ๊ฒ์ด๋ค. ํธ์ถํ๋ API ๊ฐ ๋ง์ ์๋ก configuration ํด์ผ ํ๋ rest client ์ Bean ๋ฑ๋ก ์ฝ๋๋ ๋ง์์ง ๊ฒ์ด๋ฏ.. 2025. 1. 6. Bean ๋ฑ๋ก์ ๋ํ ์ฌ๊ณ SpringBoot์์ Bean์ ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ด ์์๊น. 1. ํด๋์ค์ ์ง์ @Component ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์ 2. @Configuration ์ ๋ ธํ ์ด์ ์ ํ์ฉํด @Bean ๋ฑ๋กํ๋ ๋ฐฉ์ ์ 2๊ฐ์ง ๋ฐฉ์์ด ๋ณดํธ์ ์ด๋ค. ๋ด๊ฐ ์ง๊ธ๊น์ง ์งํํ๋ ๋ณดํต์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ณผ์ ์์๋ 1๋ฒ์ ์๋์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค. @Configuration ๋ฐฉ์์ ๊ฒฝ์ฐ, ํต์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํจ์ด๋ผ๋ฉฐ ๋ฉด์ ์ง๋ฌธ์์ ์ ์์ ์ผ๋ก ํ์๋๋ค. ๊ทธ ๊ณ ์ ๊ด๋ ํ์, ๋์ ๊ฒฝ์ฐ๋ 2๋ฒ ๋ฐฉ์์ ์ธ๋ถ ์ค์ ์ด์ธ์ ์ฌ์ฉํ์ง ์์์๋ค. Java9์์ ๋์จ, ์๋ก์ด ์ถ์ํ ๊ฐ๋ ์ธ ๋ชจ๋์ด๋ผ๋ ๊ฐ๋ ์ด ์๋ค. ๋ชจ๋์๋ ์ข ์์ฑ(dependency)์ ๊ฐ๋ ์ด ์์ผ๋ฉฐ, Public API๋ฅผ ๋ด๋ณด๋ด๊ณ .. 2024. 10. 12. Spring boot multi datasource ๋ฑ๋ก ์ ์ฃผ์ ์ฌํญ Spring Boot Multi datasource ๋ฑ๋ก ์ ์ฃผ์ ์ฌํญ์ต๊ทผ ์งํํ๋ ํ๋ก์ ํธ๋ ์ธ๋ถ ํด๋ฌด์ผ ์ ๋ณด API๋ฅผ ํธ์ถํ์ฌ DB์ ์ ์ฌํ๋ ์๋ฐฐ์น์ฉ Spring Batch ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๊ฒ์ด์๋ค.ํ์ฌ์๋ ์ฌ๋ฌ๊ฐ์ง DataBase๊ฐ ์๋๋ฐ, ๊ทธ ์ค ๋ฉ์ธ DB๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๊ณ , spring batch ์ฉ DB๋ ๋ฐ๋ก ์ฌ์ฉํ๊ฒ ๋์๋ค.๊ทธ๋์ ๋ฉํฐ datasource bean ์ ๋ฑ๋กํด์ค์ผ ํ๋ค.๊ทธ ๊ณผ์ ์์ ์ ๋ง ๊ธฐ์ด์ ์ด์ง๋ง ์ค์ํ๋ ๋ถ๋ถ์ ์ค๋ช ํด๋ณด๊ฒ ๋ค.Multi Datasourceํ๋์ ํ๋ก์ ํธ์์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ.spring ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก yaml ํ์ผ์ ํตํด ์ฝ๊ฒ datasource ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค.๋ฐ๋ก java ์ฝ๋๋ก bean ์ ๋ฑ๋กํ ํ์๊ฐ ์์ ๊ฒ์ด๋ค.ํ์ง.. 2024. 9. 18. Spring Cloud OpenFeign ๋ ์ ์ฌ์ฉํด๋ณด๊ธฐ ๋ง์ดํฌ๋ก ์๋น์ค์์,Spring Boot ๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋๋ฉด,์ธ๋ถ API ๋ฅผ ํธ์ถํด์ผ ํ๋ ์ํฉ์ด ์กด์ฌํ๋ค. Spring ํ๋ ์์ํฌ๊ฐ ์ง์ํ๋ ์ฌ๋ฌ ๊ฐ์ง Http Client ๊ฐ ์๋ค. RestTemplate ์ ๊ฒฝ์ฐ Blocking ๋ฐฉ์์ผ๋ก Http ์์ฒญ์ ์งํํ ์ ์๋ค.ํ๋์ ์์ฒญ์ ์ํด, ์ฝ๋๋ฅผ ์์ฑํ๋ ค๋ฉด,์ฌ์ฌ์ฉ์ฑ์ ๊ณ ๋ คํ๋ค ํ ๋, ์๋ ์์ ์ปดํฌ๋ํธ๋ก ์ถ์ํ๋ฅผ ๋ง์ด ์งํํ์ฌ ๋ฒ๊ฑฐ๋ก์ด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์ ์ด ์์๋ค.๋ฌด์๋ณด๋ค ์ด๋ ํ ์์ฒญ์ ํ๋์ง ํ๋์ ๋ค์ด์ค์ง ์์๋ค. WebClient ์ ๊ฒฝ์ฐ, Non-Blocking ๋ฐฉ์์ผ๋ก Http ์์ฒญ์ ์งํํ ์ ์๋ค.๋ฌผ๋ก Blocking call ๋ ๊ฐ๋ฅํ๋ค.๋น๋ ํจํด์ ํ์ฉํ ๋ฐฉ์์ผ๋ก, RestTemplate ๋ณด๋ค๋ ๊ฐ๋ ์ฑ์ด .. 2024. 5. 11. Spring Boot ์ ํ๋ฆฌ์ผ์ด์ k8s ํ๊ฒฝ์์ WarmUp ์ ์ฉํ๊ธฐ ์ด ๊ธ์ ์์ฑํ๋ ์ด์ ํ์ฌ ํ์ฌ์์๋ EKS ๊ธฐ๋ฐ k8s ํ๊ฒฝ์์ spring boot ๋ฅผ ํฌํจ ๊ฐ์ข ํ๋ ์์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ ์ค์ด๋ค. ๊ธฐ์กด ๋ชจ๋ ธ๋ฆฌ์ค Django Rest Framework ์์ ์ ์ง์ ์ผ๋ก ๋๋ฉ์ธ ๋ถ๋ฆฌ๋ฅผ Spring Boot ๋ฅผ ์ด์ฉํ Micro Service Application ์ผ๋ก ์งํ ์ค์ธ๋ฐ, ๋ด๊ฐ ๋งก์ ๊ฒฐ์ ๋๋ฉ์ธ ๊ด๋ จ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. (Kotlin ๊ธฐ๋ฐ Spring Boot App) ๋ฌธ์ ๋, ๊ฒฐ์ ๊ฐ ์ฃผ๋ฌธ ๋ฐ ์ ๊ด DB ์ ๋๋ฌด ๊ฐํ๊ฒ ์ฝํ ์์ด์ ๋ฐ๋ผ๋ณด์์ผ ํ๋ ํ ์ด๋ธ์ด ๋ง๋ค๋ ์ ์ด๊ณ , ์ด๊ฒ์ ๊ณง ๋ฐฐํฌ ์งํ ์๋์ ์ปค๋ค๋ ์ํฅ์ ๋ผ์ณค๋ค. JVM ์ ์ปดํ์ผ ๋ .class ํ์ผ์ ํ์ ์ ํด๋์ค ๋ก๋ฉ์ ํตํด ์ฌ์ฉํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก J.. 2024. 3. 17. OutBox Pattern ์ ํ์ฉํ ๋ฉ์ผ ์ ์ก ์๋น์ค ๊ฐ๋ฐ [At Least Once] ์คํ๋ง์์ ๋ฉ์ผ ์ ์ก์ ์ ๋ง ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค. JavaMailSender ๋ก ๋ง์ด์ผ. ๋จ์ํ, ๋ฉ์ผ๋ง ์ ์กํ๋ ํจ์๋ง ๊ตฌํํ๋ฉด ๋์ผ๊น? ๋ฌผ๋ก ์ํฉ์ ๋ฐ๋ผ ๊ฐ๋จํ ๊ตฌํ์ด๋, ๋ณต์กํ ๊ตฌํ์ด ๋๋ ์ ธ์ผ ํ๋ค. ์ค ์๋น์ค์์๋? ๋ฉ์ผ๋ก ์ ์กํด์ผ ํ๋ ๋ฐ์ดํฐ ์ค์๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง, ์๋ฌด๋๋ ๋ฉ์ผ์ ์์ ํ๋ ํด๋ผ์ด์ธํธ ์ ์ฅ์์๋ ์๋ฒ ์ฅ์ ๋๋ฌธ์, ๋ฉ์ผ ์์ ์ด ์ ๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋นํฉ์ค๋ฌ์ธ ๊ฒ์ด๋ค. ์ฆ, ์ ์ด๋ ํ๋ฒ ์ ์ก (At least once) ๋ฅผ ๋ง์กฑํ๋ Eventually Consistency ๋ฅผ ๊ตฌํํด์ผ ํ๋ ๊ฒ์ ๋ฉ์ผ ์ ์ก ์๋น์ค์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ค์ ธ์ผ ํ ์ฌํญ์ด๋ค. ์ผ๋ก๋ก, ๋ถ์ฐ ์๋ฒ ํ๊ฒฝ์์๋, ์๋ฆผ ์๋น์ค๋ง์ ๋ค๋ฃจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์กด์ฌํ๋๋ฐ, ์ด๋ outbox ํจํด์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉํ์ฌ ๊ตฌ.. 2023. 4. 20. [Spring data JPA] N+1 ๋ฌธ์ ํด๊ฒฐ ์ด๋ ๊ฒ ์ด๋ฃจ์ด์ง ERD ๋ชจ๋ธ์ด ์๋ค. (์์) ์กฐ๊ฑด์ ๋ง์ถฐ ๋ถ๋ฌ์ค๊ณ ์ ํ๋ Data๋ ์ธ ํ ์ด๋ธ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ํ์๋ก ํ๋ค. ์ด๋ Fetch join์ ๊ณ ๋ คํด๋ณผ ์ ์๋ค. Permission ์ ์ฅ์์ user์ document๋ฅผ ๋๋ฒ ๋ค fetch join ํ ์ ์์ง๋ง, ์ด๋ฅ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฑ๋ฅ ์ ์์ฒญ๋ ๋ฌธ์ ๊ฐ ์๋ค. ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ, ์ฐ๊ด๋ ์ํฐํฐ์ ์๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋๋ ์ ๋ฐ์์ํค๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ผ ๊ฒ์ด๋ค. ํด๋น ์ํฐํฐ๋ค์ ๋ชจ๋ FetchType.LAZY ๋ก ์ค์ ๋์ด ์๋ค. ๊ธฐ์กด ์ฟผ๋ฆฌ : val documents = documentQueryService.findDocumentsByIdFetchJoinPermissions(projectId) return Response.UserPe.. 2023. 2. 28. [Reactive Programming] ๋น๋๊ธฐ-๋ ผ๋ธ๋กํน ํ๋ก๊ทธ๋๋ฐ ๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ (Synchronous) ์์ ์ ์คํ ํ๋ฆ์ ์์ฐจ์ ์ผ๋ก ๋์ ์ฝ๋๋ฅผ ํ์ ํ๊ธฐ ์ฝ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฒ ์์ธก ๊ฐ๋ฅํ๋ฏ๋ก ๋๋ฒ๊น ์ด ์ฌ์ ํน์ ์์ ์ค ๋ค๋ฅธ ์์ ์ ํ ์ ์๋ค๋ ๋จ์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ (Asynchronous) ์์ ์ ์คํ ํ๋ฆ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฐจ์ ์ด์ง ์์ ํ์ฌ ์คํ ์ค์ธ ์์ ์ด์ธ์ ๋ค๋ฅธ ์์ ๊ฐ๋ฅ. ํด๋ผ์ด์ธํธ, ์๋ฒ ๋ฑ ๋ชจ๋ ํ๊ฒฝ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ ๋ํ์ ์ผ๋ก CallBack, Promise, Future, Coroutine ๋ฑ์ด ์๋ค. ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ตฌํ ๋ฐฉ์ - Kotlin Thread ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ๋ฐฉ์ Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ๊ตฌํ ํ๋์ ์ค๋ ๋ - ์ฑ๊ธ ์ค๋ ๋, ๋ค์ค ์ค๋ ๋ - ๋ฉํฐ์ค๋ ๋ fun main() { for (i in 0..5) { va.. 2023. 2. 11. [@DataJpaTest] h2 ์ธ๋ฉ๋ชจ๋ฆฌ db๋ฅผ ์ด์ฉํ ํ ์คํธ ์ค์ ๋ฐฉ๋ฒ ์๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค๊ณ ์ตํ ๋ค์๊ณ , ํ์์ ์ธ ์์ญ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ํญ์ ๋ง์ ์ ๊ธฐํ๊ณ ์๋ค. ๋ชจ๋ ์ผ์ด์ค๋ฅผ ํ ์คํธํ ์ด์ ๋ ์๊ธฐ ๋๋ฌธ์, ํฌ๊ฒ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ํ์ํ๋ค๊ณ ์๊ฐํ๋ ๋ถ๋ถ๋ง ์๋๋ฆฌ์ค, ํตํฉ, ๋จ์ ํ ์คํธ๋ฅผ ๋๋์ด ์งํํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ผ๊ณ ๋ค์๋ค. ๋ฐฐํฌ๋ฅผ ๊ณ์ ํด์ค๋ฉด์ jar ํ์ผ์ ๋น๋ํ๋ ๋์ค ํ ์คํธ๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๋ฌด์๋ฏธํ๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ํ ์คํธ๋ฅผ ์ด๋ค ํ๊ฒฝ์์๋ ๋์ ๊ฐ ์ ์๊ฒ ๊ณ ๋ฏผ์ ํ๋ ๊ธฐ์ต์ด ์๋ค. ์ด๋ ๊ฒ ํ๋ํ๋ ์์ฑ๋ ์๊ฒ ์์๋๊ฐ๋ ๊ณต๋ถ๋ฅผ ํ๋ ๊ฒ์ด ์๋๋ ๋๋ฆฌ์ง๋ง, ์ ์๋ฏธํ ๋ฐ์ ๊ณผ์ ์ด๋ผ ๋๋๋ค. ์ด๋ฒ์ ๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง์ ์ค์ํ๋ฉด์ ์ฝ๋ ์์ ๋ฐ ๊ตฌ์กฐ๊ฐ ํฌ๊ฒ ๊ฐํธ๋์๊ณ , ํ ์คํธ ์ฝ๋๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ง์ด ์๊ฒจ์ ๋ค ์์ ํ๋ค. persi.. 2022. 12. 21. [๋ฆฌํฉํ ๋ง] ๋๋ฉ์ธ ๋ชจ๋ธ ์ค์ฌ Clean Architecture ๋ก์ ๋ฆฌํฉํ ๋ง ํ๋ก์ ํธ๋ฅผ ์๋ ์์ด ๋ฆฌํฉํ ๋งํ๋ค. ๋ณด๋ค ๋ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ, ์ ์ง ๋ณด์๊ฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ, ๋ ์์ ๊ฐ์ฒด๋ฅผ ์ํ ์ฝ๋๋ฅผ ๊ณ์ํด์ ๊ณ ๋ฏผํ๊ณ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ค. ์ง๋ ๋ฌ๋ถํฐ ํด์ ์ํํธ ์จ์ด ์ํคํ ์ฒ์ ๊ดํด์ ๊ด์ฌ์ด ์๊ฒผ๋ค. ํด๋ฆฐ ์ฝ๋๋ฅผ ์ถ๊ตฌํ๋ค ๋ณด๋ ์์ฐ์ค๋ฝ๊ฒ ์ค๊ณ์ ๊ณ ๋ฏผ์ผ๋ก ๊ท๊ฒฐ๋์๋ค. ์ํฐ๋ ๋ฐฑ์๋ ์ฑ๋ฆฐ์ง๋ฅผ ํ๋ฉฐ ์๊ฒ๋ ํด๋ฆฐ ์ํคํ ์ฒ, ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ ์ฒ ์ ์ ๋ฌธ, ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ๋ก ์์ํ๋ ๋ง์ดํฌ๋ก ์๋น์ค๋ฅผ ์ฝ์ด๊ฐ๋ฉฐ, ๋ด๊ฐ ๊ตฌ์ฑํด์ค๋ ์ํํธ์จ์ด ์ค๊ณ์ ํฐ ์ ํ์ ์ ๋ง์ดํ๊ฒ ๋์๋ค. ๋จ์ํ ์์ ํ๋ก์ ํธ๋ง์ ๋ง๋๋๊ฒ ์๋ ๋ณธ ํ๋ก์ ํธ์ ์ด๋ฅผ ์ ์ฉ์์ผ๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. MSA ๋ ์ค๋ฒ ์์ง๋์ด๋ง์ด๋ผ ํ๋จํ๊ณ , ๋ชจ๋ ธ๋ฆฌ์ค ๊ตฌ์กฐ์ด์ง๋ง ์ต๋ํ ๋๋ฉ์ธ ๋ณ ๋ถ๋ฆฌ๊ฐ ๋ ์์ ๋ฐ์ด๋๋ ์ปจํ .. 2022. 12. 12. [์ด์] Pageable test ๊ด๋ จ ์๋ฌ ๐ก๋ฌธ์ API Controller๋ฅผ ํ ์คํธ ํ๋๋ฐ ์ ์ฑ๊ณตํ๋ ํ ์คํธ๊ฐ ๊ณ์ ์คํจํ๋ค. org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: No primary or single unique constructor found for interface org.springframework.data.domain.Pageable ํ ์คํธ ์ฝ๋ mockMvc.perform(get("/api/v2/users") .param("page", String.valueOf(page))) .andExpect(status().isOk()) .andE.. 2022. 11. 23. [Refactor] ํจํค์ง ๊ตฌ์กฐ์ ์์กด์ฑ ๋ ๋ฒ์งธ ํ๋ก์ ํธ์ ์ฝ๋ ์์ฑ์ด ๊ฑฐ์ ๋๋ฌ๊ณ , ํ ์คํธ ์ฝ๋ ์์ฑ์ ์๋๋ฉฐ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋ค. ๊ฐ์ฅ ํฐ ๊ณจ์๋ ์๋ฌด๋๋ ์ฐธ์กฐ ๊ด๊ณ์ด๋ค. ํจํค์ง ๊ตฌ์กฐ๋ฅผ Layered์์ ์ฝ๊ฐ์ DDD(์ ๋งคํ์ง๋ง ใ ใ ) ๋ฅผ ๊ณ๋ค์ธ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ ๊ณผ์ ์์ ํจํค์ง ๊ฐ ์์กด์ฑ์ ๋ํด์ ๊ณ ๋ฏผํด๋ณด๊ณ ์๋ช ํ๋ ๊ฒ๊ณผ ์ค๊ณํ๋ ์๊ฐ์ด ์ ๋ง ์ค๋ ๊ฑธ๋ ธ๋ค. ์ฝ๋ฉ์ ๊ณต๋ถํ๋ฉด ํ ์๋ก ์์ ๊ฒ์ ์๊ฐ์ ์ค๋ ๋ค์ด๊ฒ ๋๋ ๊ฑธ ๋๋๋ค. ์ด์ ๋ ํจํค์ง ์ด๋ฆ์ ์ง๋๋ฐ ๋ฐ๋์ ์ด ๊ฑธ๋ ธ๋ค. ํ์ฌ์์๋ ๋ณ์๋ช ์ง๋ ๊ฑธ๋ก๋ ํ์๋ฅผ ํ๋ค๊ณ ํ๋ ์ฝ๊ฐ ์ค๊ฐ์ด ๋๊ธฐ๋ ํ๋ค. ์ด๋ ๊ฒ ๋ํ ์ผํ๊ฒ ์ฑ์๋๊ฐ๋ฉด ๊ทธ ๋งํผ ๋ด ์ค๋ ฅ์ด ๋๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ต์์ ๊ตฌ์กฐ auth : ์ธ์ฆ, ์ธ๊ฐ ์ฒ๋ฆฌ ์คํ๋ง ์ํ๋ฆฌํฐ ์ด์ฉ ์คํ๋ง ์ปจํ ์ด๋๊น์ง ๋๋ฌํ์ง ์๋ ํํฐ ์์ฃผ์ด๊ธฐ ๋๋ฌธ์ .. 2022. 10. 14. [Redisson] ํธ๋์ญ์ ๋ฌธ์ ๋ฐ์ ๋ฐ ํด๊ฒฐ ์ง๋ ํฌ์คํธ [Redisson]์ ์ด์ฉํ ๋ถ์ฐ Lock ๊ตฌํ & ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ ๋ด ํ๋ก์ ํธ์ Payment๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ๊ฐ์ฅ ๊ธฐ๋ณธ ์ค์ ๊ธฐ๋ณธ์ด ๋๋ ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ์๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก ๋์์ฑ ๋ฌธ์ ! ์คํ๋ง๋ถํธ์ ๋ด์ฅ ์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํฐ์บฃ, ์ธ๋ํ ์ฐ ๋ฑ๋ฑ์ WAS๋ก ๋์๊ฐ๋๋ฐ ์ด sweeeetgoguma.tistory.com ์ง๋ ํฌ์คํธ์์ Redisson์ ์ด์ฉํ์ฌ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ค. ํ๋ก์ ํธ ๋ฆฌํฉํ ๋ง์ด ๊ฑฐ์ ๋๋๊ฐ ์กฐํ API๋ฅผ ๊ตฌ์ฒดํํ์ฌ ๋ช ๊ฐ ์ถ๊ฐํ๋ ๋์ค, ์ค๋ ๋ 100๊ฐ์ ๋์ ์์ฒญ์ ์ง์ ์ ์ผ๋ก ๋ฐ๋ ๊ณผ์ ์ ํ์ธํ๊ณ ์ถ์ด์ก๋ค. ๊ทธ๋์ ์คํํด๋ดค๋ค. ๊ฒฐ๊ณผ๋?? ์ฒ์ฐธํ๋ค.. ๋ฌด์์ด ๋ฌธ์ ์์๊น ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ์นํ๋ค. @GetMapping("/test") public void t.. 2022. 10. 1. [Redisson]์ ์ด์ฉํ ๋ถ์ฐ Lock ๊ตฌํ & ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ ๋ด ํ๋ก์ ํธ์ Payment๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ๊ฐ์ฅ ๊ธฐ๋ณธ ์ค์ ๊ธฐ๋ณธ์ด ๋๋ ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ์๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก ๋์์ฑ ๋ฌธ์ ! ์คํ๋ง๋ถํธ์ ๋ด์ฅ ์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํฐ์บฃ, ์ธ๋ํ ์ฐ ๋ฑ๋ฑ์ WAS๋ก ๋์๊ฐ๋๋ฐ ์ด WAS๋ ๋ฉํฐ์ค๋ ๋ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค. A๋ผ๋ ์ํ (์ฌ๊ณ 3๊ฐ) ์ [๊ฐ]๊ตฐ์ด 2๊ฐ ๊ตฌ๋งคํ๋ ค ํ๋ค. ๋์์ [๋]๊ตฐ์ด 2๊ฐ ๊ตฌ๋งคํ๋ ค ํ๋ค. ๋ฏธ์ธํ๊ฒ ๋๋ง 0.00001์ด์ ์ฐจ์ด๊ฐ ์์ ์ ์๋ค. ๊ฒฐ๊ตญ ๊ฐ๊ฐ์ ์ค๋ ๋๊ฐ ๊ฐ์ ์ํ์ ์ฌ๊ณ ๋ฅผ ์กฐํํ๋ค. ์๋๋๋ก๋ผ๋ฉด ํ ๋ช ์ ๋ชป ์ฌ์ผ ์ ์์ด๋ค. ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ๋ญ๊ฐ ์์๊น? 1. Synchronized ์๋ฐ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. Thread-Safe ํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ข์๋ณด์ด๋, ์๋ฒ๊ฐ ์ฆ์ค๋ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ์์ด์ง๋ค. 2. Database Lock D.. 2022. 9. 27. ๊ฒฐ์ API ๋ฆฌํฉํ ๋ง - [2] (feat. WebClient) https://sweeeetgoguma.tistory.com/entry/%EA%B2%B0%EC%A0%9C-API-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81-1-feat-%EC%A0%84%EB%9E%B5-%ED%8C%A8%ED%84%B ๊ฒฐ์ API ๋ฆฌํฉํ ๋ง - [1] (feat. ์ ๋ต ํจํด) ๊ฒฐ์ API๋ฅผ ๋ฆฌํฉํ ๋ง ์์ํ๋ฉฐ ์ธ๋ถ API๋ฅผ ์ฐ๋ ๋ถ๋ถ์ ๋ํด์ ์๊ฐํด๋ดค๋ค. ๊ธฐ์กด์๋ ์นด์นด์คํ์ด๋ฅผ ์ด์ฉํ์๊ณ , ์ง๊ธ๋ ์นด์นด์คํ์ด๋ฅผ ์ด์ฉํ ๊ฒ์ด์ง๋ง, ์ถ๊ฐ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒฐ์ API๋ฅผ ์ฐ๋ํ ์ ์ sweeeetgoguma.tistory.com ์ง๋ ํฌ์คํ ์ ์ด์ด์ ์์ฑํ๊ฒ ์ต๋๋ค~ ์ค์ ๊ฒฐ์ API๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ httpClient ๊ธฐ๋ฐ์ ๋ชจ๋์ด ํ์ํ๋ค. ๊ธฐ์กด์๋ ๋๊ธฐ๋ฐฉ์, ๋ฉํฐ์ค๋ ๋๋ฅผ ์ด์ฉ.. 2022. 9. 22. ์ด์ 1 2 3 4 ๋ค์ ๋ฐ์ํ