๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“• 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.
๋ฐ˜์‘ํ˜•