Skip to content

FpRaArNkK/TnT-iOS-Testing-Lab

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

598 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

TnT

ํŠธ๋ ˆ์ด๋„ˆ์™€ ํŠธ๋ ˆ์ด๋‹ˆ๋ฅผ ์—ฐ๊ฒฐํ•˜๋‹ค

PT ํšจ๊ณผ๊ฐ€ ๋ฏธ๋ฏธํ•˜๊ฑฐ๋‚˜, ๊พธ์ค€ํžˆ PT๋ฅผ ์ง€์†ํ•˜๊ธฐ ์–ด๋ ค์› ๋‚˜์š”? ํŠธ๋ ˆ์ด๋„ˆ์™€ ํŠธ๋ ˆ์ด๋‹ˆ ์‚ฌ์ด์˜ ์ฒด๊ณ„์ ์ธ ์†Œํ†ต๊ณผ ํšจ์œจ์ ์ธ PT ์šด์˜์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•˜์„ธ์š” :)

๐Ÿ’ช๐Ÿป ํŠธ๋ ˆ์ด๋„ˆ๋Š” ์ฒด๊ณ„์ ์ธ ํšŒ์› ๊ด€๋ฆฌ๋ฅผ, ํŠธ๋ ˆ์ด๋‹ˆ๋Š” ํšจ์œจ์ ์ธ ๊ธฐ๋ก์„!
๐Ÿ‹ TnT์™€ ํ•จ๊ป˜ ํŠธ๋ ˆ์ด๋„ˆ์™€ ํŠธ๋ ˆ์ด๋‹ˆ์˜ ์ผ€๋ฏธ๋ฅผ ํ„ฐํŠธ๋ ค๋ณด์„ธ์š”!


TnT iOS Testing Lab

์ด ์ €์žฅ์†Œ๋Š” TnT ๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ถ„๊ธฐํ•ด ๋งŒ๋“  iOS ์‹คํ—˜์žฅ ์ž…๋‹ˆ๋‹ค. ์ƒˆ ์ œํ’ˆ ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ ˆํฌ๋ผ๊ธฐ๋ณด๋‹ค, ์‹ค์ œ ์•ฑ ์ฝ”๋“œ ์œ„์—์„œ ๊ตฌ์กฐ ๋ฆฌํŒฉํ† ๋ง, ํ…Œ์ŠคํŠธ ๋ณด๊ฐ•, ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ •๋ฆฌ, ๋กœ์ปฌ ์บ์‹ฑ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์‹คํ—˜ํ•˜๊ณ  ์ •๋ฆฌํ•œ ์ž‘์—… ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ๋ณธ๋ž˜ TnT ํ”„๋กœ์ ํŠธ์—์„œ ๋ถ„๋ฆฌ๋œ ๋ถ„๊ธฐ์  ์ปค๋ฐ‹์€ 163684bc์ž…๋‹ˆ๋‹ค.

Testing Lab ์ž‘์—… ๋‚ด์šฉ

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[์„ฑ๋Šฅ ๊ฐœ์„  ๊ทผ๊ฑฐ ์ •๋ฆฌ]
Loading

์ž‘์—…์˜ ์ค‘์‹ฌ์€ ํ™”๋ฉด ๊ทœ์น™์˜ Domain ์ด๋™, ์„œ๋ฒ„ ์‘๋‹ต ๊ตฌ์กฐ์™€ ์•ฑ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ถ„๋ฆฌ, ๋ฐ˜๋ณต ์ง„์ž… ํ™”๋ฉด์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๊ฐ์†Œ์ž…๋‹ˆ๋‹ค.

1. Domain ๊ทœ์น™์„ ํ™”๋ฉด ๋ฐ–์œผ๋กœ ์ด๋™

์˜จ๋ณด๋”ฉ๊ณผ ๊ธฐ๋ก ํ™”๋ฉด์— ์žˆ๋˜ ์ž…๋ ฅ ๊ฒ€์ฆ์„ Domain UseCase์™€ policy๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ์ƒํƒœ ํ‘œ์‹œ๋ฅผ ๋งก๊ณ , ๊ทœ์น™ ํŒ๋‹จ์€ Domain ํ…Œ์ŠคํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ ˆ์ด๋‹ˆ ์—ฐ๊ฒฐ ์ž…๋ ฅ, ์ด๋ฆ„/์ฃผ์˜์‚ฌํ•ญ/PT ๋ชฉ์  ์ž…๋ ฅ, PT ์ˆ˜์—… ์ดˆ์•ˆ, ์‹๋‹จ ๊ธฐ๋ก ์ดˆ์•ˆ, ์„ธ์…˜ ํ™•์ธ ๊ฒฐ๊ณผ์™€ ์•ฑ ์‹œ์ž‘ ๋ผ์šฐํŒ… ์ •์ฑ…์„ ์ด ๋ฒ”์œ„์—์„œ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์œผ๋กœ reducer ์•ˆ์˜ ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ์ค„์ด๊ณ , ๊ทœ์น™ ๋ณ€๊ฒฝ์ด ์ƒ๊ฒผ์„ ๋•Œ Domain ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. Data์™€ 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
Loading

3. ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ํ…Œ์ŠคํŠธ๋กœ ๊ณ ์ •

URLSession ๊ธฐ๋ฐ˜ ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์—์„œ ์‹คํŒจ ์‘๋‹ต๊ณผ ์„ธ์…˜ ์ƒํƒœ๊ฐ€ ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด์ง€ ์•Š๋„๋ก ์ •์ฑ…์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต ์š”์ฒญ๋ณด๋‹ค ์‹คํŒจ ๊ฒฝ๋กœ๋ฅผ ๋” ์ค‘์š”ํ•˜๊ฒŒ ๋ดค์Šต๋‹ˆ๋‹ค.

์ธ์ฆ ํ† ํฐ ๋กœ๋”ฉ ์‹คํŒจ, ์„ธ์…˜ ๋งŒ๋ฃŒ feedback, ์ง„ํ–‰ ํ‘œ์‹œ feedback, ์‘๋‹ต ์˜ค๋ฅ˜ fallback, multipart ์š”์ฒญ, ๋นˆ ์‘๋‹ต mutation ack๋ฅผ ์ด ๋ฒ”์œ„์—์„œ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

NetworkServicePolicyTests, AuthTokenInterceptorTests, ResponseValidatorInterceptorTests ๊ฐ™์€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด ์ •์ฑ…์„ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

4. ๋กœ์ปฌ ์บ์‹ฑ ์„ฑ๋Šฅ ๊ฐœ์„ 

์บ์‹ฑ์€ 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]
Loading

๋„๋ฉ”์ธ ๋ชจ๋ธ ์บ์‹œ๋Š” ์„ธ์…˜ 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

About

๐Ÿงจ Trainer & Trainee [25th App-2 Team] ์˜ ํ…Œ์ŠคํŠธ ๋„์ž…์„ ์œ„ํ•œ ์‹คํ—˜์‹ค์ž…๋‹ˆ๋‹ค. ๐Ÿ‘จโ€๐Ÿ”ฌ

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages