Skip to main content

Features Architecture

๋ชฉํ‘œโ€‹

ํ•ต์‹ฌ ๋ชฉํ‘œ๋Š” ๊ฐ„๊ฒฐํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ ์—ฐ๊ฒฐ๋œ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

์œ ๋ž˜โ€‹

(๋งˆ์ดํฌ๋กœํ”ผ์ฒ˜)๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ์ด ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ์‹คํ–‰๋˜๋Š” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ์œ ๋ž˜๋จ

๋ฐฐ๊ฒฝโ€‹

์•ฑ์€ ๊ธฐ๋Šฅ๋“ค๋กœ ๊ตฌ์„ฑ๋˜์žˆ์Œ. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋™์ผํ•œ ๋ชจ๋“ˆ์ด๋‚˜ ํƒ€๊ฒŸ์˜ ์ผ๋ถ€๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ๋™์ผํ•œ ๋ชจ๋“ˆ์ด๋‚˜ ํƒ€๊ฒŸ์˜ ์ผ๋ถ€๋กœ ํฌํ•จ๋˜๋ฉฐ, ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํฌํ•จ๋จ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ทธ ํ…Œ์ŠคํŠธ ํƒ€๊ฒŸ์€ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉฐ ๋ฒ„๊ทธ, ์„ฑ๋Šฅ์ด ์ข‹์ง€ ๋ชปํ•จ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์˜ ๋ฌธ์ œ์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

๋™๊ธฐโ€‹

ํฐ Xcode ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ™•์žฅ์„ฑ์„ ์ง€์›ํ•˜๋ฉด์„œ ํ”Œ๋žซํผ ๊ธฐ๋Šฅ๊ณผ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

React Native๋Š” javaScript์˜ ๋™์  ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ž‘์—…ํ•˜๋Š” ์ข‹์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์— ์‚ฌ์šฉ์ž ๊ด€์ ์—๋„ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

tuist ์นœ๊ตฌ๋“ค์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋„๊ตฌ์™€ ๊ธฐ์ˆ ์˜ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋Šฆ๊ฑฐ๋‚˜ ์ด๋ฅธ ์‹œ๊ธฐ์— ๋‚˜ํƒ€๋‚˜๋Š” ํ™•์žฅ์„ฑ์— ๊ด€๋ จ๋œ ๋„์ „๋“ค์„ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Œ

ํ•ต์‹ฌ ์›์น™โ€‹

  • ๊ฐœ๋ฐœ์ž๋“ค์€ ์•ฑ ๊ณผ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ž์‹ ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ• ๋ฐ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•จ

MFA๋ž€?โ€‹

์•„๋ž˜๋Š” ์‚ฌ์ „์— ์•Œ๊ณ  ๊ฐ€๋ฉด ์ข‹์€ ๊ฒƒ์„ ์ ์—ˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค?โ€‹

  • ๊ธฐ๋Šฅ์˜ ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ชจ๋ธ์„ ํฌํ•จํ•œ ํƒ€๊ฒŸ์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ?โ€‹

  • ๊ธฐ๋Šฅ์˜ ๋‹จ์œ„ ๋ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŒ…?โ€‹

  • ํ…Œ์ŠคํŠธ ๋ฐ ์˜ˆ์ œ ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  MFA ํด๋ž˜์Šค์™€ ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•จ

๊ธฐ๋Šฅ(Feature)?โ€‹

  • ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋ธ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ FeatureInterface์— ์ข…์†๋จ

๊ธฐ๋Šฅ ํ…Œ์ŠคํŒ…(FeatureTesting)?โ€‹

  • FeatureInterface์— ์ข…์†๋˜์–ด ๊ธฐ๋Šฅ ๋‚ด์— ํฌํ•จ๋œ ๋ชจ๋ธ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ๋ชจ์˜ ๊ฐ์ฒด๊ฐ€ ์žˆ์Œ

๊ธฐ๋Šฅ ์˜ˆ์ œ(FeatureExample)?โ€‹

  • ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค ํ•˜๊ธฐ ์œ„ํ•ด FeatureTesting์— ์ข…์†๋จ
  • Feature๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์˜ˆ์ œ ์•ฑ์—์„œ ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•จ
    • ์ดํ•ด ์‰ฝ๊ฒŒ
      • ๊ธฐ๋Šฅํ…Œ์ŠคํŒ…์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ๋ชจ์˜ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•จ
      • ๊ธฐ๋Šฅ ์˜ˆ์ œ๋Š” ์ด ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ ํ…Œ์ŠคํŒ…์— ์ข…์†๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์˜ˆ์ œ ์•ฑ์—์„œ ํŠน์ • ์ƒํ™ฉ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•จ
      • Feature๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์˜ˆ์ œ ์•ฑ์—์„œ ์ด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ ์‚ฌ์šฉ
        • ๊ธฐ๋Šฅ ์˜ˆ์ œ๋Š” ์‹ค์ œ๋กœ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์„ ์ธ์Šคํ„ด์Šคํ™” ํ•ฉ๋‹ˆ๋‹ค.
        • ์—ฌ๊ธฐ์„œ ์ด์ œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์ด๋ฅผ ๋ฐ๋ชจ๋ผ๊ณ  ํ•จ
      • ์š”์•ฝ
        • ๊ธฐ๋Šฅ ์˜ˆ์ œ๋Š” ๊ธฐ๋Šฅ ํ…Œ์ŠคํŒ…์—์„œ ์–ป์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‹ค์ œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์˜ˆ์ œ ์•ฑ์—์„œ ์‹œ์—ฐํ•จ

5๊ฐ€์ง€ ํƒ€๊ฒŸโ€‹

appโ€‹

  • ์‹ค์ œ ํ”„๋กœ๋•ํŠธ ๋ ˆ๋ฒจ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. APP์€ ์žฌ์‚ฌ์šฉ ๋ณด๋‹ค๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•ฉ์น˜๋Š” Composition ์—ญํ• ์„ ํ•จ

Featureโ€‹

  • Flow๋ฅผ ๋‹ด๋‹นํ•จ
  • ํ•˜๋‚˜์˜ Feature๋Š” ํ•˜๋‚˜์˜ ๋ฐ๋ชจ์•ฑ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ
  • UI์™€ ์œ ์ €์˜ ์•ก์…˜์„ ์ฒ˜๋ฆฌํ•˜๊ณ  UI์— ๋ฐ˜์˜์‹œํ‚ค๋Š” ๋น„์ง€๋‹ˆ์Šค๋กœ์ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

Domainโ€‹

  • ํ•˜๋‚˜์˜ ๊ด€์‹ฌ์‚ฌ ๋ณ„ ์—ญํ• ์„ ๋‹ด๋‹นํ•จ
  • api ๋กœ์ง๊ณผ ๋‚ด๋ถ€ Core ๋กœ์ง์„ ๋ฌถ์–ด์„œ Featrue์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ API์—์„œ DTO์™€ Feature์—์„œ ํ•„์š”ํ•œ Model ๋“ฑ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • CoreNetwork์™€ CoreKeyChain์„ ๋””ํŽœ๋˜์‹œ๋กœ ๊ฐ–์Šต๋‹ˆ๋‹ค.

Coreโ€‹

  • Core๋Š” ์ผ๋ฐ˜์ ์ธ ์—ญํ• ์„ ํ•จ
  • ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํˆด

Sharedโ€‹

  • Shared๋Š” ๋ชจ๋“  layer์—์„œ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉ๋  ๋ชจ๋“ˆ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ๋””์ž์ธ์‹œ์Šคํ…œ, ์œ ํ‹ธ, ๋กœ๊น…, ์ต์Šคํ…์…˜ ๋“ฑ ์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ๋  ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ธ๋‹ค.

Example

  • ๋ฐ๋ชจ์•ฑ์ด๋ผ๊ณ  ๋ถ€๋ฆ„
  • ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ์•ฑ ํƒ€๊ฒŸ

Tests

  • ํ…Œ์ŠคํŠธ
  • unit test

Testing

  • ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ชฉ์—…
  • interface ๋ชจ๋“ˆ์˜ Mocking์„ ์ œ๊ณต

Implment

  • ๊ตฌํ˜„ํ•˜๋Š” ๊ณณ
  • ์‹ค์ œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“ˆ

Interface

  • UI
  • feature ๊ธฐ๋Šฅ ์ค‘ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•  interface

์™œ MFA๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?โ€‹

๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ API

์•ฑ ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋ชจ๋‘ ๋™์ผํ•œ ํƒ€๊ฒŸ์— ์กด์žฌํ•˜๋ฉด ์ฝ”๋“œ ๋‚ด์— ์ข…์†์„ฑ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด๋‚ด๋ฉฐ ์Šค๋น ๊ผ๋  ์ฝ”๋“œ๊ฐ€
๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์€ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ƒํƒœ๊ฐ€ ๋–„๋กœ๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์  ํƒ€๊ฒŸ์œผ๋กœ ์ •์˜ํ•  ๋–„๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ API๋ฅผ ๊ฒฐ์ •ํ•ด์•ผํ•จ
  1. ๋ฌด์—‡์„ ๊ณต๊ฐœํ•˜๋Š”์ง€
  2. ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋Š”์ง€
  3. ๋ฌด์—‡์„ ๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•ด์•ผํ•˜๋Š”์ง€
  4. ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€
  5. ๋ฌด์—‡์„ ๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•ด์•ผํ•˜๋Š”์ง€

์ž‘์€ ๋ชจ๋“ˆ

์ž‘์€ ๋ชจ๋“ˆ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์€ ๋” ๋งŽ์€ ์ง‘์ค‘๋ ฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ๊ธฐ๋Šฅ์„ ๊ณ ๋ฆฝ๋˜ ์ƒํƒœ์—์„œ
ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋Š” ๋” ์„ ํƒ์ ์ธ ์ปดํŒŒ์ผ์„ ๊ฐ€์ง€๋ฏ€๋กœ ๊ธฐ๋Šฅ์ด
์ž‘๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ์š”์†Œ๋งŒ ์ปดํŒŒ์ผ ํ•˜๊ธฐ์— ๋” ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

์žฌ์‚ฌ์šฉ์„ฑ

๋‹ค๋ฅธ ์•ฑ๊ณผ์˜ ํ™•์žฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ๋ฐฐํฌ

๋ฐ๋ชจ์•ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ๋””์ž์ด๋„ˆ, QA์™€ ํ˜‘์—…์ด ๋†’์•„์ง„๋‹ค

Feature์˜ ์ข…๋ฅ˜โ€‹

Foundation

๋‹ค๋ฅธ Feature๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฐ˜ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

ex) UI ๊ตฌ์„ฑ ์š”์†Œ, ํ…Œ์ŠคํŒ… ๋„๊ตฌ, ์•ฑ์˜ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Core์— ์†ํ•จ

Product

์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์ฒดํ—˜ํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ex) ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ, ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ๋กœ์ง, ํ™ˆํ™”๋ฉด๊ณผ ๊ฐ™์€ ์ฃผ์š”๊ธฐ๋Šฅ์ด ์†ํ•จ

Feature ๊ฐ„์˜ ์˜์กด์„ฑโ€‹

ํ•˜๋‚˜์˜ Feature๊ฐ€ ๋‹ค๋ฅธ Feature์— ์˜์กดํ•  ๋–„ 2๊ฐ€์ง€ ์žฅ์ ์ด ์ƒ๊น€

  1. ๊ฐ Feature์˜ ์‹ค์ œ ๋‚ด๋ถ€ ์ž‘๋ฅ์ด ๋‹ค๋ฅธ Featrue์˜ ๋‚ด๋ถ€์™€ ์—‰์ผœ์„œ ์–ฝํžˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  2. ์ฒ˜์Œ๋ถ€ํ„ฐ ์•ฑ์„ ๋งŒ๋“ค ๋–„ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์„ ํƒํ•ด์„œ ๋นŒ๋“œํ•˜๊ธฐ์— ๋นŒ๋“œ ์†๋„๊ฐ€ ๋นจ๋ผ์ง

์ฐธ๊ณ โ€‹

https://swiftrocks.com/reducing-ios-build-times-by-using-interface-targets

https://docs.tuist.io/building-at-scale/microfeatures/#product

https://alexanderweiss.dev/blog/2022-01-12-scale-up-your-app-with-microfeatures

์ฐธ๊ณ  ๊ฐœ๋ฐœ ์ฝ”๋“œ

https://github.com/tuist/microfeatures-example