PT ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ๊ฑฐ๋, ๊พธ์คํ PT๋ฅผ ์ง์ํ๊ธฐ ์ด๋ ค์ ๋์? ํธ๋ ์ด๋์ ํธ๋ ์ด๋ ์ฌ์ด์ ์ฒด๊ณ์ ์ธ ์ํต๊ณผ ํจ์จ์ ์ธ PT ์ด์์ ์ง์ ๊ฒฝํํ์ธ์ :)
๐ช๐ป ํธ๋ ์ด๋๋ ์ฒด๊ณ์ ์ธ ํ์ ๊ด๋ฆฌ๋ฅผ, ํธ๋ ์ด๋๋ ํจ์จ์ ์ธ ๊ธฐ๋ก์!
๐ TnT์ ํจ๊ป ํธ๋ ์ด๋์ ํธ๋ ์ด๋์ ์ผ๋ฏธ๋ฅผ ํฐํธ๋ ค๋ณด์ธ์!
์ด ์ ์ฅ์๋ TnT ๋ณธ ํ๋ก์ ํธ์์ ๋ถ๊ธฐํด ๋ง๋ iOS ์คํ์ฅ ์
๋๋ค.
์ ์ ํ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ๋ ๋ ํฌ๋ผ๊ธฐ๋ณด๋ค, ์ค์ ์ฑ ์ฝ๋ ์์์ ๊ตฌ์กฐ ๋ฆฌํฉํ ๋ง, ํ
์คํธ ๋ณด๊ฐ, ๋คํธ์ํฌ ์ ์ฑ
์ ๋ฆฌ, ๋ก์ปฌ ์บ์ฑ ์ฑ๋ฅ ๊ฐ์ ์ ์คํํ๊ณ ์ ๋ฆฌํ ์์
๊ณต๊ฐ์
๋๋ค.
๋ณธ๋ TnT ํ๋ก์ ํธ์์ ๋ถ๋ฆฌ๋ ๋ถ๊ธฐ์ ์ปค๋ฐ์ 163684bc์
๋๋ค.
TnT ์ฑ์ Trainer์ Trainee ํ๋ก์ฐ๊ฐ ๋ถ๋ฆฌ๋ผ ์๊ณ , ๋คํธ์ํฌ ์๋ตยท์ธ์ ์ํยท์ ๋ ฅ ๊ฒ์ฆยท์ด๋ฏธ์ง ๋ก๋ฉ์ด ์ฌ๋ฌ ํ๋ฉด์ ๊ฑธ์ณ ์์ต๋๋ค. Testing Lab์์๋ ์ค์ ์ฑ ํ๋ฆ์ ์ ์งํ ์ฑ ํ ์คํธ/๊ฐ์ ๊ฐ๋ฅํ ์ง์ ์ ๋๋ ธ์ต๋๋ค.
---
title: Testing Lab ์์
ํ๋ฆ
---
flowchart LR
Start[๊ธฐ์กด TnT iOS] --> Domain[Domain ๊ท์น ๋ถ๋ฆฌ]
Domain --> Data[Data / Network ์ฑ
์ ์ ๋ฆฌ]
Data --> Tests[๋ชจ๋๋ณ ํ
์คํธ ๋ณด๊ฐ]
Tests --> Cache[๋๋ฉ์ธ snapshot cache]
Cache --> Image[์ด๋ฏธ์ง cache pipeline]
Image --> Portfolio[์ฑ๋ฅ ๊ฐ์ ๊ทผ๊ฑฐ ์ ๋ฆฌ]
์์ ์ ์ค์ฌ์ ํ๋ฉด ๊ท์น์ Domain ์ด๋, ์๋ฒ ์๋ต ๊ตฌ์กฐ์ ์ฑ ๋๋ฉ์ธ ๋ชจ๋ธ ๋ถ๋ฆฌ, ๋ฐ๋ณต ์ง์ ํ๋ฉด์ ๋คํธ์ํฌ ์์ฒญ ๊ฐ์์ ๋๋ค.
์จ๋ณด๋ฉ๊ณผ ๊ธฐ๋ก ํ๋ฉด์ ์๋ ์ ๋ ฅ ๊ฒ์ฆ์ Domain UseCase์ policy๋ก ์ฎ๊ฒผ์ต๋๋ค. ํ๋ฉด์ ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ์ํ ํ์๋ฅผ ๋งก๊ณ , ๊ท์น ํ๋จ์ Domain ํ ์คํธ์์ ํ์ธํ ์ ์๊ฒ ํ์ต๋๋ค.
ํธ๋ ์ด๋ ์ฐ๊ฒฐ ์ ๋ ฅ, ์ด๋ฆ/์ฃผ์์ฌํญ/PT ๋ชฉ์ ์ ๋ ฅ, PT ์์ ์ด์, ์๋จ ๊ธฐ๋ก ์ด์, ์ธ์ ํ์ธ ๊ฒฐ๊ณผ์ ์ฑ ์์ ๋ผ์ฐํ ์ ์ฑ ์ ์ด ๋ฒ์์์ ๋ค๋ค์ต๋๋ค.
์ด ์์ ์ผ๋ก reducer ์์ ์กฐ๊ฑด ๋ถ๊ธฐ๋ฅผ ์ค์ด๊ณ , ๊ท์น ๋ณ๊ฒฝ์ด ์๊ฒผ์ ๋ Domain ํ ์คํธ๋ฅผ ๋จผ์ ๋ณผ ์ ์๊ฒ ํ์ต๋๋ค.
์๋ฒ ์๋ต DTO, request payload, mapper ์ฑ ์์ Data ๋ ์ด์ด๋ก ์ฎ๊ฒผ์ต๋๋ค. Domain์๋ ์ฑ ๋ด๋ถ์์ ์ฐ๋ Entity์ Repository protocol๋ง ๋จ๊ธฐ๊ณ , ์๋ฒ JSON ๊ตฌ์กฐ๋ Data์์ ๋ค๋ฃจ๋๋ก ์ ๋ฆฌํ์ต๋๋ค.
---
title: Data์ Domain ์ฑ
์ ๋ถ๋ฆฌ
---
flowchart TB
subgraph Domain[Domain]
Entity[Entity]
UseCase[UseCase]
Contract[Repository protocol]
end
subgraph Data[Data]
DTO[Response DTO]
Payload[Request payload]
Repo[Repository impl]
Network[Network service]
end
UseCase --> Contract
Contract --> Repo
Repo --> DTO
Repo --> Payload
Repo --> Network
URLSession ๊ธฐ๋ฐ ๋คํธ์ํฌ ์๋น์ค์์ ์คํจ ์๋ต๊ณผ ์ธ์ ์ํ๊ฐ ํ๋ฉด๋ง๋ค ๋ค๋ฅด๊ฒ ๋ณด์ด์ง ์๋๋ก ์ ์ฑ ์ ๋ถ๋ฆฌํ์ต๋๋ค. ์ฑ๊ณต ์์ฒญ๋ณด๋ค ์คํจ ๊ฒฝ๋ก๋ฅผ ๋ ์ค์ํ๊ฒ ๋ดค์ต๋๋ค.
์ธ์ฆ ํ ํฐ ๋ก๋ฉ ์คํจ, ์ธ์ ๋ง๋ฃ feedback, ์งํ ํ์ feedback, ์๋ต ์ค๋ฅ fallback, multipart ์์ฒญ, ๋น ์๋ต mutation ack๋ฅผ ์ด ๋ฒ์์์ ํ์ธํ์ต๋๋ค.
NetworkServicePolicyTests, AuthTokenInterceptorTests, ResponseValidatorInterceptorTests ๊ฐ์ ํ
์คํธ๊ฐ ์ด ์ ์ฑ
์ ๊ณ ์ ํฉ๋๋ค.
์บ์ฑ์ API ์๋ต์ ๊ทธ๋๋ก ์ ์ฅํ๋ ๋ฐฉ์์ด ์๋๋ผ, ์ฌ์ฉ์๊ฐ ๊ฐ์ ํ๋ฉด์ผ๋ก ๋ค์ ๋์์์ ๋ ๋ค์ ๋ฐ์ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก ์ก์์ต๋๋ค.
๋๋ฉ์ธ ๋ฐ์ดํฐ๋ Data ๋ ์ด์ด์ snapshot cache๋ก ๋ค๋ฃจ๊ณ , ์ด๋ฏธ์ง๋ Presentation์ image pipeline์ผ๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
---
title: ๋๋ฉ์ธ cache์ ์ด๋ฏธ์ง cache ๋ถ๋ฆฌ
---
flowchart LR
Screen[ํ๋ฉด ์ฌ์ง์
] --> Repo[Repository]
Repo --> Fresh{fresh cache?}
Fresh -->|hit| Snapshot[Domain snapshot]
Fresh -->|miss| API[Network API]
API --> Snapshot
Screen --> ImageView[CachedRemoteImage]
ImageView --> Memory[Memory cache]
ImageView --> Disk[Disk cache]
ImageView --> Remote[Remote image]
๋๋ฉ์ธ ๋ชจ๋ธ ์บ์๋ ์ธ์ namespace์ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ key์ ํฌํจํฉ๋๋ค. ์์ ์ฑ๊ณต ๋ค์๋ ๊ด๋ จ ์บ์๋ฅผ ์ง์, ์์ ํ ์ด์ snapshot์ด ๋ค์ ๋ณด์ด์ง ์๊ฒ ํ์ต๋๋ค.
์ด๋ฏธ์ง ์บ์๋ URL hash key, memory/disk cache, in-flight coalescing, disk TTL/capacity/LRU cleanup์ ๋ฐ๋ก ๋ก๋๋ค.
์์น๋ request count ๊ธฐ์ค์ ๋๋ค. byte ์ ์ก๋, ํ๋ฉด ํ์ ์๊ฐ, FPS๋ ๋ณ๋๋ก ์ธก์ ํ์ง ์์์ต๋๋ค.
| ์ฌ์ฉ์ ํ๋ก์ฐ | ๋ณ๊ฒฝ ์ warm ์ฌ์ง์ | ๋ณ๊ฒฝ ํ warm ์ฌ์ง์ | ์๋ฏธ |
|---|---|---|---|
| Trainer ํ ์ฌ์ง์ | ์ ์ฒด ์๋ฒ ๋ผ์ฐํธ 7ํ | ์ ์ฒด ์๋ฒ ๋ผ์ฐํธ 1ํ | ๋จ์ 1ํ๋ ์ฑ ์ง์
์ ํ์ํ GET /check-session |
| Trainer ํ ์ฝํ ์ธ ์ฌ์กฐํ | ๋๋ฉ์ธ API 4ํ + ์ด๋ฏธ์ง ์์ฒญ 2ํ | ์บ์ ๋์ ์์ฒญ 0ํ | ์์ /ํ์ ์ฝํ ์ธ ์ ๋ฐ๋ณต ์ด๋ฏธ์ง๋ฅผ local cache hit๋ก ์ฒ๋ฆฌ |
| Trainee ํ/์๋จ ํ์ธ | ํ API 2ํ, ์๋จ ์์ธ API 1ํ + ์ด๋ฏธ์ง ์์ฒญ 1ํ | ๊ฐ warm flow ์์ฒญ 0ํ | ๋ ์ง๋ณ ํ ์ ๋ณด์ ์๋จ ์์ธ๋ฅผ ๋ค์ ๋ฐ์ ํ์๋ฅผ ์ค์ |
| MyPage/Profile | /members 1ํ |
/members 0ํ |
๋ด์ ๋ณด ๋ฐ์ดํฐ๋ฅผ local cache hit๋ก ์ฒ๋ฆฌ |
์บ์๋ ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ฃผ๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๋ ๊ฒ๋ง์ผ๋ก ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์บ์ ์ ์ฉ ์์ ์ดํ fresh TTL, stale fallback, mutation invalidation, session namespace, capacity/LRU ๊ธฐ์ค๊น์ง ํจ๊ป ์ ๋ฆฌํ์ต๋๋ค.
| ๋ชจ๋ | ํ ์คํธ ์์ |
|---|---|
| Domain | SessionBootstrapPolicyTests, TraineeValidationUseCaseTests, DietRecordDraftValidatorTests |
| Data | NetworkServicePolicyTests, AuthTokenInterceptorTests, ResponseValidatorInterceptorTests, TraineeRepositoryCacheTests, TrainerRepositoryCacheTests, UserRepositoryCacheTests |
| Presentation | TrainerHomeFeatureTests, CachedRemoteImageTests |
- iOS 17.0, Xcode 16.0.1, Tuist 4.37.0
- SwiftUI / TCA / Clean Architecture
- FirebaseMessaging / Kakao iOS SDK / FSCalendar
TnT/Projects:TnTApp,Presentation,Domain,Data,DIContainer,DesignSystem
