๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋ชฉ๋ก๊ฐœ๋ฐœ ์„œ์ /DDD ์‹œ์ž‘ํ•˜๊ธฐ (6)

Tech Log ๐Ÿ› ๏ธ

๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ - ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ , ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ๊ฒฝ๊ณ„

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์™€ ํŠธ๋žœ์žญ์…˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ 1. ์„ ์  ์ž ๊ธˆ 2. ๋น„์„ ์  ์ž ๊ธˆ ์„ ์  ์ž ๊ธˆ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์‚ฌ์šฉ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ—ค๋”ฉ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ex) agg1์ด ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ agg2๋Š” ์ž ๊ธˆ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๋ธ”๋กœํ‚น๋œ๋‹ค. ์„ ์  ์ž ๊ธˆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ต์ฐฉ ์ƒํƒœ์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ต์ฐฉ ์ƒํƒœ๋ž€? ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ์ž ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ์„ ์ ํ•˜๋‹ค๊ฐ€ ์„œ๋กœ์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ ๊ต์ฐฉ ์ƒํƒœ์— ๋ฐ”์ง€๋ฉด ์‹œ์Šคํ…œ์€ ๋งˆ๋น„๋˜๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค. ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ด์คŒ์œผ๋กœ์จ ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋น„์„ ์  ์ž ๊ธˆ ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ DBMS์— ๋ฐ˜์˜ํ•˜๋Š” ์‹œ์ ์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ -> ๋ฒ„์ „ ๊ฐ’..

๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ - ๋„๋ฉ”์ธ ์„œ๋น„์Šค

๋„๋ฉ”์ธ ์„œ๋น„์Šค ์—ฌ๋Ÿฌ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ฑ…์ž„์ด ์• ๋งคํ•  ๋•Œ ๋„๋ฉ”์ธ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„๋ฉ”์ธ ์„œ๋น„๋Š” ๋‹ค์Œ ์ƒํ™ฉ์— ์ด์šฉ๋œ๋‹ค. 1. ๊ณ„์‚ฐ๋กœ์ง 2. ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—ฐ๋™์ด ํ•„์š”ํ•œ ๋กœ์ง ๋„๋ฉ”์ธ ์„œ๋น„์Šค๋Š” ์ƒํƒœ ์—†์ด ๋กœ์ง๋งŒ ๊ตฌํ˜„ํ•œ๋‹ค. ๋„๋ฉ”์ธ ์„œ๋น„์Šค๋ฅผ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ์ฒด์— ์ฃผ์ž…ํ•˜๋ฉด ์•ˆ๋œ๋‹ค! ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—ฐ๋™๊ณผ ๋„๋ฉ”์ธ ์„œ๋น„์Šค public interface API { ... } ๋„๋ฉ”์ธ ๋กœ์ง ๊ด€์ ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. ์‘์šฉ ์„œ๋น„์Šค๋Š” ์ด ๋„๋ฉ”์ธ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋„๋ฉ”์ธ ์„œ๋น„์Šค์˜ ๋กœ์ง์ด ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด , ๋„๋ฉ”์ธ ์„œ๋น„์Šค ์ž์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„๋ฉ”์ธ ์„œ๋น„์Šค์˜ ๊ตฌํ˜„์ด ํŠน์ • ๊ธฐ์ˆ ์— ์˜์กดํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ถ”์ƒํ™”ํ•ด์•ผํ•œ๋‹ค.

๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ - ํ‘œํ˜„ ์˜์—ญ๊ณผ ์‘์šฉ ์˜์—ญ

ํ‘œํ˜„ ์˜์—ญ๊ณผ ์‘์šฉ ์˜์—ญ ์‘์šฉ ์˜์—ญ๊ณผ ํ‘œํ˜„ ์˜์—ญ์€ ์‚ฌ์šฉ์ž์™€ ๋„๋ฉ”์ธ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋งค๊ฐœ์ฒด ์—ญํ• ์ด๋‹ค. ํ‘œํ˜„ ์˜์—ญ์€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ํ•ด์„ํ•˜๊ณ  ๊ทธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์‘์šฉ ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์‘์šฉ ์˜์—ญ์€ ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋‘ ์˜์—ญ์€ ์„œ๋กœ ์š”๊ตฌํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ˜•์‹์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์„ ๋ณ€ํ™˜ํ•ด์•ผํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ์€ ํ‘œํ˜„ ์˜์—ญ์ด ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‘์šฉ ์„œ๋น„์Šค๋Š” ํ‘œํ˜„ ์˜์—ญ์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค. ์‘์šฉ ์„œ๋น„์Šค์˜ ์—ญํ•  ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์—์„œ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•œ๋‹ค. public Result func(Req req){ // ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์—์„œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ๊ตฌํ•จ Agg agg = AggRepository.finById(req.getId()); // ์• ๊ทธ๊ฑฐํŠธ์˜ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ ์‹คํ–‰ ad..

๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ - ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ์ฒด ๋ชจ๋ธ์ด ๋ณต์žกํ•ด์ง€๋ฉด ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ ์œ„์ฃผ๋กœ ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๊ฒŒ ๋˜๊ณ  ์ „๋ฐ˜์ ์ธ ๊ตฌ์กฐ๋‚˜ ํฐ ์ˆ˜์ค€์—์„œ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. -> ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๋ชจ๋ธ์„ ์กฐ๋งํ•ด์•ผํ•˜๋Š”๋ฐ , ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์• ๊ทธ๋ฆฌ๋ฆฌ๊ฑฐํŠธ๋Š” ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์„ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์†ํ•œ ๊ฐ์ฒด๋Š” ์œ ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ€์ง€๋ฉฐ ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ์ปคํŠธ์— ์†ํ•œ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ์ปคํŠธ์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์ „์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ฃผ์ฒด๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ด ์ฑ…์ž„์„ ์ง€๋Š” ๊ฒƒ์ด ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ์ด๋‹ค. ex) Order -> (OrderLine) , (Orderer) , (Address) ํ•ต์‹ฌ ์—ญํ• ์€ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์˜ ์ผ๊ด€์„ฑ์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฃจํŠธ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๊ฐ€ ์ œ๊ณตํ•ด์•ผํ•  ๋„๋ฉ”์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์• ๊ทธ..

๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ - ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

๋„ค ๊ฐœ์˜ ์˜์—ญ ํ‘œํ˜„ ์˜์—ญ HTTP ์š”์ฒญ์„ ํ•„์š”๋กœ ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‘์šฉ ์˜์—ญ์— ์ „๋‹ฌํ•˜๊ณ  ๋‹ค์‹œ ์‘๋‹ต์„ HTTP ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ „์†ก ex) mvc ํ”„๋ ˆ์ž„์›Œํฌ ์‘์šฉ ์˜์—ญ(์„œ๋น„์Šค ๊ณ„์ธต) ๋„๋ฉ”์ธ ์˜์—ญ์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค. ๋กœ์ง์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋ณด๋‹จ ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ๋กœ์ง ์ˆ˜ํ–‰์„ ์œ„ํž˜ ๋„๋ฉ”์ธ ์˜์—ญ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ•ต์‹ฌ ๋กœ์ง์„ ๊ตฌํ˜„ public cancelOrder(String orderId) { Order order = findOrderById(orderId); // ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ์œ„์ž„ ... } ์ธํ”„๋ผ ์ŠคํŠธ๋Ÿญ์ณ ์˜์—ญ ๋…ผ๋ฆฌ์  ๊ฐœ๋… ๋ณด๋‹ค๋Š” ๊ตฌํ˜„ ๊ธฐ์ˆ ์„ ๋‹ค๋ฃฌ๋‹ค. ex) DB ,SMTP , ์นดํ”„์นด ๊ณ„์ธต ๊ตฌ์กฐ ์•„ํ‚คํ…์ฒ˜ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ณดํ†ต ํ‘œํ˜„ -> ์‘์šฉ -> ๋„๋ฉ”์ธ -> ์ธํ”„๋ผ์Šค..

๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ ์‹œ์ž‘ํ•˜๊ธฐ - ๋„๋ฉ”์ธ ๋ชจ๋ธ ์‹œ์ž‘ํ•˜๊ธฐ

์š”๊ตฌ ์‚ฌํ•ญ ์š”๊ตฌ์‚ฌํ•ญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ์—‰๋šฑํ•œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค. (Garbage in , Garbage out) -> ์ฝ”๋”ฉ์— ์•ž์„œ ์š”๊ตฌ์‚ฌํ•ญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค ! ๋„๋ฉ”์ธ ๋ชจ๋ธ ํŠน์ • ๋„๋ฉ”์ธ์„ ๊ฐœ๋…์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ด€๊ณ„์ž๋“ค์ด ๋™์ผํ•œ ๋ชจ์Šต์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋ชจ๋ธ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค. ex) ๊ฐ์ฒด , ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ, ๊ทธ๋ž˜ํ”„ ๋„๋ฉ”์ธ ๋ชจ๋ธ ํŒจํ„ด ๋„๋ฉ”์ธ ๊ณ„์ธต์€ ๋„๋ฉ”์ธ์˜ ํ•ต์‹ฌ ๊ทœ์น™์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์ฃผ๋ฌธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ฐฐ์†ก์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋„๋ฉ”์ธ ๋ชจ๋ธ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ public class Order { private OrderState state; private ShippingInfo inf..