SwiftUI + TCA๋ฅผ ํ์ฉํ iOS ์ฌํ ๊ธฐ๋ก ๋ฐ ๊ณต์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
Boleto๋ ์ฌํ์ ๋ชจ๋ ์๊ฐ์ ๊ธฐ๋กํ๊ณ , ๋๋ง์ ๋ฐฉ์์ผ๋ก ๊พธ๋ฐ ์ ์๋ ์ฌํ ๊ธฐ๋ก ๋ฐ ๊ณต์ ์ฑ์
๋๋ค.

- 1.1 ๋ฒ์ : ํฌ๋ฆฌ์ค๋ง์ค ํฐ์ผ, ์ธ์คํ๊ทธ๋จ ์คํ ๋ฆฌ ๊ณต์ ๊ธฐ๋ฅ ์ถ๊ฐ
- 1.2 ๋ฒ์ : ์ค๋ ํฐ์ผ ๋ฐ ์ฌ์ง ํธ์ง ๊ธฐ๋ฅ ์ถ๊ฐ
- 1.3 ๋ฒ์ : ์ด๋ฏธ์ง ํธ์ง ๊ธฐ๋ฅ ์ถ๊ฐ
- iOS: 17.0+
- Xcode: 15.0+
- Swift: 5.9+
- CLMonitor ๋ฐ CLServiceSession์ ํ์ฉํ์ฌ ํน์ ๋ช ์ ๋์ฐฉ ์ ์คํฐ์ปค์ ์ฌ์ฉ์ ๋ง์ถค ํ๋ ์ ํ๋
- ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ ๋ฐ ๋ก์ปฌ ์๋ฆผ ์ง์
- ํ๋ํ ์คํฐ์ปค์ ํ๋ ์์ ์ด์ฉํด ๋ค์ปท ๋๋ ํด๋ผ๋ก์ด๋ ํฐ์ผ ๊พธ๋ฏธ๊ธฐ
- ์ ์ค์ฒ๋ฅผ ํตํด ์คํฐ์ปค ํ๋, ์ถ์, ํ์ ๋ฑ ์์ ๋ก์ด ํธ์ง
- ๋ค์ํ ํํฐ๋ฅผ ํตํด ์ฌ์ง์ ์ปค์คํ ํํ๊ธฐ
- ์ฌํ ์ผ์ , ์ฅ์, ๋ํ์๋ฅผ ๊ธฐ๋กํ ๋์งํธ ํฐ์ผ ์์ฑ
- ์ค์๊ฐ ํฐ์ผ ๊ณต๋ ํธ์ง ๋ฐ ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํ Lock/Unlock ๊ด๋ฆฌ
- ์ ๋๋ฒ์ค ๋งํฌ๋ฅผ ํตํด ์น๊ตฌ ์ด๋ ๋ฐ ์ฌํ ๊ธฐ๋ก ๊ณต์
- ์ธ์คํ๊ทธ๋จ ์คํ ๋ฆฌ ๊ณต์ ๊ธฐ๋ฅ ์ง์
- Metal Shading Language(MSL)๋ฅผ ํ์ฉํ ์ปค์คํ ์ด๋ฏธ์ง ํํฐ ๊ตฌํ
- GPU ๊ฐ์์ ํตํ ์ค์๊ฐ ์ด๋ฏธ์ง ํ๋ก์ธ์ฑ์ผ๋ก ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ ์ ๊ณต
- ๋ค์ํ ์คํ์ผ์ ํํฐ ์ ๊ณต
- SwiftUI: ์ ์ฒด UI ๊ตฌ์ฑ ๋ฐ ์ ๋๋ฉ์ด์ ๊ตฌํ
- UIKit: ShareLink ๊ด๋ จ ๊ธฐ๋ฅ UIViewRepresentable๋ก ๋ณด์
- CoreLocation: ์์น ์ด๋ฒคํธ ๋ชจ๋ํฐ๋ง ๋ฐ ์คํฐ์ปค ์ ๊ณต
- SwiftData: ์คํฐ์ปค ๋ฐ ํ๋ ์ ๋ก์ปฌ ์บ์ฑ
- Alamofire: RequestInterceptor๋ฅผ ํตํ ์ธ์ฆ ํ ํฐ ์๋ ๊ฐฑ์ ๋ฐ API ํต์
- Metal Framework: GPU ๊ฐ์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฐ ์ปค์คํ ํํฐ ๊ตฌํ
- Composable Architecture (TCA):
- ์ด ํ๋ก์ ํธ๋ Composable Architecture (TCA) ๋ฅผ ์ค์ฌ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ์ฃผ์ ๋ชฉํ๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ, ๋ช ํํ ์ํ ๊ด๋ฆฌ, ๋ชจ๋ํ ํตํด ์ฝ๋์ ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ๊ทน๋ํํ๋ ๊ฒ์ ๋๋ค.
๋ชจ๋ ์ํ ๋ณํ๋ Action โ Reducer โ State์ ํ๋ฆ์ ๋ฐ๋ฆ
๋๋ค. ์ด๋ฅผ ํตํด ์ํ ๋ณ๊ฒฝ์ ๋ช
ํํ๊ฒ ์ถ์ ํ ์ ์์ผ๋ฉฐ, ๋๋ฒ๊น
์ด ์ฉ์ดํฉ๋๋ค.
๊ฐ ํ๋ฉด์ด๋ ์ฃผ์ ๊ธฐ๋ฅ์ Reducer๋ก ๊ตฌํ๋์์ผ๋ฉฐ, ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ํ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ธฐ๋ฅ๋ณ๋ก ๋
๋ฆฝ์ ์ธ ๋ชจ๋ํ๋ฅผ ์ด๋ฃจ์์ต๋๋ค.

AppFeature: ์ฑ ์ ์ฒด์ ์ํ ๊ด๋ฆฌNavigationFeature: ํ๋ฉด์ ํ ๊ด๋ฆฌMonitoringFeature: ์์น ์ถ์ ๋ก์ง ์์ ๊ด๋ฆฌLoginFeature: ์นด์นด์ค ๋ฐ ์ ํ ๋ก๊ทธ์ธ ํ๋ก์ฐ ์ฒ๋ฆฌAuthFeature: ๋ก๊ทธ์ธ ์ ํด์ผํ๋ ์์ ๋ค ๊ด๋ฆฌ. ex) ์ต์ด ๋ก๊ทธ์ธ ๊ฒฝ์ฐ ์คํฐ์ปค, ํ๋ ์ ์ ๋ณด SwiftData์ ์ฅ ๋ฐ ๊ธฐ๊ธฐ ํ ํฐ ์ ์ฅ
๋คํธ์ํฌ ์์ฒญ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋, ๋ก์ปฌ ์ ์ฅ์ ๋ฑ ์ธ๋ถ ์์กด์ฑ์ Dependency๋ฅผ ํตํด ์ฃผ์
ํ์ต๋๋ค. ์ด๋ฅผ ํตํด ํ
์คํธ ์ฉ์ด์ฑ์ ๋์ด๊ณ , ์ธ๋ถ ์์กด์ฑ์ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์๋๋ก ์ค๊ณํ์ต๋๋ค.
@Dependency(\.userClient) var userClient๋ฅผ ํตํด ์ฌ์ฉ์ ๊ด๋ จ API ํธ์ถ์ ๊ด๋ฆฌ.
์์กด์ฑ ์ฃผ์
์ฌ์ฉ ์ฌ๋ก:
userClient: ์ฌ์ฉ์ ์ ๋ณด ๋ฐ ํ๋กํ ๋ณ๊ฒฝ.
travelClient: ์ฌํ ํฐ์ผ ์ถ๊ฐ, ์์ , ์ญ์ .
locationClient: ์์น ๊ธฐ๋ฐ ๋ชจ๋ํฐ๋ง.
databaseClient: ์คํฐ์ปค ๋ฐ ํ๋ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ.TCA์ ๋ชจ๋ํ๋ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
- ์คํฐ์ปค ๊ด๋ฆฌ, ์ฌ์ง ํธ์ง, ์๋ ๊ธฐ๋ฅ ๋ฑ์ ์ฌ๋ฌ ํ๋ฉด์์ ํ์ฉ ๊ฐ๋ฅ
- ๊ณตํต ๊ธฐ๋ฅ์ผ๋ก ๋ถ๋ฆฌ๋ Feature:
StickerManagementFeaturePhotoGridFeature
์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ํตํด ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๊ทน๋ํํ์์ต๋๋ค.
TCA๋ ํ
์คํธ ์์ฑ์ ์ฉ์ดํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ฐ Reducer์ ์์กด์ฑ์ ๋ถ๋ฆฌํ์ฌ ๋จ์ ํ
์คํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ๊ฐ Reducer์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธ ๊ฐ๋ฅ
- Mock Dependency ์ฃผ์ ์ ํตํด ๋ค์ํ ์๋๋ฆฌ์ค ๊ฒ์ฆ ๊ฐ๋ฅ
์ด๋ฌํ ์ค๊ณ๋ฅผ ํตํด ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง๋ณด์๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
-
์ฌ์ผ๋ฐํธ ํธ์ฌ๋ AllticketOverViewFeature์์ ํฐ์ผ๋ค์ get์์ฒญ ํ ํด๋น๋ ์ง์ ํฐ์ผ์ด ์์ผ๋ฉด Appfeature์์ .startMonitoring(Spot)๋ฐ์.
-
LocationClient ๋ด๋ถ์ LocationActor์์ CLMonitor์์ฑ ํ AsyncStream๋ฐํ
-
ํน์ ์ง์ญ ์ง์ ๋ฑ ์ด๋ฒคํธ ๋ฐ์์ CLMonitor.events -> LocationAcotr -> LocationClient -> LocationMonitoringFeature๋ก ์ ๋ฌ
-
LocationMonitoringFeature์์ ํด๋น ์ด๋ฒคํธ์ ๋ฐ๋ฅธ ์๋ฆผ, ์๋ฒ ํธ์ฌ, SwiftData์ ์ ์ฅ ๋ฑ ์ถ๊ฐ ์ก์ .
Boleto๋ Metal Framework๋ฅผ ํ์ฉํ์ฌ ๊ณ ์ฑ๋ฅ ์ด๋ฏธ์ง ํํฐ ์์คํ ์ ๊ตฌํํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ์ฌํ ์ฌ์ง์ ๋ค์ํ ์์ ์ ํจ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ์ฉํ ์ ์์ต๋๋ค.
GPU ๊ฐ์ ์ฒ๋ฆฌ: Metal ์์ด๋๋ฅผ ํตํด CPU ๋์ GPU์์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํํ์ฌ ๋น ๋ฅธ ์ฑ๋ฅ ์ ๊ณต
์ค์๊ฐ ๋ ๋๋ง: ํํฐ ์ธํ ์ํฐ๋ฅผ ์กฐ์ ํ๋ฉฐ ์ค์๊ฐ์ผ๋ก ๊ฒฐ๊ณผ ํ์ธ ๊ฐ๋ฅ
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ: ์ต์ ํ๋ ๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ต์ํ
์๋ ์ต์ ํ: ํ ์ด๋ฏธ์ง์ ๋ํด ์ฌ๋ฌ ์ธ๋ค์ผ์ ์์ฑํด์ผํ๊ธฐ์ ๋ณ๋ ฌ์ฒ๋ฆฌ์ ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง์ ํตํด ๋น ๋ฅด๊ฒ ์์ฑ
ํํฐ ๊ตฌํ ๊ธฐ์ :
์๋ฒจ ์ฃ์ง ๊ฐ์ง(Sobel Edge Detection): ์ด๋ฏธ์ง์ ์ฃ์ง๋ฅผ ๊ฐ์งํ์ฌ ์ค์ผ์น, ๋งํ ํจ๊ณผ ๊ตฌํ
๊ฐ์ฐ์์ ๋ธ๋ฌ(Gaussian Blur): ๋ถ๋๋ฌ์ด ๋ธ๋ฌ ํจ๊ณผ ์ ๊ณต
๋ฏธ๋์ธ ํํฐ(Median Filter): ๋ ธ์ด์ฆ ์ ๊ฑฐ ๋ฐ ์ด๋ฏธ์ง ์ค๋ฌด๋ฉ
์ปฌ๋ฌ ์์ํ(Color Quantization): ์์ ํ๋ ํธ ๋จ์ํ๋ฅผ ํตํ ์คํ์ผ๋ฆฌ์ํ ํจ๊ณผ
๋ ธ์ด์ฆ ์์ฑ๊ธฐ(Noise Generator): ํ๋ฆ ๊ทธ๋ ์ธ, ๋นํฐ์ง ํจ๊ณผ ๋ฑ์ ์ํ ๋ค์ํ ๋ ธ์ด์ฆ ์๊ณ ๋ฆฌ์ฆ
๋น๋คํ (Vignetting): ์ฌ์ง ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ด๋ก๊ฒ ํ์ฌ ์ค์์ ์ด์ ์ ๋ง์ถ๋ ํจ๊ณผ
- ์ด๋ฏธ์ง ์ต์ ํ: https://codeisfuture.tistory.com/111, https://codeisfuture.tistory.com/121
- ๋ฉ๋ชจ๋ฆฌ ๋ฆญ ํด๊ฒฐ: https://codeisfuture.tistory.com/103, https://codeisfuture.tistory.com/102
- ์์น๊ธฐ๋ฐ ์๋น์ค(CLMonitor): https://codeisfuture.tistory.com/88
- ShareLink: https://codeisfuture.tistory.com/92
- Metal: https://codeisfuture.tistory.com/118, https://codeisfuture.tistory.com/119, https://codeisfuture.tistory.com/122,


