leeari95 / ios-wanted-GyroData

๐Ÿ“ˆ 6์ถ• ๋ฐ์ดํ„ฐ(acc 3์ถ• + gyro 3์ถ•)๋ฅผ ๋‹ค๋ค„๋ณด๋Š” ์•ฑ

Repository from Github https://github.comleeari95/ios-wanted-GyroDataRepository from Github https://github.comleeari95/ios-wanted-GyroData

Swift 5.7 Xcode 14.1

GyroData

6์ถ• ๋ฐ์ดํ„ฐ(acc 3์ถ• + gyro 3์ถ•)๋ฅผ ๋‹ค๋ค„๋ณด๋Š” ์•ฑ

๐Ÿ’ป ๊ฐœ๋ฐœ์ž ์†Œ๊ฐœ

์šฐ๋กฑ์ฐจ ์•„๋ฆฌ

๋ชฉ์ฐจ

๐Ÿ—‚ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

  GyroData
 โ”œโ”€โ”€ Resources
 โ”‚   โ”œโ”€โ”€ Assets.xcassets
 โ”‚   โ””โ”€โ”€ Base.lproj
 โ””โ”€โ”€ Sources
     โ”œโ”€โ”€ App
     โ”œโ”€โ”€ Extension
     โ”‚   โ””โ”€โ”€ UI
     โ”œโ”€โ”€ Model
     โ”œโ”€โ”€ Presentation
     โ”‚   โ”œโ”€โ”€ Coordinators
     โ”‚   โ”œโ”€โ”€ MotionList
     โ”‚   โ”‚   โ”œโ”€โ”€ Coordinator
     โ”‚   โ”‚   โ”œโ”€โ”€ ViewControllers
     โ”‚   โ”‚   โ”œโ”€โ”€ ViewModels
     โ”‚   โ”‚   โ””โ”€โ”€ Views
     โ”‚   โ”œโ”€โ”€ MotionMeasure
     โ”‚   โ”‚   โ”œโ”€โ”€ ViewControllers
     โ”‚   โ”‚   โ”œโ”€โ”€ ViewModels
     โ”‚   โ”‚   โ””โ”€โ”€ Views
     โ”‚   โ””โ”€โ”€ MotionPlay
     โ”‚       โ”œโ”€โ”€ ViewControllers
     โ”‚       โ””โ”€โ”€ ViewModels
     โ””โ”€โ”€ Utility
         โ””โ”€โ”€ CoreDataStorage
             โ””โ”€โ”€ MotionStorage
                 โ””โ”€โ”€ EntityMapping

 

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

  • Swift/UIKit

์•„ํ‚คํ…์ฒ˜

  • MVVM
  • Coordinator

 

๋ฐ์ดํ„ฐ ๋ฐ UI ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  • Observable์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋ทฐ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ
  • ViewModel์˜ View ๊ด€๋ จ ํƒ€์ž…์— Observer๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ๊ตฌํ˜„
    • Observable
      • ๋ฒ„ํŠผ ํƒญ ์ด๋ฒคํŠธ ๊ฐ™์€ Input์ด ๋“ค์–ด์™”์„ ๋•Œ ์ ์ ˆํ•œ Output์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•จ
      • block์—๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ ๋งˆ๋‹ค view๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
      • ViewModel ๋ณ€๊ฒฝ์‹œ์—๋Š” ํ•ด๋‹น observer๊ฐ€ ์‹คํ–‰๋˜์–ด ๋ทฐ๋„ ๊ทธ์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

 

๋กœ์ปฌ ๋ฐ์ดํ„ฐ ์ €์žฅ

  • CoreData
  • FileManager

 

๋ชจ์…˜ ๋ฐ์ดํ„ฐ ์ธก์ •

  • CoreMotion

 

๐Ÿ“ฑ ๊ธฐ๋Šฅ ๋ฐ UI

๊ธฐ๋Šฅ/UI ์„ค๋ช…
๋ชฉ๋ก ์ธก์ •ํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋กœ์ปฌ์— ์ €์žฅ๋œ Motion ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค€๋‹ค.
์ธก์ • ์ธก์ • ๋ฒ„ํŠผ์„ ํ†ตํ•ด Acc ํ˜น์€ Gyro ๋ชจ์…˜์„ ์ธก์ •ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
View ๋ชฉ๋ก์—์„œ ์…€์„ ํ„ฐ์น˜ํ•˜์—ฌ ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๊ณ , ์ธก์ •ํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค€๋‹ค.
Play ๋ชฉ๋ก์—์„œ ์…€์„ ์Šค์™€์ดํ”„ํ•˜์—ฌ ์ง„์ž…ํ•  ์ˆ˜ ์žˆ๊ณ , ์ธก์ •ํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค€๋‹ค. ์žฌ์ƒ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๊ทธ๋ž˜ํ”„๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ทธ๋ ค์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.

 

๐Ÿ’ป ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

MVVM + Coordinator ๊ตฌ์กฐ

 

์—ญํ•  ๋ถ„๋ฐฐ

class/struct ์—ญํ• 
AppCoordinator ์•ฑ์˜ ๋ฃจํŠธ. ์ฒซ ํ™”๋ฉด์„ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž…
MotionListCoordinator ๋ชฉ๋ก ํ™”๋ฉด์˜ ํ™”๋ฉด ์ „ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” ํƒ€์ž…
MotionListViewController ๋ชจ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ธก์ •ํ–ˆ๋˜ ๊ธฐ๋ก๋“ค์„ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ค€๋‹ค.
MotionDetailViewController ์ธก์ •ํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„ ํ˜•ํƒœ๋กœ ์ƒ์„ธํ•˜๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค. ๋‘๊ฐ€์ง€ ๋ชจ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๊ณ , View์™€ Play ๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ค.
MeasurementViewController ๋ชจ์…˜์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋‹ค. ์ธก์ •์„ ๋งˆ์น˜๊ณ ๋‚˜๋ฉด ์ธก์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ๊ณผ ๊ธฐ๊ธฐ์— ๋ชจ๋‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Utilities

class/struct ์—ญํ• 
CoreDataMotionStorage ๋ชจ์…˜๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ปฌ์ €์žฅ์†Œ ํƒ€์ž…
CoreMotionManager ๋ชจ์…˜์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…
MotionFileManager ์ธก์ •ํ•œ ๋ชจ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ์‚ญ์ œ, ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํƒ€์ž…
Observable ViewModel์˜ ๊ฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— Observer ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ œ๋„ค๋ฆญ ํƒ€์ž…

 

๐Ÿ‘€ ์‹คํ–‰ ํ™”๋ฉด

๋ชฉ๋ก ํ™”๋ฉด

 

์ธก์ •ํ•˜๊ธฐ

 

์ƒ์„ธ ํ™”๋ฉด

 

๐Ÿ’ช๐Ÿป ๊ธฐ์ˆ ์  ๋„์ „

Coordinator

ํ™”๋ฉด ์ „ํ™˜์— ๋Œ€ํ•œ ๋กœ์ง์„ ViewController๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜๊ณ  ์˜์กด์„ฑ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฃผ์ž…์„ ์™ธ๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋””๋„ค์ดํ„ฐ๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Core Motion

์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ accelerometer(๊ฐ€์†๋„๊ณ„), gyroscope(์ž์ด๋กœ) ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”ฅ Truoble Shooting

CoreData๋กœ fetch๋ฅผ ํ•  ๋•Œ, ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ๋ฌธ์ œ ์ƒํ™ฉ ์ผ๋ฐ˜์ ์ธ fetch๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๋ฉด, ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ 10๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ดํ›„ ์ผ์ • ์ด์ƒ ์Šคํฌ๋กค์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผํ–ˆ๋‹ค.
  • ๊ณ ๋ฏผ ๊ทธ๋ž˜์„œ fetch๋ฅผ ํ•  ๋•Œ, ์กฐ๊ฑด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณด์•˜๋‹ค.
  • ํ•ด๊ฒฐ ์•Œ์•„๋ณด๋‹ˆ fetch๋ฅผ ๋ณด๋‚ผ ๋•Œ request๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜์—ฌ fetch๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ, ์ด๋•Œ request์˜ ์†์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ fetchํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด fetchLimit์™€ fetchOffset์„ ํ™œ์šฉํ•˜์—ฌ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ page๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ, ๊ณ„์‚ฐํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
request.fetchLimit = 10
request.fetchOffset = Int(page * 10) - 10

๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ

์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆด๋•Œ ์ˆ˜์ง‘๋˜๋Š” ๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์•„ ์ผ์ •๋น„์œจ๋กœ ์ฆํญ์‹œ์ผœ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ธ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ˜ตโ€๐Ÿ’ซ ๊ณ ๋ฏผํ–ˆ๋˜ ์ 

'์ธก์ •' ํ™”๋ฉด์€ modal ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๋Š”๊ฒŒ ๋งž์ง€ ์•Š์„๊นŒ?

์ธก์ • ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚  ๋•Œ, ๋„ค๋น„๊ฒŒ์ด์…˜ push ํ˜•ํƒœ๋กœ ํ™”๋ฉด ์ „ํ™˜์„ ํ•ด๋‹ฌ๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €ํฌ ์ƒ๊ฐ์—๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜์ด ์•„๋‹ˆ๋ผ ๋ชจ๋‹ฌ๋กœ ๋„์›Œ์•ผํ•˜๋Š”๊ฒŒ ๋งž์ง€ ์•Š๋‚˜ ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. (ํœด๋จผ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ€์ด๋“œ์— ๋”ฐ๋ฅด์ž๋ฉด...?) ํ˜น์‹œ๋‚˜ํ•ด์„œ ํฌ๋ฃจ์—๊ฒŒ ์งˆ๋ฌธํ–ˆ๋Š”๋ฐ, ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ๊ฐœ๋ฐœํ•ด๋‹ฌ๋ผ๊ณ  ํ•˜์…”์„œ ๋ชจ๋‹ฌ๋กœ ๊ตฌํ˜„ํ•ด๋‘์—ˆ๋˜ ์ธก์ • ํ™”๋ฉด์„ ๋‹ค์‹œ ๋„ค๋น„๊ฒŒ์ด์…˜์œผ๋กœ ์žฌ์ˆ˜์ • ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆด ๋•Œ, ์„ ์ด ๊ทธ๋ฆฌ๋“œ๋ฅผ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด...

๋‘๊ฐ€์ง€ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์„ ์ƒ๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” ํ™”๋ฉด ๋น„์œจ์„ ์ค„์ด๋Š” ๋ฐฉ์‹, ๋‘๋ฒˆ์งธ๋Š” ์ตœ๋Œ€๊ฐ’์„ ๋„˜์–ด๊ฐ„ ๊ฐ’์€ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹. ์ฒซ๋ฒˆ์งธ ๋ฐฉ์‹์„ ์‹œ๋„ํ•˜์˜€๊ณ  ํ™”๋ฉด๋น„์œจ์„ ์ค„์ด๋Š” ๋ฐฉ์‹์— ์„ฑ๊ณตํ•˜์˜€์œผ๋‚˜ ์ค„์—ฌ์ง„ ํ™”๋ฉด๋น„์œจ์—์„œ ์ขŒํ‘œ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด ๋…น๋ก์น˜์•Š์•„ ๋‘๋ฒˆ์งธ ๋ฐฉ์‹์„ ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

๋จผ์ € ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š”๊ณณ์ด ๋‘๊ณณ์ž…๋‹ˆ๋‹ค.(CoreData, FileManager) ์ด ๋‘๊ณณ์— ์ €์žฅ๋  ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค‘๋ณต์„ ํ”ผํ•ด์„œ ์ €์žฅํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ CoreData์—๋Š” ์ฒซํ™”๋ฉด์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์œ„์ฃผ๋กœ ๊ตฌ์„ฑํ•˜์˜€๊ณ  FileManager์—๋Š” ๊ทธ๋ž˜ํ”„์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

About

๐Ÿ“ˆ 6์ถ• ๋ฐ์ดํ„ฐ(acc 3์ถ• + gyro 3์ถ•)๋ฅผ ๋‹ค๋ค„๋ณด๋Š” ์•ฑ


Languages

Language:Swift 100.0%