ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
Clean Architecture con c# (Trabajo en progreso ๐Ÿšง๐Ÿ‘ท๐Ÿฝ)
Dev.toDev.to
Backend

C# ๊ธฐ๋ฐ˜ Clean Architecture ๋ฐ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ผ๊ด€์„ฑ ํ™•๋ณด ์ „๋žต

Clean Architecture con c# (Trabajo en progreso ๐Ÿšง๐Ÿ‘ท๐Ÿฝ)

Alfredo Poveda2026๋…„ 5์›” 2์ผ8๋ถ„intermediate

Context

์ถ”์ƒ์ ์ด๊ณ  ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์˜ ์‹ค๋ฌด์  ์ ์šฉ ํ•œ๊ณ„์  ๋ถ„์„. ํŠนํžˆ ๋„๋ฉ”์ธ ๋กœ์ง๊ณผ ์™ธ๋ถ€ ๊ธฐ์ˆ ์˜ ๊ฐ•๊ฒฐํ•ฉ์œผ๋กœ ์ธํ•œ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ฆ๊ฐ€ ๋ฐ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๊ฒฐ์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ ํ•„์š”.

Technical Solution

  • Domain ์ค‘์‹ฌ์˜ Bounded Context ์„ค์ •์„ ํ†ตํ•œ ๋ชจ๋ธ ๋ชจํ˜ธ์„ฑ ์ œ๊ฑฐ ๋ฐ ํŒ€๋ณ„ ์ž์œจ์„ฑ ํ™•๋ณด
  • Monolith Modular ๊ตฌ์กฐ ์ฑ„ํƒ์œผ๋กœ ๋ฐฐํฌ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ๋‚ด๋ถ€ ๋ชจ๋“ˆ ๊ฐ„ ๊ฐ•ํ•œ ์‘์ง‘๋„์™€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„ ๊ตฌํ˜„
  • Hexagonal Architecture์˜ Ports & Adapters ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ธํ”„๋ผ ๊ธฐ์ˆ ๋กœ๋ถ€ํ„ฐ ์™„์ „ํžˆ ๋ถ„๋ฆฌ
  • Screaming Architecture ์›์น™์— ๋”ฐ๋ฅธ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ํ†ตํ•ด ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์‹ฌ์ด ์•„๋‹Œ ๋„๋ฉ”์ธ ๋ชฉ์ ์ด ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ตฌ์กฐ ๊ตฌ์ถ•
  • Outbox Pattern ๋„์ž…์„ ํ†ตํ•œ DB ์—…๋ฐ์ดํŠธ์™€ ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰์˜ ์›์ž์„ฑ ๋ณด์žฅ ๋ฐ ์ตœ์ข… ์ผ๊ด€์„ฑ(Eventual Consistency) ๋‹ฌ์„ฑ
  • Inbox Pattern ๋ฐ Idempotency ์„ค๊ณ„๋ฅผ ํ†ตํ•œ ์ค‘๋ณต ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋ฐฉ์ง€ ๋ฐ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ๊ฐ•ํ™”
  • Saga Pattern ๊ธฐ๋ฐ˜์˜ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜(Compensating Transactions) ๊ตฌํ˜„์œผ๋กœ ๋ถ„์‚ฐ ์„œ๋น„์Šค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ์œ ์ง€

- ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ธฐ์ˆ  ์Šคํƒ์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ - ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ DB ๋ณ€๊ฒฝ์ด ๋„๋ฉ”์ธ ๋กœ์ง์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก Interface ๊ธฐ๋ฐ˜์˜ Port ์„ค๊ณ„ ์ ์šฉ - ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ๋„์ž… ์‹œ At-least-once ์ „๋‹ฌ ๋ณด์žฅ์„ ์œ„ํ•œ Outbox/Inbox ํ…Œ์ด๋ธ” ์„ค๊ณ„ ๊ฒ€ํ†  - ๋ณต์žกํ•œ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ํ•„์š” ์‹œ 2PC ๋Œ€์‹  Saga ํŒจํ„ด์„ ํ†ตํ•œ ๋น„๋™๊ธฐ์  ๋ณด์ƒ ๋กœ์ง ์„ค๊ณ„ ๊ณ ๋ ค

์›๋ฌธ ์ฝ๊ธฐ