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

๐Ÿ“• Spring Framework/Spring Project45

OutBox Pattern ์„ ํ™œ์šฉํ•œ ๋ฉ”์ผ ์ „์†ก ์„œ๋น„์Šค ๊ฐœ๋ฐœ [At Least Once] ์Šคํ”„๋ง์—์„œ ๋ฉ”์ผ ์ „์†ก์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. JavaMailSender ๋กœ ๋ง์ด์•ผ. ๋‹จ์ˆœํžˆ, ๋ฉ”์ผ๋งŒ ์ „์†กํ•˜๋Š” ํ•จ์ˆ˜๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋์ผ๊นŒ? ๋ฌผ๋ก  ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์ด๋‚˜, ๋ณต์žกํ•œ ๊ตฌํ˜„์ด ๋‚˜๋ˆ ์ ธ์•ผ ํ•œ๋‹ค. ์‹ค ์„œ๋น„์Šค์—์„œ๋Š”? ๋ฉ”์ผ๋กœ ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ค‘์š”๋„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ, ์•„๋ฌด๋ž˜๋„ ๋ฉ”์ผ์„ ์ˆ˜์‹ ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋Š” ์„œ๋ฒ„ ์žฅ์•  ๋•Œ๋ฌธ์—, ๋ฉ”์ผ ์ˆ˜์‹ ์ด ์•ˆ ๋  ๊ฒฝ์šฐ ๋งค์šฐ ๋‹นํ™ฉ์Šค๋Ÿฌ์šธ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์ ์–ด๋„ ํ•œ๋ฒˆ ์ „์†ก (At least once) ๋ฅผ ๋งŒ์กฑํ•˜๋Š” Eventually Consistency ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”์ผ ์ „์†ก ์„œ๋น„์Šค์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ค„์ ธ์•ผ ํ•  ์‚ฌํ•ญ์ด๋‹ค. ์ผ๋ก€๋กœ, ๋ถ„์‚ฐ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š”, ์•Œ๋ฆผ ์„œ๋น„์Šค๋งŒ์„ ๋‹ค๋ฃจ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋•Œ outbox ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ.. 2023. 4. 20.
[๋ฆฌํŒฉํ† ๋ง] ๋„๋ฉ”์ธ ๋ชจ๋ธ ์ค‘์‹ฌ 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.
๊ฒฐ์ œ API ๋ฆฌํŒฉํ† ๋ง - [1] (feat. ์ „๋žต ํŒจํ„ด) ๊ฒฐ์ œ API๋ฅผ ๋ฆฌํŒฉํ† ๋ง ์‹œ์ž‘ํ•˜๋ฉฐ ์™ธ๋ถ€ API๋ฅผ ์—ฐ๋™ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ดค๋‹ค. ๊ธฐ์กด์—๋„ ์นด์นด์˜คํŽ˜์ด๋ฅผ ์ด์šฉํ–ˆ์—ˆ๊ณ , ์ง€๊ธˆ๋„ ์นด์นด์˜คํŽ˜์ด๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด์ง€๋งŒ, ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒฐ์ œ API๋ฅผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํ•œ ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ดค๋‹ค. ์Šคํ”„๋ง์„ ์ฒ˜์Œ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ์ฝ์—ˆ๋˜ ์ฑ…์ธ ๊ฐœ๊ตฌ๋ฆฌ (์Šคํ”„๋ง ์ž…๋ฌธ์„ ์œ„ํ•œ ๋ญ์‹œ๊ธฐ..) ์ฑ…์—์„œ ์Šคํ”„๋ง์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋””์ž์ธ ํŒจํ„ด๋“ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋ž€ ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ์ด ์ž˜ ์˜ค์ง€ ์•Š์•˜๋Š”๋ฐ, ์ง์ ‘ ์ ์šฉํ•  ๊ธฐํšŒ์™€ ์ƒํ™ฉ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณธ๋‹ค. ๊ณ„์† ๋ฉด์ ‘ ์งˆ๋ฌธ ๋Œ€๋น„ํ•ด ์•ต๋ฌด์ƒˆ์ฒ˜๋Ÿผ ๋‹ฌ๋‹ฌ ์™ธ์šฐ๊ณ  ๋‹ค๋‹ˆ๋˜ ๋„์ค‘ ์ง์ ‘ ์ ์šฉํ•  ๊ธฐํšŒ๊ฐ€ ๋”ฑ ์ƒ๊ฒผ๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋ฐœ 2์›์น™์ธ OCP์— ์ฐฐ๋–ก์ผ ๊ฒƒ์ด๋ผ๋Š” ๋จธ๋ฆฌ ์†์˜ ์™ธ์นจ์ด ์šธ๋ ธ๋‹ค. ๊ทธ๋Œ€๋กœ ์ ์šฉํ•ด๋ณด์•˜๋‹ค. ๊ธฐ์กด ํ”Œ๋กœ์šฐ ์ปจํŠธ๋กค๋Ÿฌ ์„œ๋น„์Šค(์นด์นด.. 2022. 9. 20.
๋™์‹œ์„ฑ ์กฐํšŒ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์„ฑ๋Šฅ์— ๊ด€ํ•œ ๊ณ ๋ฏผ [Lock, Queue, Redis] ์ฃผ๋ฌธ ๊ฑด์— ๋Œ€ํ•œ ์ƒํ’ˆ ์žฌ๊ณ  ํŒŒ์•… ๋™์‹œ์„ฑ ๊ด€๋ จ ์ด์Šˆ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•œ ํ•˜๋ฃจ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฆฌํŒฉํ† ๋ง์„ ์‹œ์ž‘ํ•˜๋ฉฐ ์ง€๋‚œ ๋„๋ฉ”์ธ๋“ค์€ ๊ธฐ๋ณธ crud API๋งŒ์„ ๋‹ค๋ฃจ์—ˆ๋‹ค. 5์ผ๋™์•ˆ JPA ๊ฐ•์˜๋“ค์„ ์ˆ˜๊ฐ•ํ•˜๋ฉฐ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฃผ๋ฌธ ๋ฐ ๊ฒฐ์ œ API ๋ฆฌํŒฉํ† ๋ง์— ๋‹ค์‹œ ์ฐฉ์ˆ˜ํ–ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ํ”„๋กœ์ ํŠธ์˜ ํ† ํ”ฝ์ด ์‡ผํ•‘๋ชฐ์ด๋‹ˆ ์ฃผ๋ฌธ ๋ฐ ๊ฒฐ์ œ ํŒŒํŠธ์—์„œ ๋‹จ์ˆœ CRUD๊ฐ€ ์•„๋‹Œ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์–ด, ์™ธ๋ถ€ ๊ฒฐ์ œ API ๋ฐ ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•œ ๊น”๋”ํ•œ ์ฝ”๋“œ๋“ค์„ ๊ณ ๋ คํ•˜๋ฉฐ ์ž‘์„ฑํ•˜๋Š” ์ค‘์ด๋‹ค. ๋Œ€๋žต์ ์ธ ํ‹€์„ ๋งŒ๋“  ๋’ค, ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฃผ๋ฌธ์„ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, ๋™์‹œ์„ฑ ์ด์Šˆ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ๋‹ค. ๊ธฐ์กด ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• MSA๋ฅผ ๊ณ ๋ คํ–ˆ๊ธฐ์—, ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Outbox pattern์„ ์ด์šฉ์ค‘์ด์—ˆ๋‹ค. ์ด ๋ฐฉ์‹์„ ํ†ตํ•ด ์ƒํ’ˆ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์—ˆ๋‹ค. .. 2022. 9. 14.
๊ฐ์ฒด ๊ฐ„ ๋งคํ•‘์„ ์œ„ํ•œ MapStruct ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—์„œ Dto Entity๋ฅผ ๋งคํ•‘ํ•  ๋•Œ model mapper ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ ์ƒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋งŽ์ด๋“ค ์ถ”์ฒœํ•˜๋Š” Map Struct๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋‹ค. ์ ์šฉํ•˜๋ฉด์„œ ์ž์ž˜ํ•œ ๋ฌธ์ œ๋“ค์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ๊ฒช์€ ๋ฌธ์ œ์ ๋“ค์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค. https://mapstruct.org/documentation/dev/reference/html/ MapStruct 1.5.2.Final Reference Guide If set to true, MapStruct in which MapStruct logs its major decisions. Note, at the moment of writing in Maven, al.. 2022. 8. 29.
DB ์ˆ˜์ • & jpa ์„ธํŒ… ํ”„๋กœ์ ํŠธ์˜ ์ „๋ฐ˜์ ์ธ ๋ฆฌํŒฉํ„ฐ๋ง์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉฐ, ๊ธฐ์กด mybatis๋ฅผ ์ด์šฉํ–ˆ๋˜ ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ฒจ์™”๋‹ค. ํ•˜์ง€๋งŒ SQL Mapper๋ฅผ ์ด์šฉํ•œ ์„ค๊ณ„ ํŠน์„ฑ์ƒ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ์˜ ์ž‘์„ฑ์ด ์–ด๋ ค์› ๊ณ , ๋˜ ๊ธฐ์กด DB ์„ค๊ณ„์˜ ๋ฌธ์ œ๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. DB์˜ ์ „๋ฐ˜์ ์ธ ์ˆ˜์ •๊ณผ ๋”๋ถˆ์–ด, JPA๋ฅผ ์ด์šฉํ•ด ๋‹ค์‹œ ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•ด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ ธ๋‹ค. ๊ทธ ์ˆ˜์ •๊ณผ์ •๊ณผ JPA ์„ธํŒ… ๋ฐฉ๋ฒ•์„ ๋‚˜์—ดํ•ด๋ณด๊ฒ ๋‹ค. https://github.com/GroovyArea/My-ChickenBreast-Shop GitHub - GroovyArea/My-ChickenBreast-Shop: shop api with spring boot shop api with spring boot . Contribute to GroovyArea/My-ChickenB.. 2022. 8. 8.
์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง [1] ์ง€๋‚œ 1์ฃผ์ผ๊ฐ„ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜ ๋ถ€๋ถ„ ์„ค๊ณ„๋ฅผ ๊ฑฐ์˜ 2, 3์ผ์€ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์•„์ง ์ˆ˜์ •์ด ํ•„์š”ํ•˜๊ฒ ์ง€๋งŒ, ํ•ญ์ƒ ๊ณ ๋ฏผํ•ด๋ณด์ž. ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋Š” multi module๋กœ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ, ์™„๋ฒฝํ•œ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ์ด์ง„ ์•Š์•˜๋‹ค. ๋ชจ๋†€๋ฆฌํ‹ฑ์œผ๋กœ ๊ฐˆ์ง€, MSA๋ฅผ ๊ณ ๋ คํ•ด ๋ชจ๋“ˆ๊ฐ„ ๋ถ„๋ฆฌ๋ฅผ ํ• ์ง€๊ฐ€ ๊ณ„์† ๊ณ ๋ฏผ๋œ๋‹ค.. ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ๋ชจ๋“ˆ, ํŒจํ‚ค์ง€๊ฐ„ ์˜์กด์„ฑ ๋ถ„๋ฆฌ๋ฅผ ํ‹ˆํ‹ˆ์ด ๊ณ ๋ คํ•ด๋ด์•ผ๊ฒ ๋‹ค. ๊ธฐ์กด ์ž‘์„ฑ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ธฐ๋ฉฐ ์กฐ๊ธˆ ๋” ํด๋ฆฐํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฆฌ๋ทฐ์–ด๋‹˜์˜ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ์ˆ˜์ •ํ•ด๋‚˜๊ฐ”๋‹ค. ๋งŽ์ด ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋ถ€๋ถ„์—์„œ๋„ ํ—›์ ์ด ์žˆ์—ˆ๊ณ , ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„๋„ ์•Œ์•„๋‚˜๊ฐ€๋Š” ์ค‘์ด๋‹ค. ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ๋ถ€๋ถ„์€ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์†์ˆ˜ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” Spring Security.. 2022. 8. 3.
๋ฆฌํŒฉํ† ๋ง ๊ณ„ํš ์˜ค๋žœ๋งŒ์— ๋ธ”๋กœ๊ทธ์— ๊ธ€์„ ์“ด๋‹ค. ์ง€๋‚œ ๋ฉฐ์น  ๋™์•ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด AWS ๋ง๊ตฌ์„ฑ์„ ํ•˜๊ณ , ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋ฉฐ ๋ฐฐํฌ๊นŒ์ง€ ์‹œ์ผฐ๋‹ค. ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์•ž๋‘๊ณ , ์ข‹์€ ๊ธฐํšŒ๋ฅผ ์–ป์–ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ฒฐ๋ก ์€, ์ด ์ƒํƒœ๋กœ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์—†์„ ์ •๋„๋กœ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ ์•„์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ ๋ถ€๋ถ„๋„ ๋งŽ์•˜๊ณ , ๊ถ๊ธˆ์ฆ๋„ ๋งŽ์•˜์ง€๋งŒ, ๋‚˜๋จธ์ง€ ์ฃผ๊ด€์ ์ธ ํŒ๋‹จํ•˜์— ๊น”๋”ํ•œ ๋ถ€๋ถ„์€ ๋‚˜๋ฆ„ ๊ดœ์ฐฎ๊ฒŒ ์ž‘์„ฑ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ์•„์ง ๊ณ ์น ๊ฒŒ ๋งŽ์•˜๊ณ , ๋ฐฐ์šธ๊ฒŒ ๋งŽ์•˜๊ณ , ๋ชฐ๋ž๋˜ ๊ฒƒ์ด ๋งŽ์€ ๋‚˜์˜€๋‹ค. ์ด๋Ÿฐ ๋ฆฌ๋ทฐ๋ฅผ ๋“ค์„ ๋•Œ๋งˆ๋‹ค ๋‚˜๋Š” ์•„์ง ํ•œ์ฐธ ๋ฉ€์—ˆ๊ตฌ๋‚˜. ๊ณต๋ถ€ ๊ธฐ๊ฐ„ ๋Œ€๋น„ ๋งŽ์€ ์„ฑ์žฅ์„ ๊ฑฐ๋‘์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ์š•์‹ฌ์ด ๋งŽ์€ ๊ฑด์ง€. ์‚ฌ์‹ค์€ ๊ธฐ๊ฐ„ ๋Œ€๋น„ ์„ฑ์žฅ์น˜๊ฐ€ ํ‰๊ท ์น˜์˜€๋˜ ๊ฑด์ง€. ๋ฌด๊ธฐ ํ•ด์ง„๋‹ค. ๋„ˆ๋ฌด ๊ธ‰ํ•œ๊ฐ€? ๊ทธ๋Ÿผ์—๋„.. 2022. 7. 28.
๋ฆฌํŒฉํ„ฐ๋ง ใ€ŒAuthentication(์ธ์ฆ)ใ€ ํƒœ์–ด๋‚˜์„œ ์ฒ˜์Œ ํšŒ์‚ฌ์— ์ง€์›ํ–ˆ๋‹ค. ์„œ๋ฅ˜๋ฅผ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ ๋„ฃ์—ˆ๋‹ค. ๋ฒŒ์จ ์„œ๋ฅ˜ ํƒˆ๋ฝ๋งŒ 3๋ฒˆ์งธ์ด๋‹ค. ์„œ๋ฅ˜ ํƒˆ๋ฝ์ด ์ด๋Ÿฐ ๊ธฐ๋ถ„์ด๊ตฌ๋‚˜...ใ…Žใ…Ž ํšŒ์‚ฌ ๊ธฐ์ค€์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋Š” ๋‚ด ์‹ค๋ ฅ๊ณผ ๊ฒฐ๊ณผ๋ฌผ ํƒ“์ด์ง€ ๋ญ. ๋” ์—ด์‹ฌํžˆ ๋‹ค๋“ฌ์–ด์•ผ๊ฒ ๋‹ค. ์„œ๋ฅ˜๋ฅผ ๋‹ค๋“ฌ๋‹ค๊ฐ€ ์ธ์ฆ๊ณผ ์ธ๊ฐ€ ๊ตฌํ˜„ ์ค‘ ์ด์Šˆ๋ฅผ ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€๋ถ„์ด ๋ˆˆ์— ๋„์—ˆ๋‹ค. ์ธ์ฆ๊ณผ ์ธ๊ฐ€... ์Œ... ์ธ๊ฐ€๋Š” ์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ์ธํ„ฐ์…‰ํ„ฐ๋กœ ๊ตฌํ˜„ํ•œ ๋ช…ํ™•ํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ธ์ฆ์€ ์ข€ ์• ๋งคํ–ˆ๋‹ค. JWT ํ† ํฐ์„ ์ธ์ฆํ•˜๋Š” ๋ถ€๋ถ„์€ ๊ตณ์ด ์ธํ„ฐ์…‰ํ„ฐ๊นŒ์ง€ ๋„๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ธ์ฆ ์ž‘์—…์„ ์ธํ„ฐ์…‰ํ„ฐ์—์„œ ํ•„ํ„ฐ๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ํ•„ํ„ฐ(Filter)๋ž€? HTTP ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฑฐ๋ฅธ ๋’ค ์ •์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. Servlet Container ๋‹จ์—์„œ ๋™์ž‘ํ•œ๋‹ค. ์Šคํ”„๋ง ๋ฒ”์œ„ ๋ฐ–์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค. Dispathcer.. 2022. 7. 11.
์Šคํ”„๋ง ๋ถ€ํŠธ ์†Œ๋‚˜ํ๋ธŒ(SonarQube) ์ ์šฉ + PostgreSql ๊ฐˆ์ˆ˜๋ก ์‰ฝ์ง€ ์•Š๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ€๋Š” ๊ณผ์ •์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์€ ๊ทนํžˆ ์ผ๋ถ€ ๊ณผ์ •์ž„์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹œ๊ฐ„์ด ๋” ๊ทธ๋ฆฝ๋‹ค. ๋ฆฌํŒฉํ„ฐ๋ง๊ณผ ๊ธฐ์ˆ  ์ ์šฉ ๋ฐ ๋ฒ„์ „ ๋งž์ถค ์ˆ˜์ •์— ์‹œ๊ฐ„์„ ๋” ์Ÿ๋Š” ์š”์ฆ˜์ด๋‹ค. ํด๋ฆฐ ํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ์†์ˆ˜ ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋ž€ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ SonarQube๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์ ์šฉํ•ด ๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. ์ •๋ง ์˜ค๋ž˜ ๊ฑธ๋ ธ๊ณ , ์ •ํ™•ํ•˜์ง„ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋‚˜๋ฆ„๋Œ€๋กœ ์ ์šฉํ–ˆ๋˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค. (ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋ฌดํ•œํ•œ ๋Œ“๊ธ€ ๊ฐ์‚ฌํžˆ ๋ฐ›๊ฒ ์Šต๋‹ˆ๋‹ค!) ์ด๊ฒƒ์ด ์™„๋ฃŒ๋œ ํ›„ AWS lightsales, ec2 ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค. ์ •์  ๋ถ„์„ ๋„๊ตฌ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•  ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. ์ง€์†์ ์ธ .. 2022. 7. 5.
๋ฐ˜์‘ํ˜•