๐ŸŽ iOS/Swift

Swinject๋ฅผ ์‚ฌ์šฉํ•œ iOS ์˜์กด์„ฑ ์ฃผ์ž…

JerryiOS 2023. 5. 9. 22:07

๋ฐฐ๊ฒฝ

Inversion Of Control (์ œ์–ด์˜ ์—ญ์ „)

๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ฐ์ฒด๋‚˜ ๋ฉ”์„œ๋“œ์˜ ์ œ์–ด๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์— ์œ„์ž„ํ•˜๋Š” ์„ค๊ณ„ ์›์น™

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ฝ”๋“œ์—์„œ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผํ•œ๋‹ค.

 

์˜์กด์„ฑ ์ฃผ์ž…

ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ 

์˜์กด์„ฑ ์ฃผ์ž…์€ IOC๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.

 

์ด๊ฒƒ์˜ ์ด๋ฉด์— ์žˆ๋Š” ์•„์ด๋””์–ด๋Š” ๋ณ„๋„์˜ ๊ฐœ์ฒด๊ฐ€ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด์ 

1. ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ํŽธํ•˜๋‹ค.

2. ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

DI Container

๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ์žˆ๋Š” ๊ฐ์ฒด

DI Container๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

๋ณต์žกํ•œ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

Swinject

Swift ์•ฑ์„ ์œ„ํ•œ ๊ฒฝ๋Ÿ‰ ์˜์กด์„ฑ ์ฃผ์ž… ํ”„๋ ˆ์ž„์›Œํฌ

Swinject๋ฅผ ํ†ตํ•ด ์•ฑ์„ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ Component๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.

 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ธฐ

์šฐ๋ฆฌ๋Š” 'NetworkManager' ํด๋ž˜์Šค์˜ loadData ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด์•ผ ํ•œ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” URLSession์œผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋ชจ๋ธ์˜ response๋ฅผ ๋””์ฝ”๋”ฉํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋  ๋•Œ๊นŒ์ง€๋Š” ์ด ๋ฐฉ๋ฒ•์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์—†๋‹ค.

๊ฒฐ๊ตญ ์ด๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์ผ ๋•Œ, ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ์˜ URLSession์„ ์ฃผ์ž…ํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์–ด๋–ป๊ฒŒ๋“  ๋ชจ์˜์ฒ˜๋ฆฌํ•˜๋ฉด ์–ด๋–จ๊นŒ?

 

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ชจ์˜์„œ๋ฒ„ ์—ญํ• ์„ ํ•ด์ค„ MockUrlSession๊ณผ MockUrlSessionDataTask ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” urlSession ์†์„ฑ์„ ๋งŒ๋“ค๊ณ  ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…ํ–ˆ๋‹ค.

์ด์ œ NetworkManager๋Š” urlSession์„ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•˜๋ฏ€๋กœ UrlSession์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์—†๋‹ค.

(์ด์ „์—๋Š” NetworkManager๊ฐ€ UrlSession์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ์—ˆ๋‹ค.

์ธํ„ฐ๋„ท์ด ์ž˜๋˜์„œ UrlSession์ด ์ž˜ ๋งŒ๋“ค์–ด์ ธ์•ผ๋งŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์—ˆ์Œ)

์•„๋ž˜ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ฅด๋ฉด์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์˜€๋‹ค.

  1.  ์ข…์†/์™ธ๋ถ€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค์˜ ๋ถˆํ•„์š”ํ•œ ์ฑ…์ž„์„ ํ•˜๋‚˜ ์ œ๊ฑฐํ–ˆ๋‹ค. (๋ชฉํ‘œ๋Š” ๋‹จ์ผ์ฑ…์ž„์›์น™์„ ์ง€ํ‚ค๋Š” ๊ฒƒ)
  2. Intiializer Injection ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์ฃผ์ž…์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

์ด์ œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์›Œ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Swinject๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

DI Container๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ด๋„ˆ ํŒจํ„ด์ด๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์˜์กด์„ฑ ์ฃผ์ž…์˜ ์ด์ ์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ผญ DI Container๊ฐ€ ํ•„์š”ํ•œ ๊ฑด ์•„๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜์กด์„ฑ์ด ๋งŽ์€ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ DI Container๊ฐ€ ์ •๋ง ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Swinject๋Š” Swift์—์„œ DI Container๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

 

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ ClientA์™€ ClientB ๋ชจ๋‘ DataFetcher์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค.

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…์„ ํ•˜๊ณ ์žˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ๋ฌด์—‡์„ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?

  • ClientA์™€ ClientB์— ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.
  • ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ณณ์ด ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค..

์—ฌ๊ธฐ์„œ DI Container๊ฐ€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

DI Container๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํƒ€์ž… ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

1. ์˜์กด์„ฑ๊ณผ ํ•จ๊ป˜ resolve๋˜์–ด์•ผ ํ•˜๋Š” ํƒ€์ž…๋“ค์„ ๋“ฑ๋กํ•œ๋‹ค.
2. DI Container๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์ด DI Container์— ์˜ํ•ด ์ž๋™์œผ๋กœ resolve๋˜๋Š” ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

Swinject๋กœ DI Container๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๋ช‡๊ฐ€์ง€ ์šฉ์–ด๋ฅผ ์ •์˜ํ•ด๋ณด์ž.

 

์šฉ์–ด

  • Service : ์˜์กด ํƒ€์ž…์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
  • Component : ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹ค์ œ ํƒ€์ž…
  • Factory : Component/์˜์กด ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ํด๋กœ์ € (์˜ˆ์ œ์—์„œ๋Š” DataFetcher)
  • Container : Component ์ธ์Šคํ„ด์Šค๋“ค์˜ ์ง‘ํ•ฉ (์˜์กด ๊ฐ์ฒด๊ฐ€ register๋˜๊ณ  resolve๋˜๋Š” DI Container)

DI Container ๋งŒ๋“ค๊ธฐ

์˜์กด์„ฑ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณค๋‹ค.

  1. ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ Container์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๋Š”๋‹ค. (Container๋Š” ์‹ฑ๊ธ€ํ†ค ์•„๋‹˜, ๋”ฐ๋ผ์„œ ๋งค๋ฒˆ ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ)
  2. DI Container์— DataFetcher๋ฅผ ๋“ฑ๋กํ•˜๊ณ  Factory์—์„œ ์˜์กด์„ฑ์„ resolve ๋˜๋Š” ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ registerํ•œ๋‹ค.
  3. ์ด์ œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์Šคํ„ด์Šค๋ฅผ ์›ํ•  ๋•Œ resolve ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    (DI Container๋Š” ์ด ํƒ€์ž…์˜ Service๊ฐ€ ์ด๋ฏธ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ์ง€ ํ™•์ธํ•œ๋‹ค.)

๋งŒ์•ฝ Service๊ฐ€ ์ด๋ฏธ ๋“ฑ๋ก๋œ ๊ฒฝ์šฐ Factory ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์˜์กด์„ฑ์„ resolveํ•œ ํ›„, ๋ชจ๋“  ์˜์กด ๊ฐ์ฒด๊ฐ€ ์ฑ„์›Œ์ง„ ์ƒˆ๋กœ์šด DataFetcher ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

(registerํ•  ๋•Œ์™€ resolveํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.)

 

Fetcher ํ”„๋กœํ† ์ฝœ register/resolve

์ด์ œ Fetcher.self๋ฅผ Service ํ”„๋กœํ† ์ฝœ๋กœ ๋“ฑ๋กํ•˜๊ณ  DI Container๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ resolveํ•œ๋‹ค.

 

Named Registration

์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋™์ผํ•œ Fetcher ํ”„๋กœํ† ์ฝœ์„ 2๋ฒˆ resolveํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

๋™์ผํ•œ Service ํƒ€์ž… ํ”„๋กœํ† ์ฝœ์„ registerํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ DI Container์˜ Named Registration์„ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„์—์„œ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ resolve ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ name ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

 

argument ์ „๋‹ฌ

DI Container์— ์˜ํ•ด resolve๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋™์  ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค.

์ด๋•Œ DI Container์˜ argument๋ฅผ ์‚ฌ์šฉํ•œ ๋“ฑ๋ก์ด ์ค‘์š”ํ•ด์ง„๋‹ค.

register ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” Factory ํด๋กœ์ €๋Š” Service๊ฐ€ resolve ๋  ๋•Œ ์ „๋‹ฌ๋˜๋Š” argument๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

argument๋Š” ์œ„์—์„œ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ Swinject์—์„œ๋Š” ์ตœ๋Œ€ 9๊ฐœ์˜ argument๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Container ์‹ฑ๊ธ€ํ†ค ๋งŒ๋“ค๊ณ  ์จ๋ณด๊ธฐ

์ด์ œ Container ํด๋ž˜์Šค์˜ ํ™•์žฅ์„ ์ด์šฉํ•ด sharedContainer ์†์„ฑ์„ ์ƒ์„ฑํ–ˆ๋‹ค.

์ด ์†์„ฑ์€ ๋ชจ๋“  ๋“ฑ๋ก์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ Container์˜ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๋˜ํ•œ register ๋ฉ”์„œ๋“œ์˜ ํŒฉํ† ๋ฆฌ ํด๋กœ์ €์—์„œ DataFetcher์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ Container์— ์•Œ๋ฆฌ๊ณ  ์žˆ๋‹ค.

 

Client๋“ค์€ ํด๋ž˜์Šค์—์„œ resolve ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , DataFetcher์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ง€์‹œํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ปจํ…Œ์ด๋„ˆ๋Š” Factory ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์˜์กด์„ฑ์„ resolve ํ•œ ํ›„ DataFetcher์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ DI Container์˜ ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” "๋ณต์žกํ•œ ์˜์กด์„ฑ"์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ํ•œ ๊ณณ์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

๊ฐ์ฒด ์Šค์ฝ”ํ”„ (Object Scope)

DI Container์—์„œ ์ œ๊ณต๋˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๊ณ ์œ ๋˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ์˜ต์…˜. Swinject์—์„œ๋Š” ๋„ค ๊ฐ€์ง€ ์ง€์›

DataFetcher.self์— ๋Œ€ํ•ด resolve๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. (๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฆ„)

ํ•˜์ง€๋งŒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ด ๋•Œ ๊ฐ์ฒด ์Šค์ฝ”ํ”„๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

 

๊ทธ๋ž˜ํ”„ ์Šค์ฝ”ํ”„ (๊ธฐ๋ณธ ์Šค์ฝ”ํ”„)

resolve๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ๊ทธ๋ž˜ํ”„๋ฅผ resolveํ•˜๋Š” ๋™์•ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

Class A๋Š” B์™€ C์— ์˜์กดํ•˜๊ณ , Class C๋Š” B์— ์˜์กดํ•œ๋‹ค.

 

A๋ฅผ resolveํ•  ๋•Œ resolver์— ์˜ํ•ด ์•„๋ž˜์˜ ๋™์ž‘์ด ์ˆ˜ํ–‰๋œ๋‹ค.

  1. A์˜ ์˜์กด์„ฑ์ธ B์™€ C๋ฅผ ์‹๋ณ„ํ•œ๋‹ค.
  2. B๋ฅผ resolve : ๋จผ์ €, B์˜ ์˜์กด์„ฑ์„ ํ™•์ธํ•˜๊ณ  ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ƒˆ๋กœ์šด B ์ธ์Šคํ„ด์Šค(0x0000600002aa69d0)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๊ณต์œ  ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅํ•œ๋‹ค.
  3. C๋ฅผ resolve : ๋จผ์ €, C์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” B๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ณต์œ  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ฃผ์†Œ๊ฐ€ (0x0000600002aa69d0)์ธ B ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ๋Š”๋‹ค. ์ด B ์ธ์Šคํ„ด์Šค๋ฅผ C ์†์„ฑ์— ํ• ๋‹นํ•˜๊ณ  C ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  4. ์ด์ œ A๋Š” ๋ชจ๋“  ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ–ˆ์œผ๋ฏ€๋กœ A ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜ํ”„๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ๊ณต์œ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.
  5. ์ด์ œ A ๋ฐ C ํด๋ž˜์Šค์˜ B ์ฃผ์†Œ๊ฐ€ ๋™์ผํ•˜๋‹ค.

 

Container ์Šค์ฝ”ํ”„

์‹ฑ๊ธ€ํ†ค์œผ๋กœ๋„ ์•Œ๋ ค์ง„ ์Šค์ฝ”ํ”„. ํ•œ๋ฒˆ ๊ฐ์ฒด๊ฐ€ resolve๋˜๋ฉด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  resolve๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

Container ์Šค์ฝ”ํ”„

Transient ์Šค์ฝ”ํ”„

ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์Šค์ฝ”ํ”„. (์ปจํ…Œ์ด๋„ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋Š” ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค.)

์ธ์Šคํ„ด์Šค๋“ค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Custom ์Šค์ฝ”ํ”„

์‚ฌ์šฉ์ž ์ •์˜ ์Šค์ฝ”ํ”„. (.custom ๋‚ด์—์„œ์˜ ์ธ์Šคํ„ด์Šค๋Š” .container ์Šค์ฝ”ํ”„์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ณต์œ ๋˜์ง€๋งŒ ํ•„์š”์— ๋”ฐ๋ผ ํ๊ธฐ ๊ฐ€๋Šฅ)

1. ๊ฐ์ฒด ์Šค์ฝ”ํ”„๋ฅผ ํ™•์žฅํ•ด์„œ custom ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ €์žฅ ํƒ€์ž…์˜ ์Šค์ฝ”ํ”„๋ฅผ PermanentStorage๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.
(์ €์žฅ๋œ ์ธ์Šคํ„ด์Šค๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํ๊ธฐ ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€)

 

2. UserSession์„ custom ์Šค์ฝ”ํ”„๋กœ ๋“ฑ๋กํ–ˆ๋‹ค.

3. loginUser ๋ฉ”์„œ๋“œ์—์„œ UserSession์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ† ํฐ์„ ์„ค์ •ํ–ˆ๋‹ค.

4. ์ด์ œ UserSession์„ resolveํ•  ๋•Œ๋งˆ๋‹ค ์ฝ˜์†”์— ํ‘œ์‹œ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

5. logOut์—์„œ๋Š” ์ด ์Šค์ฝ”ํ”„๋ฅผ ํ๊ธฐํ•ด์„œ ์•ž์œผ๋กœ UserSession์„ resolveํ•˜๋ฉด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค.

 

๋ช‡ ๊ฐ€์ง€ ํฌ์ธํŠธ

  • Registration Keys : Container์—๋Š” Service๋ฅผ ์œ„ํ•ด Compoent๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑ๋œ ํ‚ค๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. Container๋Š” Service ์˜์กด์„ฑ์„ resolveํ•˜๋ ค๊ณ ํ•  ๋•Œ ์ด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Value Types injections : ์ด์ „ ์˜ˆ์ œ์—์„œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ๊ตฌ์กฐ์ฒด(Struct)๋„ resolveํ•  ์ˆ˜ ์žˆ๋‹ค. (Value ํƒ€์ž…์—๋Š” ์•ฝํ•œ ์Šค์ฝ”ํ”„(weak scope)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.)

 


Ref

https://ali-akhtar.medium.com/ios-dependency-injection-using-swinject-9c4ceff99e41

๋ฐ˜์‘ํ˜•