๋ฐฐ๊ฒฝ
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์ด ์ ๋ง๋ค์ด์ ธ์ผ๋ง ํ ์คํธํ ์ ์์์)
์๋ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅด๋ฉด์ ์์กด์ฑ์ ์ฃผ์ ํ์๋ค.
- ์ข ์/์ธ๋ถ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด ํด๋์ค์ ๋ถํ์ํ ์ฑ ์์ ํ๋ ์ ๊ฑฐํ๋ค. (๋ชฉํ๋ ๋จ์ผ์ฑ ์์์น์ ์งํค๋ ๊ฒ)
- 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 ๋ง๋ค๊ธฐ
์์กด์ฑ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ์ฐจ๋ฅผ ๊ฑฐ์ณค๋ค.
- ์์ฑ์๋ฅผ ์ฌ์ฉํด์ Container์ ์ธ์คํด์ค๋ฅผ ์ป๋๋ค. (Container๋ ์ฑ๊ธํค ์๋, ๋ฐ๋ผ์ ๋งค๋ฒ ์ ์ธ์คํด์ค ์์ฑ)
- DI Container์ DataFetcher๋ฅผ ๋ฑ๋กํ๊ณ Factory์์ ์์กด์ฑ์ resolve ๋๋ ์์ฑํ๋ ๋ฐฉ๋ฒ์ registerํ๋ค.
- ์ด์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์คํด์ค๋ฅผ ์ํ ๋ 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์ ์ํด ์๋์ ๋์์ด ์ํ๋๋ค.
- A์ ์์กด์ฑ์ธ B์ C๋ฅผ ์๋ณํ๋ค.
- B๋ฅผ resolve : ๋จผ์ , B์ ์์กด์ฑ์ ํ์ธํ๊ณ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ฉด ์๋ก์ด B ์ธ์คํด์ค(0x0000600002aa69d0)๋ฅผ ์์ฑํ๊ณ ๊ทธ๋ํ๊ฐ ์์ง ํด๊ฒฐ๋์ง ์์์ผ๋ฏ๋ก ๊ณต์ ์ปจํ ์ด๋์ ์ ์ฅํ๋ค.
- C๋ฅผ resolve : ๋จผ์ , C์ ์์กดํ๊ณ ์๋ B๋ฅผ ํ์ธํ๋ค. ๊ทธ๋ฐ ๋ค์ ๊ณต์ ์ปจํ ์ด๋๋ฅผ ํ์ธํ์ฌ ์ฃผ์๊ฐ (0x0000600002aa69d0)์ธ B ์ธ์คํด์ค๋ฅผ ์ฐพ๋๋ค. ์ด B ์ธ์คํด์ค๋ฅผ C ์์ฑ์ ํ ๋นํ๊ณ C ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ์ด์ A๋ ๋ชจ๋ ์์กด์ฑ์ ํด๊ฒฐํ์ผ๋ฏ๋ก A ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ํ๊ฐ ํด๊ฒฐ๋์์ผ๋ฏ๋ก ๊ณต์ ์ปจํ ์ด๋๊ฐ ์ญ์ ๋๋ค.
- ์ด์ A ๋ฐ C ํด๋์ค์ B ์ฃผ์๊ฐ ๋์ผํ๋ค.
Container ์ค์ฝํ
์ฑ๊ธํค์ผ๋ก๋ ์๋ ค์ง ์ค์ฝํ. ํ๋ฒ ๊ฐ์ฒด๊ฐ resolve๋๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ๋ชจ๋ resolve๋ฉ์๋์ ๋ํด ์ธ์คํด์ค๋ฅผ ๊ณต์ ํ๋ค.
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
'๐ iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
UI๋ฅผ ๋ฉ์ธ์ค๋ ๋์์ ๊ตฌํํด์ผํ๋ ์ด์ (1) | 2024.11.04 |
---|---|
Photos ํ๋ ์์ํฌ (0) | 2024.08.07 |
Photos ํ๋ ์์ํฌ ๊ณต์๋ฌธ์ ๋ฒ์ญ (0) | 2024.08.07 |
Class๋ฉ์๋์ Static๋ฉ์๋ (0) | 2023.06.08 |
Dependency Injection (์์กด์ฑ ์ฃผ์ ) (0) | 2023.05.04 |