๐Ÿ‘จ‍๐Ÿ’ป kimtongting
article thumbnail
[MSA] CQRS ์ด๋Ÿฐ๊ฑฐ์˜€์–ด?

QUOTE THE DAY “ ์—๋Ÿฌ ์—†๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๋ฐ๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์„ธ๋ฒˆ์งธ ๊ฒƒ๋งŒ ์ž‘๋™ํ•œ๋‹ค. ” - Alan J. Perlis (์•จ๋Ÿฐ J. ํŽ„๋ฆฌ์Šค) CQRS (Command Query Responsibility Segregation) * CQRS ๋ž€? ๐Ÿ“์ง์—ญํ•˜์ž๋ฉด ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ์˜ ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Create-Insert, Update, Delete ์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ Select-Read ์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ ๋‘ ๊ฐ€์ง€์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. * ์™œ ์‚ฌ์šฉํ• ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š”(ํ˜น์€ ์‚ฌ์šฉํ–ˆ๋˜) ์ „ํ†ต์ ์ธ CRUD ์•„ํ‚คํ…์ณ ๊ธฐ๋ฐ˜์—์„œ ์‹œ์Šคํ…œ์„ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋‹ค ๋ณด๋ฉด, ์ถ”๊ฐ€์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ •์ฑ…์˜ ๋ณ€ํ™”๋“ค๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋กœ์ง์ƒ์˜ Domain Model ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฒŒ..

article thumbnail
[Spring] @Valid ๋กœ exception ์ฒ˜๋ฆฌํ•˜๊ธฐ ๊ฒ€์ฆํ•˜๊ธฐ

๊ฐœ์š” API ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜, ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. (ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ) ๋”ฐ๋กœ Rule ์ด ์—†๋‹ค๋ฉด ๋ฐฉ๋ฒ•์€ ๋ฌด๊ถ๋ฌด์ง„ํ•˜๋‹ค. ๋ชจ๋“  ์š”์ฒญ์— if๋ฅผ ๊ฑธ์–ด ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜.. ๊ณตํ†ต์œผ๋กœ ํ•˜๋‚˜์˜ Class ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฒฝ์œ ํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜.. ์ด ๊ธ€์—์„œ๋Š” ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•  Exception ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๊น”๋”ํ•˜๋‹ค. ๊ธฐ์กด Spring ์ด๋‚˜ Spring Boot์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ๋ฐœ์ƒํ–ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Spring Boot์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋กœ ์ œ์–ดํ•  ์˜ˆ์ •์ด๋‹ค. *์•„๋ž˜ ๊ธ€์—์„œ๋Š” ์ฟ ํฐ์„ ๋ฐœํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์šฉ์„ ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ @Valid ๋ฅผ ๋„ฃ์–ด ๊ตฌํ˜„ํ•˜์˜€๋‹ค. 1. ์‚ฌ์ „์ค€๋น„ ๐Ÿ“Maven ์„ ๊ธฐ..

article thumbnail
[Git] git ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ Pull Request ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๐Ÿ“” ์†Œ๊ฐœ ์•„์ง Git ์„ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด Pull Request ์— ์–ด์ƒ‰ํ•œ ๋ถ„๋“ค์„ ์œ„ํ•œ ๊ธ€์ด๋‹ค. Pull Request๋ž€ ๋ฌด์—‡์ผ๊นŒ? ๐Ÿ“„ Pull Request ๋ž€? Repository(ํ”„๋กœ์ ํŠธ)์˜ Maker(์ƒ์„ฑ์ž), Collaborators(ํ˜‘๋ ฅ์ž) ๊ฐ€ ์•„๋‹ˆ๊ธฐ์— Push ๊ถŒํ•œ์ด ์—†์ง€๋งŒ, ํ•ด๋‹น ๊ตฌ์„ฑ์›๋“ค์—๊ฒŒ Contribute ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ์š”์ฒญ์ด๋‹ค. ์กฐ๊ธˆ ๋” ํ’€์–ด ๋งํ•˜์ž๋ฉด, ๋‚ด๊ฐ€ ์ž‘์—…ํ•ด์•ผํ•˜๋Š”(ํ˜น์€ ๋งˆ์Œ์— ๋“œ๋Š”) Repository๊ฐ€ ์žˆ๋Š”๋ฐ ์ฝ”๋“œ์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ(๋” ๋ฐœ์ „๋œ ์ฝ”๋“œ๊ฑฐ๋‚˜ Maker์™€ Collaborators์— ๋„์›€๋˜๋Š” ์ฝ”๋“œ) ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ฒ€ํ†  ํ›„, ์ฝ”๋“œ ๋ณ‘ํ•ฉ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๐Ÿ“„ ์‚ฌ๊ฑด์˜ ๋ฐœ๋‹จ OO๋‹˜~~ A ํ”„๋กœ์ ํŠธ ์ด์Šˆ #12451๋ฒˆ ์ฒ˜๋ฆฌ ๋ถ€ํƒ๋“œ๋ ค์š”~! ๐Ÿ“์ดˆ๋ณด์ž๋Š” ์ด ๋ง์„ ๋“ฃ..

article thumbnail
DDD ๋ž€? ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„

๋„๋ฉ”์ธ ์ค‘์‹ฌ ์„ค๊ณ„(Domain-Driven Design)์ด๋ž€? ๋‹จ์ˆœํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด ๋„๋ฉ”์ธ(๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ)์„ ์ค‘์‹ฌ์œผ๋กœ ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด ์„ค๊ณ„(๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ)ํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ”„๋กœ์ ํŠธ ์† ๋ชจ๋“ˆ๊ฐ„์˜ ์˜์กด์„ฑ์€ ์ตœ์†Œํ™”ํ•˜๋ฉฐ ์‘์ง‘์„ฑ์€ ์ตœ๋Œ€ํ™” ํ•˜๋ฉด์„œ ๋ง์ด๋‹ค... ์ฒ˜์Œ DDD ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ ‘ํ•  ๋•Œ๋Š” ๋„ˆ๋ฌด๋‚˜๋„ ๋„“์€ ๋ฒ”์œ„์— ๋‚œํ•ดํ•ด์„œ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ์—ˆ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ. ๊ฐ์ฒด ์ง€ํ–ฅ์€ ๋…๋ฆฝ์ ์ธ ๊ฐœ์ฒด(๊ฐ์ฒด)๋“ค์ด ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค. ๋ฌผ๊ฑด์„ ์‚ฌ๊ธฐ์œ„ํ•ด(Buy Domain) ๋งˆํŠธ์— ๋“ค์–ด๊ฐ„ A์”จ๋Š” ๊ทธ๊ณณ์—์„œ ์ผํ•˜๊ณ  ์žˆ๋Š” B์”จ์—๊ฒŒ ๊ณ„์‚ฐ์„ ํ•œ๋‹ค(Sell Domain) ์ ์ฃผ์ธ C ๋Š” ์ด๋ฅผ ๊ด€๋ฆฌ(Manage Domain)ํ•œ๋‹ค. ๋ฒŒ์จ ์—ฌ๊ธฐ์„œ๋งŒ 3๊ฐœ ์ด์ƒ์˜ ๋„๋ฉ”์ธ์ด..

article thumbnail
ํ”„๋กœ์ ํŠธ ์ž๊ฐ€์ง„๋‹จ

๐Ÿ“”ํ”„๋กœ์ ํŠธ ์ž๊ฐ€์ง„๋‹จ ๐Ÿ“„๋†€๋ผ์›€, ๊ทธ๋ฆฌ๊ณ .. ์ด ๊ธ€์˜ ๋‚ด์šฉ์„ ๋ณด๊ณ  ์‹ค๋กœ ๋†€๋ผ์› ๋‹ค. ์„ธ์ƒ์— ์‹ฌ์ง€์–ด ๋‚ด๊ฐ€ ์š”์ƒˆ ์ง„ํ–‰ ์ค‘์ธ ๋‚ด์šฉ๋“ค์ด๋‹ค. ๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ํฌ๊ฒŒ 10๊ฐœ ํ•ญ๋ชฉ์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์…จ๊ณ , ๋‹คํ–‰ํžˆ๋„ ๋‚˜๋Š” 10๊ฐœ ํ•ญ๋ชฉ ๋ชจ๋‘์— ์ฒดํฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ •ํ•ด์ง„ ๊ธฐ๊ฐ„์— ๋งž์ถ”์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋๋‚ด๊ณ , ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ์ฒ ์ˆ˜ํ•˜๊ธฐ ๊ธ‰๊ธ‰ํ•˜๋‹ค. ์šฐ๋ฆฌ๋Š” ์›”๊ธ‰์Ÿ์ด๋‹ˆ๊นŒ, ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋œ ํ”„๋กœ์ ํŠธ๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด LTS๋กœ ๋ณด๊ณ  ๋‹ค์‹œ ๋ณผ ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ฌธ๋“ ์—ฐ์ฐจ๊ฐ€ ์Œ“์ด๊ณ , ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณผ ๋•Œ, ๊ทธ ์ถฉ๊ฒฉ์€.. ์Œ ๋ญ๋ž„๊นŒ ์ƒ๋‹นํžˆ ๋ฏผ๋งํ•˜๋‹ค. ๋‹น์‹œ์— ์ƒ๊ฐ ์—†์ด ์งฐ๋˜ ์ฝ”๋“œ๋Š” ๋ถ€๋„๋Ÿฌ์›€์— ์ˆ˜์ •์„ ํ•˜๊ณ , ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ•˜๋ฉฐ ์งฐ๋˜ ์ฝ”๋“œ๋Š” ์ง€๊ธˆ ๋‹ค์‹œ ๋ด๋„ ๋งค๋ ฅ์ ์ธ ์ฝ”๋“œ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด, ๋™..

article thumbnail
[Spring Boot] Spring Boot ์ง€์› ๊ณ„ํš

๐Ÿ“”Spring Boot ์ง€์› ๊ณ„ํš ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ spring boot๋กœ ์ง„ํ–‰ํ•˜๊ณ ์ž Spring initializr ์„ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘, Spring initializr ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด 2.5.x ๋ฒ„์ „๋“ค์ด ์‚ฌ๋ผ์ง„ ๊ฒƒ์„ ๋ณด๊ณ  ๋ถ€๋žด๋ถ€๋žด spring boot์˜ ์ง€์› ๊ณ„ํš์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ŠคํŒ… ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๐Ÿ‘จ‍๐Ÿ’ปSpring Boot ์˜ 3.0.x ๋ฒ„์ „ ์ถœ์‹œ ์ผ์ •(2022-11-24) ์ด ์ฝ”์•ž์œผ๋กœ ๋‹ค๊ฐ€์˜ด์— ๋”ฐ๋ผ, ์—ฌ๋Ÿฌ ๊ธฐ์—…์—์„œ ๊ธฐ์กด์— ์‚ฌ์šฉ์ค‘์ด๋˜ ๋ ˆ๊ฑฐ์‹œ ๋ฒ„์ „ Spring Boot ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ํ˜„์žฌ ๊ทผ๋ฌด ์ค‘์ธ ํšŒ์‚ฌ์—์„œ๋„ ์ง€๋‚œ 5์›”, ์šด์˜์ค‘์ธ Spring Boot ํ”„๋กœ์ ํŠธ์˜ ์ตœํ•˜์œ„ ๋ฒ„์ „์„ 2.4.2 ๋ฒ„์ „์œผ๋กœ ๊ณ ์ •์‹œ์ผฐ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๊ถŒ์žฅํ•˜๋Š” Branch์˜ ์ตœํ•˜์œ„ ๋ฒ„..

article thumbnail
ํ† ์ดํ”„๋กœ์ ํŠธ ์„œ๋น„์Šค ํ”Œ๋กœ์šฐ

๐Ÿ“”ํ† ์ดํ”„๋กœ์ ํŠธ ๐Ÿ“„Front-End ๐Ÿ“React ๐Ÿ“„Back-End ๐Ÿ“Spring Boot(2.5.5) ๐Ÿ“„DB ๐Ÿ“MySQL or MariaDB ๐Ÿ“„API ๐Ÿ“Node.js

article thumbnail
[Log/๋กœ๊ทธ] ๋กœ๊ทธ์— ๋Œ€ํ•œ ์ •์˜์™€ ์„ฑ์ฐฐ , ๊ทธ๋ฆฌ๊ณ ..

๐Ÿ“”๋กœ๊ทธ ๐Ÿ“„๊ฐœ์š” โŒจ์ˆ˜ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์™€ ์„œ๋น„์Šค๋“ค์„ ์šด์˜ํ•˜๋‹ค๋ณด๋ฉด ์šฐ๋ฆฌ์˜ Log ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ(ํ˜น์€ ํด๋”)๋Š” ์–ธ์ œ๋‚˜ ํƒœํ’ ์ด๋‹ค. ์ฝ”๋”ฉํ•˜๋Š๋ผ ๋ฐ”์œ ์šฐ๋ฆฌ์—๊ฒŒ ๋กœ๊ทธ์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ์ €~~๋ฉ€๋ฆฌ, ์•„๋‹ˆ์ง€ ์ œ์ผ ๋’ค์— ์žˆ๋‹ค. ์„ค๊ณ„์— ๋Œ€ํ•œ ๊ฒƒ๋ณด๋‹ค ๋‚จ๊ธฐ๋Š” ๊ฒƒ์—๋งŒ ์ง‘์ค‘ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค ๋ณด๋‹ˆ ๊ทœ์•ฝ์ด ์—†๊ณ , ๋ชจ๋“  ๊ฑธ ๋‚จ๊ธด ๋กœ๊ทธ์˜ ํ’ˆ์งˆ์€ ์ €ํ•˜๋  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๋กœ๊ทธ ํŒŒ์ผ์ด KB๋„ ์•„๋‹ˆ๊ณ  MB๋„ ์•„๋‹Œ GB..? ์‹ฌ์ง€์–ด ๋™์ผํ•œ ๋‹จ์–ด์™€ ๋ฐ์ดํ„ฐ๋ผ๋‹ˆ? ์œผ์•„์•…! ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต์ž–์•„! ์œ„์™€ ๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์ ์ด ์žˆ๋‹ค๋ฉด? ์ด ํฌ์ŠคํŒ…์ด ์ฝ์„๋งŒ ํ•˜์ง€ ์•Š์„๊นŒ ๐Ÿ“„๋กœ๊ทธ์˜ '์ •์˜' ๐Ÿ“๋กœ๊ทธ๋Š” '์ผ์ง€[๊ธฐ๋ก]' ์ด๋ผ๋Š” ๋œป์„ ์ง€๋‹Œ๋‹ค. ์ด ํฌ์ŠคํŒ…์—์„œ ๋ฐ”๋ผ๋ณด๋Š” ์‹œ์„ ์˜ ๋กœ๊ทธ๋Š” ์‹œ์Šคํ…œ์ด๋‚˜ ์„œ๋น„์Šค ๋“ฑ์˜ ๊ฐ€๋™ ์‹œ ๋‚จ๊ธฐ๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋ก์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๊ธฐ๋ก..