Skip to content

Clean Architecture

Jaeyong edited this page May 15, 2022 · 10 revisions

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ „์ฒด์ ์ธ ๊ฐœ๋…

  • ๋งˆํ‹ด์ด ๊ณ ์•ˆํ•ด ๋‚ธ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ๋…
  • ์ด์ง€๋งŒ, ์‚ฌ์‹ค ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ด๋Ÿฌํ•œ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์—‰ํด ๋ฐฅ, ์•„๋‹ˆ ๋กœ๋ฒ„ํŠธ C.๋งˆํ‹ด์ด ์ •๋ฆฌํ•œ ๊ฒƒ.

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ํŠน์ง•

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

์˜์กด ๊ทœ์น™

  • ๋™์‹ฌ์› ์•ˆ์ชฝ์œผ๋กœ ๋“ค์–ด๊ฐˆ์ˆ˜๋ก ๊ณ ์ˆ˜์ค€์˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋œ๋‹ค.
    • ๋ฐ”๊นฅ์ชฝ ์›์€ ๋งค์ปค๋‹ˆ์ฆ˜์ด๊ณ  ์•ˆ์ชฝ ์›์€ ์ •์ฑ…์ด๋‹ค.
    • ๊ณ ์ˆ˜์ค€๊ณผ ์ €์ˆ˜์ค€์˜ ์˜๋ฏธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
  1. ๊ณ ์ˆ˜์ค€ : ์ถ”์ƒํ™”๋œ ๊ฐœ๋…, ์ƒ์œ„ ์ˆ˜์ค€, ์ •์ฑ…
  • ์˜ˆ์‹œ : ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค. ์ผ๊ธฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  1. ์ €์ˆ˜์ค€ : ์„ธ๋ถ€์ ์ธ ๊ฐœ๋…, ๋งค์ปค๋‹ˆ์ฆ˜, ๊ณ ์ˆ˜์ค€์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์„ธ์„ธํ•œ ๊ฐœ๋…
  • ์˜ˆ์‹œ : SQLite3์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์†Œ์Šค์ฝ”๋“œ์˜ ์˜์กด์„ฑ์€ ๋ฐ˜๋“œ์‹œ ์•ˆ์ชฝ์œผ๋กœ, ๊ณ ์ˆ˜์ค€์˜ ์ •์ฑ…์„ ํ–ฅํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‚ด๋ถ€์˜ ์›์€ ๋ฐ”๊นฅ ์›์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹๋„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ฆ‰, ์™ธ๋ถ€๊ฐ€ ๋‚ด๋ถ€์— ์˜ํ–ฅ์„ ๋ฏธ์ณ์„œ๋Š” ์ ˆ๋Œ€๋กœ ์•ˆ๋œ๋‹ค.
  • ์ด๋Š” DTO๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‚˜์ค‘์— ๋‹ค๋ฃจ์ž. (DTO๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ถ€์—์„œ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ์ „ํ™˜ํ•œ๋‹ค.)

์—”ํ‹ฐํ‹ฐ (Entity)

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…

  • ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๊ฐ€ ๋˜๊ฑฐ๋‚˜ ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, ํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

  • iQA ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Domain Layer์—์„œ ์œ ์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ์ •์˜ํ–ˆ๋‹ค.

  • Presentation Layer๋‚˜ Data Layer์—์„œ ์—”ํ‹ฐํ‹ฐ ์‚ฌ์šฉ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Domain Layer์—์„œ๋Š” ์œ ์ผํ•˜๊ฒŒ ์—”ํ‹ฐํ‹ฐ๋งŒ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

์œ ์Šค์ผ€์ด์Šค (UseCase)

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠนํ™”๋œ ์—…๋ฌด ๊ทœ์น™์„ ์ž‘์„ฑ

  • ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง์„ ์บก์Šํ™”ํ•˜๊ณ  ๊ตฌํ˜„ํ•œ๋‹ค.

  • UI, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ๋ณ€๊ฒฝ์ด ์ด ๊ณ„์ธต์— ์˜ํ–ฅ์„ ์ฃผ๋ฉด ์•ˆ๋œ๋‹ค. (์™„์ „ ๊ฒฉ๋ฆฌ)

  • ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

  • iQA ํ”„๋กœ์ ํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•˜์—ฌ SQL๋ฌธ์œผ๋กœ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์œ ์ฆˆ์ผ€์ด์Šค์— ๋‹ด์•˜๋‹ค. (์ •๋ ฌ ๊ธฐ๋Šฅ, find ๊ธฐ๋Šฅ)

  • Data Layer์˜ ๋ฐ์ดํ„ฐ์˜ ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ Repository๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ด๋Š” ํ”„๋กœํ† ์ฝœ์ด๋ฏ€๋กœ ๊ตฌ์„ฑ์ด ์–ด๋–ป๊ฒŒ ๋˜์–ด ์žˆ๋Š” ์ง€๋Š” ๋ชจ๋ฅธ๋‹ค. (DIP์›์น™)

์ธํ„ฐํŽ˜์ด์Šค ์–ด๋Œ‘ํ„ฐ

  • Gateways, Controllers, Presenters๊ฐ€ ์†ํ•ด ์žˆ๋Š” Layer

  • UseCases์—์„œ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์—์„œ DB, UI ๋“ฑ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ format์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณณ์ด๋‹ค.

  • iQA ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Repositoryํด๋”์™€ ViewModel์ด๋‹ค.

  • Repository๋Š” ๊ฐ€์žฅ ๋ฐ”๊นฅ ์ชฝ ์›์ธ SQLiteDatasource์„ UseCase์™€ ์ด์–ด์ฃผ๋ฉฐ format์„ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” layer์ด๋‹ค.

  • ViewModel์€ VC์™€ UseCase๋ฅผ ์ด์–ด์ฃผ๋Š” ์–ด๋Œ‘ํ„ฐ๋กœ, UseCase์˜ foramt์„ View์—์„œ ์‚ฌ์šฉ๋˜๋Š” format์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

Frameworks and Drivers

  • ๊ฐ€์žฅ ๋ฐ”๊นฅ ์ชฝ ๋ ˆ์ด์–ด์ด๋‹ค.
  • ์ฆ‰, DB๋‚˜ UI ๋“ฑ๊ณผ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋„๊ตฌ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

Crossing boundaries (๊ฒฝ๊ณ„ ํšก๋‹จ)

  • UseCase๊ฐ€ Repository๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.
  • ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ ์˜์กด ๊ทœ์น™์„ ์œ„๋ฐฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—
  • UseCase๊ฐ€ ๋‚ด๋ถ€ ์›์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜๊ณ , ์™ธ๋ถ€ ์›์˜ Repository๊ฐ€ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค. (DIP ์›์น™)