Clean Architecture - Slog

[Clean Architecture - Slog]

:rocket: ์ฃผ์š” ๋ชฉํ‘œ

  1. Clean Architecture์˜ ๊ฐœ๋…์„ ์ •๋ฆฌํ•œ๋‹ค.
  2. Clean Architecture๋ฅผ ์„ค๋“ค๋ ฅ์žˆ๊ฒŒ ํ˜ธ์†Œํ•œ๋‹ค.
  3. Clean Architecture๊ฐ€ ASP.NET Core์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜์–ด ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.
  4. Clean Architecture๋ฅผ ์ ์šฉํ•œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฐ๊ตฌํ•œ๋‹ค.

:memo: ๊ณ„ํš์„œ

:one: Robert C. Martin์˜ ์ฑ… Clean Architecture, ์ธํ„ฐ๋„ท ์ž๋ฃŒ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฐœ๋…์„ ์ •๋ฆฌํ•œ๋‹ค.
:two: ์žฅ๋‹จ์ ์„ ๋‚˜์—ดํ•˜๊ณ  ์™œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๊ฐ€, ๊ฐœ๋ฐœ์ž ํ˜„์‹ค๊ณผ ์ƒํ™ฉ์— ๋น—๋Œ€์–ด ์ ์šฉ์ ์„ ๋‚˜์—ดํ•œ๋‹ค. (+ ์„ค๋ฌธ์กฐ์‚ฌ ์—ฐ๊ตฌ)
:three: 1๋ฒˆ์˜ ์ •๋ฆฌํ•œ ๊ฐœ๋…์„ MS Docs์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๊ณ  ๋‚˜์—ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•œ๋‹ค.
:four: ๋จผ์ € ํ”ํžˆ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฐœ๋…์„ ๋‚˜์—ดํ•˜๊ณ  ์•ž์œผ๋กœ ์—ฐ๊ตฌ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

2022.07.05 ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

:bulb:[์‹œ๋‚˜๋ฆฌ์˜ค ๊ตฌ์„ฑ ์ค‘]
๊ธฐ๋ฆ„ ์‹œ์ถ” ๊ธฐ๊ณ„ : ํšŒ์‚ฌ
๊ธฐ๋ฆ„ : ์ž์›, ์ž๋ณธ, ํ”„๋กœ๊ทธ๋ž˜๋จธ
์ž๋™์ฐจ : ํˆฌ์žํ•œ ์ž์›์œผ๋กœ ๋งŒ๋“ค์–ด ๋‚ธ ์ˆ˜์ต ๋ชจ๋ธ, ์„ค๊ณ„ ๋„๋ฉด
๋‹ฌ์„ฑ ๊ฑฐ๋ฆฌ : ๋งค์ถœ์•ก, ํ”„๋กœ๊ทธ๋žจ ์™„์„ฑ๋„

๊ธฐ๋ฆ„์„ ๋ฝ‘์•„๋‚ด๋Š” ๊ธฐ๊ณ„๊ฐ€ ๋งค์ผ 100L๋ฅผ ์ƒ์‚ฐํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์ž๋™์ฐจ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ํ•œ์ •๋œ ๊ธฐ๋ฆ„์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ฉ€๋ฆฌ ๋‹ฌ๋ ค๊ฐ€์•ผํ•ฉ๋‹ˆ๋‹ค.
๋งŽ์ด ๊ฐˆ์ˆ˜๋ก ์ข‹์€ ์„ฑ๊ณผ๋ฅผ ์–ป์—ˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ฆ„์€ ๋งค์ผ 100L๋กœ ์ž์›์ด ํ•œ์ •๋œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ
์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๊ฐ€๋Šฅํ•œ ๋ฉ€๋ฆฌ๋‚˜์•„ ๊ฐˆ ์ˆ˜ ์žˆ์„๊นŒ์š”?
์—ฐ๋น„ ์ข‹์€ ์ž๋™์ฐจ๋ฅผ ๊ฐœ๋ฐœํ•ด๋ฉ๋‹ˆ๋‹ค.
์ฆ‰ ์—”์ง„ ํšจ์œจ์„ ๋†’์ด๊ณ  ๊ณต๊ธฐ์ €ํ•ญ์— ํšจ์œจ์ ์ธ ๋””์ž์ธ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ์—ฐ๋น„๋Š” 10km/โ„“ ์ด๋ฉฐ
์—ฐ๊ตฌ๊ฐœ๋ฐœ์— ํˆฌ์ž ํ•ด ์—ฐ๋น„๊ฐœ์„ ์œผ๋กœ 20km/โ„“ ๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋งค์ผ 1,000Km๋ฅผ ๊ฐˆ ์ˆ˜ ์žˆ์—‡๋˜๊ฒƒ์ด 2,000Km ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ
100์ผ์ด ์ง€๋‚˜๋ฉด 100,000Km(10๋งŒ Km)๊ฐ€ ์ฐจ์ด ๋‚ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ ๊ฐ€๋Šฅํ•œ ๋ฉ€๋ฆฌ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•œ์ •๋œ ์งง์€ ๊ฑฐ๋ฆฌ 3,000Km๋ฅผ ๊ฐ€์•ผํ•œ๋‹ค๋ฉด
์—ฐ๊ตฌ๊ฐœ๋ฐœ์— ํˆฌ์žํ• ๋ฐ”์—” 3์ผ๊ฐ„ ๊ทธ๋ƒฅ ๋‹ฌ๋ฆฌ๋ฉด ๋˜๊ฒ ์ฃ ?

Clean Architecture๋Š” ์„ค๊ณ„์— ์žˆ์–ด์„œ ์ดˆ๊ธฐ ํˆฌ์ž๋˜๋Š” ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์—
์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์ข‹์œผ๋‚˜ ๋‹จ๊ธฐ์ ์ธ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—๋Š” ๋งž์ง€์•Š์Šต๋‹ˆ๋‹ค.
๋˜ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ์ž์›์— ์ œํ•œ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
Clean Architecture๋กœ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ๋“œ๋Š” ์ดˆ๊ธฐ ๋น„์šฉ์ด 10์ด๋ผ๊ณ ํ•˜๊ณ 
ํšŒ์‚ฌ ์ž๋ณธ์ด 10์ด๋ผ๋ฉด ์ˆ˜์ต ๋‚˜๊ธฐ๋„ ์ „์— ํŒŒ์‚ฐํ•˜๊ฒ ์ฃ ?

๋งŽ์€ ํšŒ์‚ฌ๋“ค์ด ์ข‹์€ ๊ธฐํš์•ˆ์ด ์žˆ์Œ์—๋„ ์ˆ˜์ต๋‚ด๊ธฐ ํž˜๋“  ๊ฒƒ์ด ์—ฌ๊ธฐ์„œ ์‹œ์ž‘๋œ๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.
์ข‹์€ ํ’ˆ์งˆ๊ณผ ์„œ๋น„์Šค๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ˆ˜์ต์„ ๋‚ผ ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€๋งŒ,
์‹ค์ƒ ํšŒ์‚ฌ ์ž์›์œผ๋กœ๋Š” ๋†’์€ ํ’ˆ์งˆ์˜ ์–ด๋– ํ•œ ๊ฒƒ์„ ๋‚ด๊ธฐ๊ฐ€ ํž˜๋“ญ๋‹ˆ๋‹ค.
์ด์ ์— ๋น—๋Œ€์–ด ๋ดค์„ ๋•Œ Clean Architecture์€ ์ž‘์€ ๊ทœ๋ชจ์˜ ํšŒ์‚ฌ์—๋„ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ํ˜„์‹ค์ ์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ๊พธ์ค€ํžˆ ์ข‹์€ ์ˆ˜์ต์„ ๋‚ด๋Š” ๋ชจ๋ธ์ด ์žˆ๋‹ค๋ฉด,
์ด ๊ฑฐ ์ œ๋Œ€๋กœ ํ•ด๋ณด์ž๋ผ๋Š” ๊ฒฐ์‹ฌ์„ ๊ฐ€์ง€๊ณ  Clean Architecture๋กœ
์žฌ์ •๋น„ํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Clean Architecture๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š๋ƒ?๋ผ๊ณ  ํ•œ๋‹ค๋ฉด
์ด๋ฏธ ๋งŽ์€ ๋ถ„๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. (IoC, DI ๋“ฑ )

์•„๋‹ˆ ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ญ ์–ด๋–ป๊ฒŒํ•˜๋ผ๋Š” ๊ฑด๊ฐ€์š”?
=> Architecture๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ์‹œ์ง€๋งŒ 100% ์™„๋ฒฝํžˆ ์ ์šฉํ•˜๊ณ  ์žˆ์œผ์‹ ๊ฑด ์•„๋‹ ๊ฒ๋‹ˆ๋‹ค.
Architecture์˜ ๊ฐœ๋…์€ ์žˆ์ง€๋งŒ ์‹ค์งˆ์ ์ธ ์กด์žฌ๊ฐ€ ์—†๋‹ค๊ณ  ํŒ๋‹จ๋ฉ๋‹ˆ๋‹ค.
๋‹ค๋งŒ ์ง€๊ธˆ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” Architecture๋ณด๋‹ค ๋” ๋‚˜๋Š” Architecture๊ฐ€ ์žˆ์„๊ฒƒ์ด๊ณ 
ํ˜„์žฌ ์ƒํ™ฉ์— ๋งž๊ฒŒ Architecture๋ฅผ ์ ์šฉํ•ด๋ณด์ž ์ž…๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ์ž์›์ด ๋งŽ์œผ๋‹ˆ๊นŒ ๋ฌด์กฐ๊ฑด Clean Architecture
'์ž์›์ด ๋ถ€์กฑํ•˜๋‹ˆ๊ฐ€ ๊ทธ๋ƒฅ ์ฝ”๋”ฉโ€™์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ƒํ™ฉ์— ๋งž๊ฒŒ
ํ•„์š”ํ•œ ๋งŒํผ Architecture๋ฅผ ์ ์šฉํ•˜์ž๊ฐ€ ์ฃผ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.



Clean Architecture๋ž€:question:
ํ•œ๊ตญ๋ง๋กœ ํ•˜๋ฉด ๊ฑด์ถ•ํ•™์ด๋ผ๋Š” ๋œป์œผ๋กœ ์ข‹์€ ์„ค๊ณ„ ๋„๋ฉด์„ ๊ฐ€์ง€๊ณ 
์†Œ์Šค ์ฝ”๋”ฉ์„ ํ•˜์ž๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ข‹์€ ์„ค๊ณ„๋„๋ฉด์ด ์žˆ์œผ๋ฉด ๋ฌด์—‡์ด ์ข‹๋‚˜์š”?
=> Clean Architecture์€ ์ตœ์†Œ์˜ ๋น„์šฉ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ƒ์‚ฐ์„ฑ์€ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
์ฆ‰ ํšจ์œจ์ ์ธ ์ƒ์‚ฐ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋˜๊ฒ ์ฃ .

์ƒ์‚ฐ์„ฑ์˜ ํŒ๋‹จํ•˜๋Š” ์ฒ™๋„๋Š”: ์‰ฌ์šด ๊ฐœ๋ฐœ - ๋ฐฐํฌ - ์šด์˜ - ์œ ์ง€๋ณด์ˆ˜ ๋“ฑ์ด ๋˜๊ฒ ๋„ค์š”.
๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด View์— ๊ด€๋ จ๋œ ์˜์กด์„ฑ์ž…๋‹ˆ๋‹ค.
๋˜‘๊ฐ™์ด ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ธ๋ฐ iOS, Android, MacOS, Window ๋”ฐ๋กœ๋”ฐ๋กœ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด ๋“ค์–ด๊ฐ€๋Š” ์ž์›์ด ๋งŽ๊ฒ ์ฃ ?
Clean Architecture์—์„œ๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ View ๊ฐ€์ง„๋‹ค๋ฉด View ๋ฐ”๊ฟ” ๋ผ์šธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
(ํ•ต์‹ฌ ์†Œ์Šค 1๊ฐœ์™€ 4๊ฐœ์˜ View๋กœ ํ”Œ๋žซํผ 4๊ณณ์—์„œ ์„œ๋น„์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์–ผ๋งˆ๋‚˜ ์ข‹์„๊นŒ์š”?)

์ข€๋” ์ž์„ธํ•˜๊ฒŒ Clean Architecture ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋ง์”€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
image
Credit: ๋„์„œ์ถœํŒ ์ธ์‚ฌ์ดํŠธ

๊ฐ๊ฐ์˜ ์›์œผ๋กœ ๋ถ„ํ™œ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ค‘์‹ฌ์›์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ๊ณ ์ˆ˜์ค€, ์™ธ๊ฐ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ์ €์ˆ˜์ค€์ด๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์˜์กด์„ฑ ๊ทœ์น™์— ์˜ํ•ด ์˜์กด์„ฑ์€ ์™ธ๋ถ€์—์„œ ์•ˆ์œผ๋กœ, ์ €์ˆ˜์ค€์—์„œ ๊ณ ์ˆ˜์ค€์œผ๋กœ ํ˜๋Ÿฌ๊ฐ‘๋‹ˆ๋‹ค.
์ฆ‰ ์›น์€ ์ปจํŠธ๋กค, ์œ ์Šค์ผ€์ด์Šค, ์—”ํ‹ฐํ‹ฐ ๋“ฑ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์˜์กด์„ฑ์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ์ง€๋งŒ
๊ทธ ์–ด๋Š๊ฒƒ๋„ ์›น์— ๋Œ€ํ•ด ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๊ฐ€ ์—†์–ด์•ผํ•˜๋ฉฐ
Core(์œ ์Šค์ผ€์ด์Šค, ์—”ํ‹ฐํ‹ฐ)๋Š” ์™ธ๋ถ€์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค

์ด์™€ ๊ฐ™์€ ๊ธฐ๋ฐ˜์œผ๋กœ ASP.NET Core๋Š” Core, Infrastructure, Wep์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. + Test, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Docker ๋“ฑโ€ฆ)
Core : ๊ฐ€์žฅ ์•ˆ์ชฝ ์›์œผ๋กœ ์—”ํ‹ฐํ‹ฐ, ์œ ์Šค์ผ€์ด์Šค์˜ ์˜์—ญ์ด ๋ฉ๋‹ˆ๋‹ค. (Business/ Appliction Model)
Infrastructure : ์ดˆ๋ก์ƒ‰ ์˜์—ญ์ž…๋‹ˆ๋‹ค. (Data Access Logic)
Web: ํ•˜๋Š˜์ƒ‰ ์˜์–ต์œผ๋กœ ์›น View์ด์ฃ . (Presentation Logic)

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ๋‚˜๋‰˜๋Š”๋ฐ ํ•ด๋‹น ์š”์†Œ๋Š” ์–ด๋–ป๊ฒŒ๋˜๋ƒ?๋ผ๊ณ  ํ•˜์‹ ๋‹ค๋ฉด


[MS Docs]

์ด ๊ฒƒ์„ ์ฐธ์กฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. (ํ˜„์žฌ ์ •๋ฆฌํ•ด๋‘” ๋ฉ”๋ชจ๊ฐ€ ์ง€๊ธˆ ์—†๋„ค์š”, ์“ด ๋‚ด์šฉ ๊ณ ๋Œ€๋กœ ๋‹ค์‹œ ์“ฐ๋Š” ์ค‘ ์ž…๋‹ˆ๋‹คโ€ฆ)

2022.07.05 ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

14๊ฐœ์˜ ์ข‹์•„์š”