Published on

๐ŸŽ Swift - ๋ชจ๋“ˆํ™”์™€ Clean Architecture

Authors
  • avatar
    Name
    ์ด์ฐฝ์ค€
    Twitter

Modular Architecture

MusicSpot ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋“ˆ๋Ÿฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฑ„ํƒํ•ด์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‚ฌ์‹ค "๋ชจ๋“ˆ๋Ÿฌ ์•„ํ‚คํ…์ฒ˜"์˜ ์–ด๋–ค ์žฅ์ ์„ ์‚ด๋ฆฌ๊ฒ ๋‹ค ๋Š” ์  ๋ณด๋‹ค๋Š”

๋ถ„๋ฆฌ๋œ ๊ฐ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ์‹œ์ผœ์„œ importํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก

์•„์ฃผ ๊ฐ•ํ•œ ์ œ์•ฝ์„ ๋‘๊ณ  ๊ฐ ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ฒ ๋‹ค!

์ธก๋ฉด์ด ๊ฐ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ๋ชฉ์ ์— ๋งž๊ฒŒ ๊ฐ ๋ ˆ์ด์–ด์˜ ๋…๋ฆฝ์ด ์•„์ฃผ ์ž˜ ์ด๋ฃจ์–ด์กŒ์–ด์•ผ๊ฒ ์ฃ ?

๊ณผ์—ฐ ๊ทธ๋žฌ์„๊นŒ์š”?

๋ฌธ์ œ๊ฐ€ ๋งŽ์•„ ๋ณด์ด๋Š” ํ˜„์žฌ ๊ตฌ์กฐ

์ง€๋‚œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋Œ์•„๋ณด๋ฉฐ, ๊ณผ์—ฐ ๋ชจ๋“ˆ๋Ÿฌ ์•„ํ‚คํ…์ฒ˜์˜ ์ฑ„ํƒ ๋ชฉ์ ์— ๋งž๊ฒŒ

์•„ํ‚คํ…์ฒ˜๋ฅผ "์ž˜" ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„๊นŒ? ๋ฅผ ๋Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Dependency ๊ทธ๋ž˜ํ”„๋ฅผ ํ•œ ๋ฒˆ ๊ทธ๋ ค๋ดค์Šต๋‹ˆ๋‹ค.

(์ €ํฌ ์•ฑ์€ Tuist๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋•€ํ•œ๋•€ ๊ทธ๋ ค์ค˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.)

๋„ค.. ๋งŽ์ด ์–ด์ง€๋Ÿฝ๋„ค์š” ใ…Ž..

์ด๋ฅผ ์กฐ๊ธˆ (๋งŽ์ด) ๋‹จ์ˆœํ™” ์‹œ์ผœ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์•„์ง‘๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ œ๊ฒŒ ์ƒ๊ธด ์˜๋ฌธ์ ์€ ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  1. Feature ํŒจํ‚ค์ง€ ์ค‘ MSCoreKit์˜ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  MSData์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€๊ฐ€?
  2. Feature ํŒจํ‚ค์ง€๊ฐ€ MSData์™€ MSDomain ๋ ˆ์ด์–ด๋ฅผ ๋ชจ๋‘ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค. MSDomain ๋ ˆ์ด์–ด๋Š” ์ง€๊ธˆ ํ˜•ํƒœ๊ฐ€ ์ตœ์„ ์ธ๊ฐ€?
  3. MSFoundation ํŒจํ‚ค์ง€, ํŠนํžˆ Logger์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๊ตฌ๋ถ„ ์—†์ด ์˜์กด์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ดœ์ฐฎ์€๊ฑด๊ฐ€?

ํ•˜๋‚˜ํ•˜๋‚˜ ๊ณ ๋ฏผํ•ด๋ด…์‹œ๋‹ค.

CoreKit์˜ ์˜์กด์„ฑ์€ ์–ด๋””๋ฅผ ํ–ฅํ•ด์•ผ ํ•˜๋Š”๊ฐ€

๊ฐ€์žฅ ํฐ ๊ณ ๋ฏผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

CoreKit์˜ ๋กœ์ง๋“ค์ด Feature ๋ชจ๋“ˆ๋“ค์— ์—ด๋ ค์žˆ์–ด๋„ ๋˜๋Š”๊ฐ€? ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค๋งŒ

Clean Architecture์˜ ์–ด๋–ค ๋ ˆ์ด์–ด์™€ ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ์ง€ ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €ํฌ๊ฐ€ ๋‚ด๋ ธ๋˜ CoreKit์— ๋Œ€ํ•œ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•ฑ์˜ ํ•ต์‹ฌ์ ์ธ ๋กœ์ง๋“ค์ด ํฌํ•จ๋œ ๋ชจ๋“ˆ

๋„คํŠธ์›Œํ‚น, ์บ์‹ฑ, ๋กœ์ปฌ ํŒŒ์ผ ์ €์žฅ ๋“ฑ ๋น„๊ต์  ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์žก์•„๋จน๋Š” ๋กœ์ง๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Presentation ๋ ˆ์ด์–ด๋ณด๋‹ค๋Š” Data ๋ ˆ์ด์–ด์™€์˜ ์—ฐ๊ด€์„ฑ์ด ํ›จ์”ฌ ๋†’์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Data ๋ ˆ์ด์–ด๊ฐ€ CoreKit ๋ชจ๋“ˆ์„ ์˜์กดํ•ด์•ผํ•˜๋Š” ์ด์œ ์˜€๊ณ , ์ด์ œ๋ถ€ํ„ฐ๋Š” Feature ๋ชจ๋“ˆ๋“ค์—์„œ์˜ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

Presentation ๋ ˆ์ด์–ด์—์„œ CoreKit์˜ ๋กœ์ง์„ ์™œ ํ•„์š”๋กœ ํ•˜๊ณ  ์žˆ์„๊นŒ์š”?

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

self.imageView.ms.setImage(url: someURL)

ImageFetcher ๋ชจ๋“ˆ์˜ UIImageView์— ๋Œ€ํ•œ extension์„ ํ™œ์šฉํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋‹คํ–‰ํžˆ ms๋กœ wrappingํ•œ ๋ถ€๋ถ„์„ UI ๋ชจ๋“ˆ์ชฝ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๋ณธ์ ์€ ๋ฌผ์Œ์— ๋Œ€ํ•œ ๋‹ต์€ ์–ด๋–ป๊ฒŒ ๋‚ด๋ฆฌ๋ฉด ๋ ๊นŒ์š”?

Presentation ๋ ˆ์ด์–ด์— ํ•ด๋‹นํ•˜๋Š” Feature ๋ชจ๋“ˆ๋“ค์€ CoreKit์— ๋Œ€ํ•œ ์˜์กด์„ ๊ฐ€์ ธ๋„ ๋˜๋Š”๊ฐ€?

CoreKit์„ ๋ชจ๋“ˆํ™”ํ•˜๊ณ , Data ๋ ˆ์ด์–ด์— ์˜์กด์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์žฅ์ ์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ตœ์™ธ๊ณฝ์ธ Presentation ๋ ˆ์ด์–ด์—์„œ ๋กœ์ง์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ๋Š์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ถ”์ƒํ™”ํ•œ Protocol์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ Presentation ๋ ˆ์ด์–ด์˜ ๋ณ€๊ฒฝ์ ์€ ์—†์Šต๋‹ˆ๋‹ค.
  2. Presentation ๋ ˆ์ด์–ด์— Repository๋ฅผ ์ฃผ์ž…์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์ ์€ ์ด ๋‘๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด 1. ์•ฝํ•œ ๊ฒฐํ•ฉ๊ณผ 2. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์žฅ์ ์„ ๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด Feature ๋ชจ๋“ˆ์ด CoreKit์— ์˜์กดํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์ด ๋˜๊ฒ ์ฃ ?

  1. CoreKit์˜ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ, ์ด ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  Feature ๋ถ€๋ถ„์˜ ์ฝ”๋“œ์— ๋ณ€๊ฒฝ์ด ๊ฐ€ํ•ด์ ธ์•ผ ํ•œ๋‹ค.
  2. Presentation ๋ ˆ์ด์–ด์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด CoreKit์„ ํ•„์ˆ˜์ ์œผ๋กœ import ํ•ด์•ผํ•œ๋‹ค. ์ฆ‰, CoreKit์˜ ๋ณ€ํ™”๊ฐ€ CoreKit ์ž์ฒด์˜ ํ…Œ์ŠคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ViewModel์˜ ํ…Œ์ŠคํŠธ์—๋„ ์˜ํ–ฅ์„ ์ค€๋‹ค.

๊ฒฐ๊ตญ ๋‹จ์ ์€ CoreKit์˜ ๋ณ€ํ™”๊ฐ€ ํŒŒํŽธํ™” ๋œ ์ฝ”๋“œ๋“ค์— ์˜ํ–ฅ์„ ์ฃผ๊ณ , ๋ณ€ํ™”๋ฅผ ๊ฐ•์ œํ•œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๊ฐˆํŒก์งˆํŒก Domain ๋ ˆ์ด์–ด

๋‘ ๋ฒˆ์งธ ์ฃผ์ œ, Feature ๋ชจ๋“ˆ๋“ค์ด Data ๋ ˆ์ด์–ด์™€ Domain ๋ ˆ์ด์–ด ๋ชจ๋‘๋ฅผ ์˜์กดํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ดœ์ฐฎ์€๊ฑด๊ฐ€? ์ž…๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ์ „์—, ์ €ํฌ ์•ฑ์€ UseCase๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ํ•„์š”์„ฑ์„ ๋Š๋ผ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”..

๋”ฐ๋ผ์„œ Domain ๋ ˆ์ด์–ด์—๋Š” ์‚ฌ์‹ค์ƒ Entity๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— Repository์˜ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Data ๋ ˆ์ด์–ด๋ฅผ, Entity ๋ชจ๋ธ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ Domain ๋ ˆ์ด์–ด๋ฅผ ๋ชจ๋‘ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

๊ทธ๋ ‡๋‹ค๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ Presentation ๋ ˆ์ด์–ด๊ฐ€ Domain ๋ ˆ์ด์–ด๋งŒ์„ ์˜์กดํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด UseCase๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๋„์ž…์˜ ์ด์œ ๋กœ์„œ ํƒ€๋‹นํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ˜„์žฌ ๊ตฌ์กฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ๊ฐ€? ํ•˜๋ฉด ๊ทธ๊ฒƒ๋„ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Feature ๋ ˆ์ด์–ด์—์„œ Data ๋ ˆ์ด์–ด์˜ DTO์™€ ๊ฐ™์€ ์›ํ•˜์ง€ ์•Š๋˜ ์š”์†Œ๋“ค์—๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Domain ๋ ˆ์ด์–ด ์ž์ฒด๋ฅผ ์†๋ด์•ผ๊ฒ ์ฃ ..?

์ž, ์ด์ฏค์—์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ˜„์žฌ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

์ €ํฌ ๊ตฌ์กฐ ์ƒ ํ•œ๊ฐ€์ง€ ํŠน์ดํ•œ ์ ์ด ์žˆ๋Š”๋ฐ์š”, ๋ฐ”๋กœ Domain ๋ ˆ์ด์–ด๊ฐ€ ๋‹ค๋ฅธ ์–ด๋–ค ๋ชจ๋“ˆ๋„ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์•ž์„œ๋„ ๋งํ–ˆ๋˜ Entity ๋ชจ๋ธ๋งŒ์ด Domain ๋ ˆ์ด์–ด์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”, ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตณ์ด Domain ๋ ˆ์ด์–ด๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”..?

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ดค๊ณ , ์ง์ ‘ ์‹คํ–‰ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

  1. Domain ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  Feature ๋ชจ๋“ˆ๋“ค์„ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ๋ฌถ์€ ํ›„, Shared Model ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  2. Data ๋ ˆ์ด์–ด์— ์žˆ๋Š” Repository protocol๋“ค์„ Domain ๋ ˆ์ด์–ด๋กœ ์˜ฎ๊ธด๋‹ค.

Shared Model ๋ฐฉ๋ฒ•

UseCase๊ฐ€ ์—†๋Š” Domain ๋ ˆ์ด์–ด๋ฅผ ๊ณผ์—ฐ Domain ๋ ˆ์ด์–ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์„๊นŒ๋ผ๋Š” ์˜๋ฌธ์—์„œ ์‹œ์ž‘๋œ ํ•ด๊ฒฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

Feature ๋ ˆ์ด์–ด๋ฅผ ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋กœ ๋ฌถ๊ณ , Shared Model ์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ์˜์กด์„ฑ์„ ๊ฐ–๋„๋ก ํ•ด์คฌ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋‹จ์ˆœํžˆ ์ด ํ˜•ํƒœ๋กœ๋Š” Data ๋ ˆ์ด์–ด์˜ ๋‹ค๋ฅธ ์š”์†Œ๋“ค์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Repository๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ Data ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์ œ๊ฑฐ๋˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Data ๋ ˆ์ด์–ด ๋‚ด๋ถ€์—์„œ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‚˜๋ˆ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Repository์˜ ์ถ”์ƒํ™”๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์„ ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•ด์ฃผ๊ณ , Feature ๋ ˆ์ด์–ด๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ์„ ์˜์กดํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์ถ”์ƒํ™” ํ”„๋กœํ† ์ฝœ์ด ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์กด์žฌํ•ด์•ผํ•œ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๋ฉด ๊ฝค ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ์•ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Feature ๋ชจ๋“ˆ๋“ค์€ Data ๋ ˆ์ด์–ด ์ค‘ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์˜์กดํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , Data ๋ ˆ์ด์–ด ๋˜ํ•œ Entity๋งŒ์„ ์˜์กดํ•˜๋ฉด์„œ ๋‹จ๋… ํ…Œ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Repository ํ”„๋กœํ† ์ฝœ ๋ฐฉ๋ฒ•

ํ˜„์žฌ ํ˜•ํƒœ๋ฅผ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•˜๋ฉด์„œ Feature ๋ ˆ์ด์–ด๊ฐ€ Data ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ๋Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•˜๋ฉด์„œ ๋‚˜์˜จ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

Feature ๋ชจ๋“ˆ์ด ํ•„์š”๋กœ ํ•˜๋Š” Data ๋ ˆ์ด์–ด์˜ ์š”์†Œ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ผ๊นŒ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด..

์•ž์„  ๋ฐฉ๋ฒ•์—์„œ๋„ ๋ณด์˜€๋“ฏ์ด ์‚ฌ์‹ค์€ Repository์˜ ์ถ”์ƒํ™” ํ”„๋กœํ† ์ฝœ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ๋งŒ Domain ๋ ˆ์ด์–ด๋กœ ์˜ฎ๊ฒจ์˜ค๋ฉด ๋˜์ง€ ์•Š์„๊นŒ!? ๋ผ๋Š” ์•„์ด๋””์–ด์— ๋„๋‹ฌํ•œ ๊ฒƒ์ด์ฃ !

๊ทธ๋ ‡๊ฒŒ ๋„๋‹ฌํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์œ„ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

Feature ๋ชจ๋“ˆ๋“ค (Presentation ๋ ˆ์ด์–ด) ๋Š” Domain ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ๊ฐ€์ง์œผ๋กœ์จ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Entity์™€ Data ๋ ˆ์ด์–ด์˜ ๋กœ์ง๋“ค์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋™์‹œ์— Data ๋ ˆ์ด์–ด์˜ ๊ตฌํ˜„๋ถ€๊ฐ€ ์•„๋‹Œ Protocol๋งŒ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„๋ถ€์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์˜์กด์„ฑ์€ ๋Š์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Data ๋ ˆ์ด์–ด ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Entity๋ฅผ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋…๋ฆฝ์ ์œผ๋กœ ๋กœ์ง์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , DTO์—์„œ Entity๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋กœ์ง ๋˜ํ•œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์ด ์˜ฌ๋ฐ”๋ฅธ ์ง€ ์ฐพ์•„๋ณด๋˜ ์ค‘์— ๋ฐœ๊ฒฌํ•œ๊ฑด๋ฐ... ์ด ํ˜•ํƒœ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์“ฐ์ด๋Š” ํ˜•ํƒœ์ธ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Domain ๋ ˆ์ด์–ด์— UseCase๋ฅผ ์“ด๋‹ค๋Š” ํฐ ์ฐจ์ด์ ์ด ์žˆ๊ธด ํ•˜์ง€๋งŒ์š”..?

์„ ํƒ์€..?

์ €ํฌ ์•ฑ์˜ ๊ฒฝ์šฐ๋Š” ๋‘ ํ˜•ํƒœ ๋ชจ๋‘ ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ณ€๊ฒฝ๋˜๋Š” ์‚ฌํ•ญ์ด ํ›„์ž์˜ ๊ฒฝ์šฐ๊ฐ€ ํ›จ์”ฌ ์ ๋‹ค.
  2. ์ดํ›„ UseCase๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•  ๊ฒฝ์šฐ ๋‘ ๋ฒˆ์งธ ํ˜•ํƒœ๊ฐ€ ํ›จ์”ฌ ๋ณ€๊ฒฝ์— ์šฉ์ดํ•˜๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ ์šฉ์„ ์‹œ๋„ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์˜ ๊ฒฝ์šฐ, ์ƒ๊ฐ๋ณด๋‹ค ๊ตฌ์กฐ์˜ ๋ณ€๊ฒฝ์ด ๋งŽ์ด ์ผ์–ด๋‚˜์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Feature ๋ชจ๋“ˆ๋“ค์ด ํ•˜๋‚˜๋กœ ๋ฌถ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ์ƒ๊ฐ๋ณด๋‹ค ๊ฝค ํฐ ์ž‘์—…์ด์˜€์Šต๋‹ˆ๋‹ค.

๋ฌด์—‡๋ณด๋‹ค (๋ฌผ๋ก  ์ด๊ฒƒ๋„ ์ œ ๋ถ€์กฑ์ด๊ฒ ์ง€๋งŒ) CI์˜ ํ˜•ํƒœ๋„ ๊ทน๋‹จ์ ์œผ๋กœ ๋ฐ”๋€Œ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค..

๋˜ํ•œ ์ดํ›„ UseCase์˜ ํ•„์š”์„ฑ์„ ๋Š๋ผ๊ฒŒ ๋˜๊ณ , Domain ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ํ•„์š”๊ฐ€ ๋”์šฑ ์ปค์ง€๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ํ›„์ž์˜ ๊ฒฝ์šฐ๊ฐ€ ํ›จ์”ฌ ๋ณ€๊ฒฝ์— ์šฉ์ดํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์ฐŒ๋๊ฑด Domain ๋ ˆ์ด์–ด๊ฐ€ ์œ ์ง€๋˜๋Š” ๋ฐฉํ–ฅ์ด๋‹ˆ๊นŒ์š”..!

๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” ํ›„์ž์˜ ๊ฒฝ์šฐ, Repository ํ”„๋กœํ† ์ฝœ์„ Domain ๋ ˆ์ด์–ด๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

UseCase๋Š” ๊ทธ๋Ÿผ ์–ธ์ œ ์จ์•ผํ•˜์ง€..?

์—ฌ๊ธฐ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด์„œ ๊ณ„์†ํ•ด์„œ ์ƒ๊ธด ์˜๋ฌธ์€ "๊ทธ๋Ÿผ ๋Œ€์ฒด UseCase๋Š” ์–ธ์ œ ์จ์•ผํ•˜์ง€?" ์˜€์Šต๋‹ˆ๋‹ค.

๋‚˜๋ฆ„๋Œ€๋กœ ๋‚ด๋ฆฐ ๊ฒฐ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ณต๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋งŽ์•„์ง€๋ฉด UseCase์˜ ๋„์ž…์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค. ์ž…๋‹ˆ๋‹ค.

์ €ํฌ ์•ฑ์˜ ๊ฒฝ์šฐ ์•„์ฃผ ์ž‘๊ธฐ ๋•Œ๋ฌธ์—.. ๋ฐ˜๋ณต๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ ๋งํ•˜์ž๋ฉด ์žˆ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•  ๋งŒํผ ๊ทธ ๊ทœ๋ชจ๊ฐ€ ํฌ์ง€ ์•Š๋‹ค. ๊ฐ€ ๋งž๋Š” ๋ง์ธ ๊ฒƒ ๊ฐ™๋„ค์š”.

๊ฐœ์ธ์ ์œผ๋กœ UseCase์˜ ๋„์ž… ์ž์ฒด๋Š” ํ…Œ์ŠคํŠธ๋‚˜ ๊ธฐํƒ€ ๊ตฌ์กฐ ์ƒ์˜ ์ด์ ์„ ์ฃผ๋Š” ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ƒ๊ฐ๋„ ์–ธ์  ๊ฐ€๋Š” ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ ? ๐Ÿ˜Š

๋งˆ์น˜๋ฉฐ

์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง์ ‘ ๋ชธ์œผ๋กœ ๋ถ€๋”ชํ˜€๊ฐ€๋ฉฐ ๋Š๋‚€ ์ ์€, ๊ฒฐ๊ตญ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋ผ๋Š” ๊ฒƒ์€ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด์„œ๋ผ๋Š” ๊ฒ๋‹ˆ๋‹ค.

์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์œ„ํ—˜๋„ ์–ธ์ œ๋‚˜ ๋„์‚ฌ๋ฆฌ๊ณ  ์žˆ์ง€๋งŒ, ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ๊ฒ ๋‹ค๋Š” ๋Š๋‚Œ์€ ๋ถ„๋ช… ์–ด๋”˜๊ฐ€ "๋ถˆํŽธ" ํ•œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ผ๊ฒ๋‹ˆ๋‹ค.

์ ‘๊ทผ๋˜์–ด์„œ๋Š” ์•ˆ๋˜๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์„œ ๋ถˆํŽธํ•˜๊ฑฐ๋‚˜,

ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ์˜์กด์„ฑ๋“ค์ด ๋งŽ์•„์ ธ์„œ ๋ถˆํŽธํ•˜๊ฑฐ๋‚˜..

์ด๋Ÿฐ ๋ถˆํŽธํ•จ๋“ค์„ ํ•ด์†Œํ•˜๊ณ ์ž ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ๋งˆ๊ตฌ์žก์ด๋กœ ์„ค๊ณ„ํ•ด์„œ๋Š” ๋˜ ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์— ์–ด๋–ป๊ฒŒ ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ณ€๊ฒฝ๋  ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€ํ•œ ํ™•์žฅ์— ์—ด๋ ค์žˆ๊ณ  ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ์ด๋ก ๋“ค์ด ๊ณ„์†ํ•ด์„œ ์ƒ๊ฒจ๋‚˜๊ณ , "๋ชจ๋˜" ํ•œ ์•„ํ‚คํ…์ฒ˜๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ๋Š์ž„์—†์ด ํ† ๋ก ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์™œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์žˆ๋Š” ์ง€ ๊ทธ ์ด์œ ๋ฅผ ํ•ญ์ƒ ์˜†์— ๋‘๊ณ  ๊ณ ๋ฏผํ•ด์•ผํ•˜๋Š” ์ฃผ์ œ์ธ ๊ฒƒ ๊ฐ™์•„์š”!