diff --git a/.github/ISSUE_TEMPLATE/issue_template.md b/.github/ISSUE_TEMPLATE/issue_template.md
new file mode 100644
index 0000000..5a3d8c8
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/issue_template.md
@@ -0,0 +1,18 @@
+---
+name: ISSUE_TEMPLATE
+about: 공통적으로 사용되는 이슈 템플릿
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+## 📋 설명
+
+- 이슈에서 구현할 내용 작성
+
+## ✅ 체크리스트
+
+> 구현해야하는 이슈 체크리스트
+- [ ] 구현되지 않은 내용
+- [x] 구현 완료된 내용
diff --git a/README.md b/README.md
index a950ba8..bbe72c5 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,9 @@
-
-
-
- 🎶 MusicSpot
-
-
+
+
+
+***
- 당신의 여정을 음악과 함께 기억하다.
네이버 부스트캠프 웹・모바일 8기 그룹 프로젝트
2023.11.06 ~ 2023.12.15
@@ -15,26 +12,76 @@
- ⭐️ 프로젝트 소개
+ ⭐️ 프로젝트 소개 ⭐
Team.과열은 지도에 관심을 갖고있는 사람들로 이루어져 있습니다.
- 지도를 활용해서 음악과 함께 여정을 기록하는 앱, MusicSpot를 소개합니다.
+ 여정동안 사진과 음악으로 지도에 흔적을 남기는 앱, MusicSpot을 소개합니다.
## 🔥 Team. 과열 🔥
-|S023 윤동주|S034 전민건|S045 이창준|J037 김태우|J131 임정훈|
+| S023 윤동주 | S034 전민건 | S045 이창준 | J037 김태우 | J131 임정훈 |
|:-:|:-:|:-:|:-:|:-:|
||||||
|[@yoondj98](https://github.com/yoondj98)|[@PushedGun](https://github.com/PushedGun)|[@SwiftyJunnos](https://github.com/SwiftyJunnos)|[@twoo1999](https://github.com/twoo1999)|[@vvans](https://github.com/vvans)|
+## 🗺️ 주요 기능
+### 🏃♂️ 여정 기록
+![MusicSpot 앱 소개 001](https://github.com/boostcampwm2023/iOS01-MusicSpot/assets/138548400/d8e6663e-ed95-4757-858c-2cead6dfa02c)
+
+### 📸 스팟!
+![MusicSpot 앱 소개 002](https://github.com/boostcampwm2023/iOS01-MusicSpot/assets/138548400/f9deb9f5-49c1-4f24-b692-0ea3016bf910)
+
+### 🎶 음악 추가
+![MusicSpot 앱 소개 003](https://github.com/boostcampwm2023/iOS01-MusicSpot/assets/138548400/22766d78-380d-4d9d-b3ab-a105b7835854)
+
+### 🌠 지난 여정
+![MusicSpot 앱 소개 004](https://github.com/boostcampwm2023/iOS01-MusicSpot/assets/138548400/06e129ea-7883-4c98-a39f-41867df2bb0f)
+
+## 🧰 기술 스택
+
+### iOS
+
+
+
+### BE
+
+
+
+## 🚀 기술적 도전기
+
+### 🍎 iOS
+| 키워드 | 제목 |
+| :-: | :- |
+| XCFramework, Package | [📦 라이브러리-프레임워크-패키지 무슨 차이인데?](https://www.nomatterjun.vision/blog/Swift/22.Library_Framework_Package) |
+| `URLProtocol` | [🌐 네트워킹이 테스트가 된다고!?](https://www.nomatterjun.vision/blog/Swift/23.URLProtocol) |
+| GitHub Actions, matrix | [🏭 모듈로 나뉜 구조에서 CI는 어떤 형태이면 좋을까?](https://www.nomatterjun.vision/blog/Swift/24.MusicSpot_CI) |
+| Boundary Model, Domain Layer | [🎫 데이터 입국심사가 너무 어려워요!](https://www.nomatterjun.vision/blog/Swift/25.DomainLayer) |
+| `*codingContainer`, `Codable` | [🕺 인코딩, 디코딩 예민하네~ 화났네~](https://www.nomatterjun.vision/blog/Swift/26.DecodingContainer) |
+| 추상화 | [🧑🔧 추상화로 협업하기](https://www.nomatterjun.vision/blog/Swift/27.Abstraction_Coop) |
+
+### 💾 BE
+| 키워드 | 제목 |
+| :-: | :- |
+| `NoSQL` | [ NoSQL이 뭐야?](https://www.notion.so/musicspot/NoSQL-16c8fa4b1ff84f86a321c87aa66e1504) |
+| `DocumentDB`, `MongoDB` | [ 너무 자유로운 구조는 초보 개발자를 불안하게 해요!](https://www.notion.so/musicspot/03e6b9a70d7f4097b3256c19b8098b85) |
+| `CI/CD`, `Docker` | [ Docker(???: 이미지 저장하는거 아니야?) ](https://www.notion.so/musicspot/Docker-121ba909e2e240dc94f25ac88c38a516) |
+| `CI/CD`,`Docker` | [ Docker와 친해지기 ](https://www.notion.so/musicspot/Docker-6a845439466f431ea4281fc09d938648) |
+| `SSH 연결`, '트러블 슈팅' | [ SSH연결이 안 돼요(근데 잘 돼요 ](https://www.notion.so/musicspot/ssh-fb93c27023e0406bb9bde19d661a6f4c) |
+| `HTTP`, `HTTPS`, `CA` | [ HTTPS(선택이 아닌 필수…!) ](https://www.notion.so/musicspot/HTTPS-244427527b894f85938ab6f1d3a19bc9) |
+| `Domain`, `가비아` | [ 도메인 사기(전세 사기의 그 사기 아님) ](https://www.notion.so/musicspot/8dd48b218be042fcbb9237aff9bc32fe) |
+| `HTTPS`, `NGINX`, `프록시` | [ Nginx를 통한 HTTPS연결 ](https://www.notion.so/musicspot/Nginx-HTTPS-bcf75adc83bb414089c697ddf9d6e97b) |
+| `CI/CD`, `github action` | [ github action 시작합니다. ](https://www.notion.so/musicspot/github-action-687b4b951adf4e83a1564d06a366ffbb) |
+
+
+
## 📔 문서
| 그라운드 룰 | 기획/디자인 | 템플릿 | 회의록 |
diff --git a/iOS/Features/Home/Package.swift b/iOS/Features/Home/Package.swift
index 71aeb42..8275bc7 100644
--- a/iOS/Features/Home/Package.swift
+++ b/iOS/Features/Home/Package.swift
@@ -32,8 +32,6 @@ private enum Dependency {
static let msDomain = "MSDomain"
static let msData = "MSData"
static let msUIKit = "MSUIKit"
- static let msKeychainStorage = "MSKeychainStorage"
- static let msCoreKit = "MSCoreKit"
static let msUserDefaults = "MSUserDefaults"
static let msLogger = "MSLogger"
static let msFoundation = "MSFoundation"
@@ -62,8 +60,6 @@ let package = Package(
path: Dependency.msData.fromRootPath),
.package(name: Dependency.msUIKit,
path: Dependency.msUIKit.fromRootPath),
- .package(name: Dependency.msCoreKit,
- path: Dependency.msCoreKit.fromRootPath),
.package(name: Dependency.msFoundation,
path: Dependency.msFoundation.fromRootPath)
],
@@ -77,8 +73,6 @@ let package = Package(
package: Dependency.msDomain),
.product(name: Dependency.msData,
package: Dependency.msData),
- .product(name: Dependency.msKeychainStorage,
- package: Dependency.msCoreKit),
.product(name: Dependency.msUserDefaults,
package: Dependency.msFoundation),
.product(name: Dependency.msLogger,
diff --git a/iOS/Features/Home/Sources/Home/Presentation/HomeViewModel.swift b/iOS/Features/Home/Sources/Home/Presentation/HomeViewModel.swift
index e5fd941..15bafa3 100644
--- a/iOS/Features/Home/Sources/Home/Presentation/HomeViewModel.swift
+++ b/iOS/Features/Home/Sources/Home/Presentation/HomeViewModel.swift
@@ -13,9 +13,6 @@ import MSConstants
import MSData
import MSDomain
import MSImageFetcher
-#if DEBUG
-import MSKeychainStorage
-#endif
import MSLogger
import MSUserDefaults
@@ -49,10 +46,6 @@ public final class HomeViewModel {
private var journeyRepository: JourneyRepository
private let userRepository: UserRepository
- #if DEBUG
- private let keychain = MSKeychainStorage()
- #endif
-
@UserDefaultsWrapped(UserDefaultsKey.isFirstLaunch, defaultValue: false)
private var isFirstLaunch: Bool
diff --git a/iOS/Features/JourneyList/Package.swift b/iOS/Features/JourneyList/Package.swift
index deef4df..63c7311 100644
--- a/iOS/Features/JourneyList/Package.swift
+++ b/iOS/Features/JourneyList/Package.swift
@@ -23,11 +23,10 @@ private enum Target {
private enum Dependency {
- static let msCacheStorage = "MSCacheStorage"
- static let msImageFetcher = "MSImageFetcher"
- static let msCoreKit = "MSCoreKit"
- static let msUIKit = "MSUIKit"
static let msData = "MSData"
+
+ static let msUIKit = "MSUIKit"
+
static let msLogger = "MSLogger"
static let msFoundation = "MSFoundation"
@@ -45,22 +44,16 @@ let package = Package(
targets: [Target.journeyList])
],
dependencies: [
- .package(name: Dependency.msUIKit,
- path: Dependency.msUIKit.fromRootPath),
- .package(name: Dependency.msCoreKit,
- path: Dependency.msCoreKit.fromRootPath),
.package(name: Dependency.msData,
path: Dependency.msData.fromRootPath),
+ .package(name: Dependency.msUIKit,
+ path: Dependency.msUIKit.fromRootPath),
.package(name: Dependency.msFoundation,
path: Dependency.msFoundation.fromRootPath)
],
targets: [
.target(name: Target.journeyList,
dependencies: [
- .product(name: Dependency.msCacheStorage,
- package: Dependency.msCoreKit),
- .product(name: Dependency.msImageFetcher,
- package: Dependency.msCoreKit),
.product(name: Dependency.msUIKit,
package: Dependency.msUIKit),
.product(name: Dependency.msData,
diff --git a/iOS/Features/JourneyList/Sources/JourneyList/Presentation/JourneyListViewController.swift b/iOS/Features/JourneyList/Sources/JourneyList/Presentation/JourneyListViewController.swift
index d673682..87acb43 100644
--- a/iOS/Features/JourneyList/Sources/JourneyList/Presentation/JourneyListViewController.swift
+++ b/iOS/Features/JourneyList/Sources/JourneyList/Presentation/JourneyListViewController.swift
@@ -8,7 +8,6 @@
import Combine
import UIKit
-import MSCacheStorage
import MSData
import MSDomain
import MSUIKit
@@ -42,8 +41,6 @@ public final class JourneyListViewController: BaseViewController {
public weak var navigationDelegate: JourneyListNavigationDelegate?
- private let cache: MSCacheStorage
-
private(set) var viewModel: JourneyListViewModel
private var dataSource: JourneyListDataSource?
@@ -67,11 +64,9 @@ public final class JourneyListViewController: BaseViewController {
// MARK: - Initializer
public init(viewModel: JourneyListViewModel,
- cache: MSCacheStorage = MSCacheStorage(),
nibName nibNameOrNil: String? = nil,
bundle nibBundleOrNil: Bundle? = nil) {
self.viewModel = viewModel
- self.cache = cache
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
diff --git a/iOS/Features/RewindJourney/Package.swift b/iOS/Features/RewindJourney/Package.swift
index 0d75526..4441dc9 100644
--- a/iOS/Features/RewindJourney/Package.swift
+++ b/iOS/Features/RewindJourney/Package.swift
@@ -29,10 +29,11 @@ private enum Dependency {
static let msDomain = "MSDomain"
static let msData = "MSData"
+
+ static let combineCocoa = "CombineCocoa"
static let msDesignsystem = "MSDesignSystem"
static let msUIKit = "MSUIKit"
- static let msNetworking = "MSNetworking"
- static let msCoreKit = "MSCoreKit"
+
static let msExtension = "MSExtension"
static let msLogger = "MSLogger"
static let msFoundation = "MSFoundation"
@@ -57,8 +58,6 @@ let package = Package(
path: Dependency.msData.fromRootPath),
.package(name: Dependency.msUIKit,
path: Dependency.msUIKit.fromRootPath),
- .package(name: Dependency.msCoreKit,
- path: Dependency.msCoreKit.fromRootPath),
.package(name: Dependency.msFoundation,
path: Dependency.msFoundation.fromRootPath)
],
@@ -67,18 +66,14 @@ let package = Package(
dependencies: [
.product(name: Dependency.msDomain,
package: Dependency.msDomain),
+ .product(name: Dependency.msData,
+ package: Dependency.msData),
.product(name: Dependency.msUIKit,
package: Dependency.msUIKit),
- .product(name: Dependency.msDesignsystem,
- package: Dependency.msUIKit),
.product(name: Dependency.msLogger,
package: Dependency.msFoundation),
.product(name: Dependency.msExtension,
- package: Dependency.msFoundation),
- .product(name: Dependency.msNetworking,
- package: Dependency.msCoreKit),
- .product(name: Dependency.msData,
- package: Dependency.msData)
+ package: Dependency.msFoundation)
])
]
)
diff --git a/iOS/Features/SaveJourney/Package.swift b/iOS/Features/SaveJourney/Package.swift
index c517c57..2592d97 100644
--- a/iOS/Features/SaveJourney/Package.swift
+++ b/iOS/Features/SaveJourney/Package.swift
@@ -30,13 +30,8 @@ private enum Dependency {
static let msDomain = "MSDomain"
static let msData = "MSData"
- static let combineCocoa = "CombineCocoa"
- static let msDesignsystem = "MSDesignSystem"
static let msUIKit = "MSUIKit"
- static let msImageFetcher = "MSImageFetcher"
- static let msCoreKit = "MSCoreKit"
-
static let msExtension = "MSExtension"
static let msLogger = "MSLogger"
static let msFoundation = "MSFoundation"
@@ -57,12 +52,10 @@ let package = Package(
dependencies: [
.package(name: Dependency.msDomain,
path: Dependency.msDomain.fromRootPath),
- .package(name: Dependency.msUIKit,
- path: Dependency.msUIKit.fromRootPath),
.package(name: Dependency.msData,
path: Dependency.msData.fromRootPath),
- .package(name: Dependency.msCoreKit,
- path: Dependency.msCoreKit.fromRootPath),
+ .package(name: Dependency.msUIKit,
+ path: Dependency.msUIKit.fromRootPath),
.package(name: Dependency.msFoundation,
path: Dependency.msFoundation.fromRootPath)
],
@@ -75,10 +68,6 @@ let package = Package(
package: Dependency.msData),
.product(name: Dependency.msUIKit,
package: Dependency.msUIKit),
- .product(name: Dependency.combineCocoa,
- package: Dependency.msUIKit),
- .product(name: Dependency.msImageFetcher,
- package: Dependency.msCoreKit),
.product(name: Dependency.msExtension,
package: Dependency.msFoundation),
.product(name: Dependency.msLogger,
diff --git a/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/SaveJourneyViewModel.swift b/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/SaveJourneyViewModel.swift
index d3b5cf8..53d7d38 100644
--- a/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/SaveJourneyViewModel.swift
+++ b/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/SaveJourneyViewModel.swift
@@ -9,7 +9,6 @@ import Combine
import Foundation
import MusicKit
-import MSData
import MSDomain
import MSLogger
diff --git a/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SaveJourneyMusicCell.swift b/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SaveJourneyMusicCell.swift
index 97b71b8..6545f47 100644
--- a/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SaveJourneyMusicCell.swift
+++ b/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SaveJourneyMusicCell.swift
@@ -9,7 +9,6 @@ import UIKit
import MSDesignSystem
import MSDomain
-import MSImageFetcher
final class SaveJourneyMusicCell: UICollectionViewCell {
diff --git a/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SpotCell.swift b/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SpotCell.swift
index 630b11a..c8899d0 100644
--- a/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SpotCell.swift
+++ b/iOS/Features/SaveJourney/Sources/SaveJourney/Presentation/View/SpotCell.swift
@@ -9,7 +9,6 @@ import UIKit
import MSDesignSystem
import MSExtension
-import MSImageFetcher
final class SpotCell: UICollectionViewCell {
diff --git a/iOS/Features/SelectSong/Package.swift b/iOS/Features/SelectSong/Package.swift
index fe8cbb9..cc2f6cb 100644
--- a/iOS/Features/SelectSong/Package.swift
+++ b/iOS/Features/SelectSong/Package.swift
@@ -30,9 +30,6 @@ private enum Dependency {
static let msDomain = "MSDomain"
static let msData = "MSData"
- static let msImageFetcher = "MSImageFetcher"
- static let msCoreKit = "MSCoreKit"
-
static let combineCocoa = "CombineCocoa"
static let msDesignsystem = "MSDesignSystem"
static let msUIKit = "MSUIKit"
@@ -58,8 +55,6 @@ let package = Package(
path: Dependency.msDomain.fromRootPath),
.package(name: Dependency.msData,
path: Dependency.msData.fromRootPath),
- .package(name: Dependency.msCoreKit,
- path: Dependency.msCoreKit.fromRootPath),
.package(name: Dependency.msUIKit,
path: Dependency.msUIKit.fromRootPath),
.package(name: Dependency.msFoundation,
@@ -72,12 +67,8 @@ let package = Package(
package: Dependency.msDomain),
.product(name: Dependency.msData,
package: Dependency.msData),
- .product(name: Dependency.msImageFetcher,
- package: Dependency.msCoreKit),
.product(name: Dependency.msUIKit,
package: Dependency.msUIKit),
- .product(name: Dependency.combineCocoa,
- package: Dependency.msUIKit),
.product(name: Dependency.msLogger,
package: Dependency.msFoundation)
])
diff --git a/iOS/Features/Spot/Package.swift b/iOS/Features/Spot/Package.swift
index 76630c0..eddc5f5 100644
--- a/iOS/Features/Spot/Package.swift
+++ b/iOS/Features/Spot/Package.swift
@@ -28,18 +28,13 @@ private enum Target {
private enum Dependency {
// package
+ static let msData = "MSData"
+ static let msDomain = "MSDomain"
static let msUIKit = "MSUIKit"
static let msFoundation = "MSFoundation"
- static let msCoreKit = "MSCoreKit"
// library
- static let msDesignsystem = "MSDesignSystem"
static let msLogger = "MSLogger"
- static let msNetworking = "MSNetworking"
-
- // package = library
- static let msData = "MSData"
- static let msDomain = "MSDomain"
}
@@ -55,32 +50,26 @@ let package = Package(
targets: [Target.spot])
],
dependencies: [
+ .package(name: Dependency.msDomain,
+ path: Dependency.msDomain.fromRootPath),
+ .package(name: Dependency.msData,
+ path: Dependency.msData.fromRootPath),
.package(name: Dependency.msUIKit,
path: Dependency.msUIKit.fromRootPath),
.package(name: Dependency.msFoundation,
- path: Dependency.msFoundation.fromRootPath),
- .package(name: Dependency.msCoreKit,
- path: Dependency.msCoreKit.fromRootPath),
- .package(name: Dependency.msData,
- path: Dependency.msData.fromRootPath),
- .package(name: Dependency.msDomain,
- path: Dependency.msDomain.fromRootPath)
+ path: Dependency.msFoundation.fromRootPath)
],
targets: [
.target(name: Target.spot,
dependencies: [
.product(name: Dependency.msDomain,
package: Dependency.msDomain),
+ .product(name: Dependency.msData,
+ package: Dependency.msData),
.product(name: Dependency.msUIKit,
package: Dependency.msUIKit),
- .product(name: Dependency.msDesignsystem,
- package: Dependency.msUIKit),
.product(name: Dependency.msLogger,
- package: Dependency.msFoundation),
- .product(name: Dependency.msNetworking,
- package: Dependency.msCoreKit),
- .product(name: Dependency.msData,
- package: Dependency.msData)
+ package: Dependency.msFoundation)
])
]
)
diff --git a/iOS/Features/Spot/Sources/Spot/Presentation/SaveSpotViewModel.swift b/iOS/Features/Spot/Sources/Spot/Presentation/SaveSpotViewModel.swift
index e9ff96c..d5fce03 100644
--- a/iOS/Features/Spot/Sources/Spot/Presentation/SaveSpotViewModel.swift
+++ b/iOS/Features/Spot/Sources/Spot/Presentation/SaveSpotViewModel.swift
@@ -57,10 +57,11 @@ internal extension SaveSpotViewModel {
MSLogger.make(category: .spot).error("recoding 중인 journeyID를 찾지 못하였습니다.")
return
}
- let spot = CreateSpotRequestDTO(journeyId: recordingJourneyID,
- coordinate: CoordinateDTO(self.coordinate),
+ let spot = RequestableSpot(journeyID: recordingJourneyID,
+ coordinate: self.coordinate,
timestamp: .now,
photoData: data)
+
let result = await self.spotRepository.upload(spot: spot)
switch result {
case .success(let spot):
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/AppDelegate.swift b/iOS/Features/Spot/SpotDemo/SpotDemo/AppDelegate.swift
deleted file mode 100644
index 928908b..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/AppDelegate.swift
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// AppDelegate.swift
-// SpotDemo
-//
-// Created by 이창준 on 2023.11.29.
-//
-
-import UIKit
-
-@main
-class AppDelegate: UIResponder, UIApplicationDelegate {
-
- // MARK: UISceneSession Lifecycle
-
- func application(_ application: UIApplication,
- configurationForConnecting connectingSceneSession: UISceneSession,
- options: UIScene.ConnectionOptions) -> UISceneConfiguration {
- return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
- }
-
-}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AccentColor.colorset/Contents.json b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AccentColor.colorset/Contents.json
deleted file mode 100644
index eb87897..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AccentColor.colorset/Contents.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "colors" : [
- {
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 13613e3..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "platform" : "ios",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/Contents.json b/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/Contents.json
deleted file mode 100644
index 73c0059..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/Assets.xcassets/Contents.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/LaunchScreen.storyboard b/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index 865e932..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/Main.storyboard b/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/Main.storyboard
deleted file mode 100644
index 25a7638..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/Info.plist b/iOS/Features/Spot/SpotDemo/SpotDemo/Info.plist
deleted file mode 100644
index c52b344..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/Info.plist
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
- NSAppleMusicUsageDescription
- using photos in album
- NSCameraUsageDescription
- take photo
- UIApplicationSceneManifest
-
- UIApplicationSupportsMultipleScenes
-
- UISceneConfigurations
-
- UIWindowSceneSessionRoleApplication
-
-
- UISceneConfigurationName
- Default Configuration
- UISceneDelegateClassName
- $(PRODUCT_MODULE_NAME).SceneDelegate
- UISceneStoryboardFile
- Main
-
-
-
-
-
-
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/SceneDelegate.swift b/iOS/Features/Spot/SpotDemo/SpotDemo/SceneDelegate.swift
deleted file mode 100644
index e08c933..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/SceneDelegate.swift
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// SceneDelegate.swift
-// SpotDemo
-//
-// Created by 이창준 on 2023.11.29.
-//
-
-import UIKit
-
-import MSData
-import MSDesignSystem
-import MSDomain
-import Spot
-
-class SceneDelegate: UIResponder, UIWindowSceneDelegate {
-
- var window: UIWindow?
-
- func scene(_ scene: UIScene,
- willConnectTo session: UISceneSession,
- options connectionOptions: UIScene.ConnectionOptions) {
- guard let windowScene = (scene as? UIWindowScene) else { return }
-
- window = UIWindow(windowScene: windowScene)
- MSFont.registerFonts()
-// let spotVM = SpotViewModel()
-// let spotVC = SpotViewController(viewModel: spotVM)
-
- let spotRepo = SpotRepositoryImplementation()
- let spotSaveVM = SpotSaveViewModel(repository: spotRepo,
- journeyID: "6571bef418be25527c66dc04",
- coordinate: Coordinate(latitude: 10, longitude: 10))
- let spotSaveVC = SpotSaveViewController(viewModel: spotSaveVM)
-
- window?.rootViewController = spotSaveVC
- window?.makeKeyAndVisible()
- }
-
-}
diff --git a/iOS/Features/Spot/SpotDemo/SpotDemo/ViewController.swift b/iOS/Features/Spot/SpotDemo/SpotDemo/ViewController.swift
deleted file mode 100644
index 82c12bf..0000000
--- a/iOS/Features/Spot/SpotDemo/SpotDemo/ViewController.swift
+++ /dev/null
@@ -1,12 +0,0 @@
-//
-// ViewController.swift
-// SpotDemo
-//
-// Created by 이창준 on 2023.11.29.
-//
-
-import UIKit
-
-class ViewController: UIViewController {
-
-}
diff --git a/iOS/MSCoreKit/.swiftpm/xcode/xcshareddata/xcschemes/MSFetcherTests.xcscheme b/iOS/MSCoreKit/.swiftpm/xcode/xcshareddata/xcschemes/MSFetcherTests.xcscheme
deleted file mode 100644
index f299dc2..0000000
--- a/iOS/MSCoreKit/.swiftpm/xcode/xcshareddata/xcschemes/MSFetcherTests.xcscheme
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/iOS/MSCoreKit/Package.swift b/iOS/MSCoreKit/Package.swift
index 2063e38..8652136 100644
--- a/iOS/MSCoreKit/Package.swift
+++ b/iOS/MSCoreKit/Package.swift
@@ -24,7 +24,6 @@ private enum Target {
static let msImageFetcher = "MSImageFetcher"
static let msPersistentStorage = "MSPersistentStorage"
static let msNetworking = "MSNetworking"
- static let msFetcher = "MSFetcher"
static let msCacheStorage = "MSCacheStorage"
static let msKeychainStorage = "MSKeychainStorage"
static let msMapKit = "MSMapKit"
@@ -53,8 +52,6 @@ let package = Package(
targets: [Target.msPersistentStorage]),
.library(name: Target.msNetworking,
targets: [Target.msNetworking]),
- .library(name: Target.msFetcher,
- targets: [Target.msFetcher]),
.library(name: Target.msCacheStorage,
targets: [Target.msCacheStorage]),
.library(name: Target.msKeychainStorage,
@@ -84,11 +81,6 @@ let package = Package(
.product(name: Dependency.msLogger,
package: Dependency.msFoundation)
]),
- .target(name: Target.msFetcher,
- dependencies: [
- .target(name: Target.msPersistentStorage),
- .target(name: Target.msNetworking)
- ]),
.target(name: Target.msCacheStorage,
dependencies: [
.product(name: Dependency.msConstants,
@@ -111,10 +103,6 @@ let package = Package(
dependencies: [
.target(name: Target.msNetworking)
]),
- .testTarget(name: Target.msFetcher.testTarget,
- dependencies: [
- .target(name: Target.msFetcher)
- ]),
.testTarget(name: Target.msCacheStorage.testTarget,
dependencies: [
.target(name: Target.msCacheStorage)
diff --git a/iOS/MSCoreKit/Sources/MSFetcher/MSFetcher.swift b/iOS/MSCoreKit/Sources/MSFetcher/MSFetcher.swift
deleted file mode 100644
index 32d05c6..0000000
--- a/iOS/MSCoreKit/Sources/MSFetcher/MSFetcher.swift
+++ /dev/null
@@ -1,6 +0,0 @@
-//
-// MSFetcher.swift
-// MSCoreKit
-//
-// Created by 이창준 on 11/14/23.
-//
diff --git a/iOS/MSCoreKit/Tests/MSFetcherTests/MSFetcherTests.swift b/iOS/MSCoreKit/Tests/MSFetcherTests/MSFetcherTests.swift
deleted file mode 100644
index d33b917..0000000
--- a/iOS/MSCoreKit/Tests/MSFetcherTests/MSFetcherTests.swift
+++ /dev/null
@@ -1,12 +0,0 @@
-//
-// MSFetcherTests.swift
-// MSCoreKit
-//
-// Created by 이창준 on 11/14/23.
-//
-
-import XCTest
-
-final class MSFetcherTests: XCTestCase {
-
-}
diff --git a/iOS/MSData/Sources/MSData/Repository/Error/Repository+Error.swift b/iOS/MSData/Sources/MSData/RepositoryImplementation/Error/Repository+Error.swift
similarity index 100%
rename from iOS/MSData/Sources/MSData/Repository/Error/Repository+Error.swift
rename to iOS/MSData/Sources/MSData/RepositoryImplementation/Error/Repository+Error.swift
diff --git a/iOS/MSData/Sources/MSData/Repository/JourneyRepository.swift b/iOS/MSData/Sources/MSData/RepositoryImplementation/JourneyRepository.swift
similarity index 88%
rename from iOS/MSData/Sources/MSData/Repository/JourneyRepository.swift
rename to iOS/MSData/Sources/MSData/RepositoryImplementation/JourneyRepository.swift
index 2a5c26e..bdab757 100644
--- a/iOS/MSData/Sources/MSData/Repository/JourneyRepository.swift
+++ b/iOS/MSData/Sources/MSData/RepositoryImplementation/JourneyRepository.swift
@@ -15,22 +15,6 @@ import MSNetworking
import MSPersistentStorage
import MSUserDefaults
-public protocol JourneyRepository: Persistable {
-
- func fetchIsRecording() -> Bool
- mutating func updateIsRecording(_ isRecording: Bool) -> Bool
- func fetchRecordingJourneyID() -> String?
- func fetchRecordingJourney(forID id: String) -> RecordingJourney?
- func fetchJourneyList(userID: UUID,
- minCoordinate: Coordinate,
- maxCoordinate: Coordinate) async -> Result<[Journey], Error>
- mutating func startJourney(at coordinate: Coordinate, userID: UUID) async -> Result
- mutating func endJourney(_ journey: Journey) async -> Result
- func recordJourney(journeyID: String, at coordinates: [Coordinate]) async -> Result
- mutating func deleteJourney(_ journey: RecordingJourney, userID: UUID) async -> Result
-
-}
-
public struct JourneyRepositoryImplementation: JourneyRepository {
// MARK: - Properties
@@ -131,8 +115,8 @@ public struct JourneyRepositoryImplementation: JourneyRepository {
spots: [],
coordinates: [responseDTO.coordinate.toDomain()])
- self.saveToLocal(value: recordingJourney.id)
- self.saveToLocal(value: recordingJourney.startTimestamp)
+ LocalRecordingManager.shared.saveToLocal(recordingJourney.id, at: self.storage)
+ LocalRecordingManager.shared.saveToLocal(recordingJourney.startTimestamp, at: self.storage)
self.recordingJourneyID = recordingJourney.id
self.isRecording = true
@@ -166,7 +150,9 @@ public struct JourneyRepositoryImplementation: JourneyRepository {
spots: [],
coordinates: coordinates)
- responseDTO.coordinates.forEach { self.saveToLocal(value: $0) }
+ responseDTO.coordinates.forEach {
+ LocalRecordingManager.shared.saveToLocal($0, at: self.storage)
+ }
return .success(recordingJourney)
case .failure(let error):
@@ -207,4 +193,8 @@ public struct JourneyRepositoryImplementation: JourneyRepository {
}
}
+ public func loadJourneyFromLocal() -> RecordingJourney? {
+ return LocalRecordingManager.shared.loadJourney(from: self.storage)
+ }
+
}
diff --git a/iOS/MSData/Sources/MSData/Repository/SongRepository.swift b/iOS/MSData/Sources/MSData/RepositoryImplementation/SongRepository.swift
similarity index 88%
rename from iOS/MSData/Sources/MSData/Repository/SongRepository.swift
rename to iOS/MSData/Sources/MSData/RepositoryImplementation/SongRepository.swift
index 843687e..5cf1f6b 100644
--- a/iOS/MSData/Sources/MSData/Repository/SongRepository.swift
+++ b/iOS/MSData/Sources/MSData/RepositoryImplementation/SongRepository.swift
@@ -8,18 +8,10 @@
import Foundation
import MusicKit
+import MSDomain
import MSLogger
import MSNetworking
-public protocol SongRepository {
-
- func fetchSong(withID id: String) async -> Result
- func fetchSongList(with term: String) async -> Result, Error>
- @available(iOS 16.0, *)
- func fetchSongListByRank() async -> Result, Error>
-
-}
-
public struct SongRepositoryImplementation: SongRepository {
// MARK: - Properties
diff --git a/iOS/MSData/Sources/MSData/Repository/SpotRepository.swift b/iOS/MSData/Sources/MSData/RepositoryImplementation/SpotRepository.swift
similarity index 84%
rename from iOS/MSData/Sources/MSData/Repository/SpotRepository.swift
rename to iOS/MSData/Sources/MSData/RepositoryImplementation/SpotRepository.swift
index 336cb94..dabac2a 100644
--- a/iOS/MSData/Sources/MSData/Repository/SpotRepository.swift
+++ b/iOS/MSData/Sources/MSData/RepositoryImplementation/SpotRepository.swift
@@ -12,13 +12,6 @@ import MSNetworking
import MSLogger
import MSPersistentStorage
-public protocol SpotRepository: Persistable {
-
- func fetchRecordingSpots() async -> Result<[Spot], Error>
- func upload(spot: CreateSpotRequestDTO) async -> Result
-
-}
-
public struct SpotRepositoryImplementation: SpotRepository {
// MARK: - Properties
@@ -66,7 +59,13 @@ public struct SpotRepositoryImplementation: SpotRepository {
#endif
}
- public func upload(spot: CreateSpotRequestDTO) async -> Result {
+ public func upload(spot: RequestableSpot) async -> Result {
+
+ let spot = CreateSpotRequestDTO(journeyId: spot.journeyID,
+ coordinate: CoordinateDTO(spot.coordinate),
+ timestamp: spot.timestamp,
+ photoData: spot.photoData)
+
let router = SpotRouter.upload(spot: spot, id: UUID())
let result = await self.networking.request(SpotDTO.self, router: router)
switch result {
@@ -74,7 +73,7 @@ public struct SpotRepositoryImplementation: SpotRepository {
#if DEBUG
MSLogger.make(category: .network).debug("성공적으로 업로드하였습니다.")
#endif
- self.saveToLocal(value: spot)
+ LocalRecordingManager.shared.saveToLocal(spot, at: self.storage)
return .success(spot.toDomain())
case .failure(let error):
MSLogger.make(category: .network).error("\(error): 업로드에 실패하였습니다.")
diff --git a/iOS/MSData/Sources/MSData/Repository/UserRepository.swift b/iOS/MSData/Sources/MSData/RepositoryImplementation/UserRepository.swift
similarity index 94%
rename from iOS/MSData/Sources/MSData/Repository/UserRepository.swift
rename to iOS/MSData/Sources/MSData/RepositoryImplementation/UserRepository.swift
index 24954a7..d18b04a 100644
--- a/iOS/MSData/Sources/MSData/Repository/UserRepository.swift
+++ b/iOS/MSData/Sources/MSData/RepositoryImplementation/UserRepository.swift
@@ -7,18 +7,11 @@
import Foundation
+import MSDomain
import MSKeychainStorage
import MSLogger
import MSNetworking
-public protocol UserRepository {
-
- func createUser() async -> Result
- func storeUUID(_ userID: UUID) throws -> UUID
- func fetchUUID() -> UUID?
-
-}
-
public struct UserRepositoryImplementation: UserRepository {
// MARK: - Properties
diff --git a/iOS/MSData/Sources/MSData/Repository/Persistable.swift b/iOS/MSData/Sources/MSData/Util/LocalRecordingManager.swift
similarity index 64%
rename from iOS/MSData/Sources/MSData/Repository/Persistable.swift
rename to iOS/MSData/Sources/MSData/Util/LocalRecordingManager.swift
index f3d53d5..a8eb5bf 100644
--- a/iOS/MSData/Sources/MSData/Repository/Persistable.swift
+++ b/iOS/MSData/Sources/MSData/Util/LocalRecordingManager.swift
@@ -1,5 +1,5 @@
//
-// Persistable.swift
+// LocalRecordingManager.swift
// MSData
//
// Created by 전민건 on 2023.12.10.
@@ -11,16 +11,6 @@ import MSDomain
import MSLogger
import MSPersistentStorage
-public protocol Persistable {
-
- var storage: MSPersistentStorage { get }
-
- @discardableResult
- func saveToLocal(value: Codable) -> Bool
- func loadJourneyFromLocal() -> RecordingJourney?
-
-}
-
// MARK: - KeyStorage
private struct KeyStorage {
@@ -34,12 +24,14 @@ private struct KeyStorage {
// MARK: - Default Implementations
-extension Persistable {
+public struct LocalRecordingManager {
+
+ public static let shared = LocalRecordingManager()
@discardableResult
- public func saveToLocal(value: Codable) -> Bool {
+ public func saveToLocal(_ value: Codable, at storage: MSPersistentStorage) -> Bool {
let key = UUID().uuidString
- self.storage.set(value: value, forKey: key)
+ storage.set(value: value, forKey: key)
switch value {
case is String:
@@ -53,7 +45,7 @@ extension Persistable {
if KeyStorage.startTimestamp == nil {
KeyStorage.startTimestamp = key
} else {
- MSLogger.make(category: .persistable).debug("start tamp는 하나의 값만 저장할 수 있습니다.")
+ MSLogger.make(category: .persistable).debug("start timestamp는 하나의 값만 저장할 수 있습니다.")
return false
}
case is SpotDTO:
@@ -67,20 +59,20 @@ extension Persistable {
return true
}
- public func loadJourneyFromLocal() -> RecordingJourney? {
- guard let id = self.loadID(),
- let startTimestamp = self.loadStartTimeStamp() else {
+ public func loadJourney(from storage: MSPersistentStorage) -> RecordingJourney? {
+ guard let id = self.loadID(from: storage),
+ let startTimestamp = self.loadStartTimeStamp(from: storage) else {
return nil
}
return RecordingJourney(id: id,
startTimestamp: startTimestamp,
- spots: self.loadSpots(),
- coordinates: self.loadCoordinates())
+ spots: self.loadSpots(from: storage),
+ coordinates: self.loadCoordinates(from: storage))
}
- func loadStartTimeStamp() -> Date? {
+ private func loadStartTimeStamp(from storage: MSPersistentStorage) -> Date? {
guard let startTimestampKey = KeyStorage.startTimestamp,
- let startTimestamp = self.storage.get(Date.self, forKey: startTimestampKey)
+ let startTimestamp = storage.get(Date.self, forKey: startTimestampKey)
else {
MSLogger.make(category: .persistable).debug("id 또는 startTimestamp가 저장되지 않았습니다.")
return nil
@@ -88,25 +80,25 @@ extension Persistable {
return startTimestamp
}
- func loadID() -> String? {
+ private func loadID(from storage: MSPersistentStorage) -> String? {
guard let idKey = KeyStorage.id,
- let id = self.storage.get(String.self, forKey: idKey) else {
+ let id = storage.get(String.self, forKey: idKey) else {
MSLogger.make(category: .persistable).debug("id 또는 startTimestamp가 저장되지 않았습니다.")
return nil
}
return id
}
- func loadSpots() -> [Spot] {
+ private func loadSpots(from storage: MSPersistentStorage) -> [Spot] {
return KeyStorage.spots.compactMap { spotKey in
- let spotDTO = self.storage.get(SpotDTO.self, forKey: spotKey)
+ let spotDTO = storage.get(SpotDTO.self, forKey: spotKey)
return spotDTO?.toDomain()
}
}
- func loadCoordinates() -> [Coordinate] {
+ private func loadCoordinates(from storage: MSPersistentStorage) -> [Coordinate] {
return KeyStorage.coordinates.compactMap { coordinateKey in
- let coordinateDTO = self.storage.get(CoordinateDTO.self, forKey: coordinateKey)
+ let coordinateDTO = storage.get(CoordinateDTO.self, forKey: coordinateKey)
return coordinateDTO?.toDomain()
}
}
diff --git a/iOS/MSData/Tests/RepositoryTests/PersistableRepositoryTests.swift b/iOS/MSData/Tests/RepositoryTests/PersistentManagerTests.swift
similarity index 62%
rename from iOS/MSData/Tests/RepositoryTests/PersistableRepositoryTests.swift
rename to iOS/MSData/Tests/RepositoryTests/PersistentManagerTests.swift
index 4cdcf5c..8bc2771 100644
--- a/iOS/MSData/Tests/RepositoryTests/PersistableRepositoryTests.swift
+++ b/iOS/MSData/Tests/RepositoryTests/PersistentManagerTests.swift
@@ -8,12 +8,13 @@
import XCTest
@testable import MSData
@testable import MSDomain
+@testable import MSPersistentStorage
-final class PersistableRepositoryTests: XCTestCase {
+final class PersistentManagerTests: XCTestCase {
// MARK: - Properties
- private let journeyRepository = JourneyRepositoryImplementation()
+ let storage = FileManagerStorage()
// MARK: - Tests
@@ -23,11 +24,11 @@ final class PersistableRepositoryTests: XCTestCase {
let spot = Spot(coordinate: coordinate, timestamp: .now, photoURL: url)
- XCTAssertTrue(self.journeyRepository.saveToLocal(value: SpotDTO(spot)))
+ XCTAssertTrue(LocalRecordingManager.shared.saveToLocal(SpotDTO(spot), at: self.storage))
}
func test_RecordingJourney_하위요소가_아닌_것들_저장_실패() {
- XCTAssertFalse(self.journeyRepository.saveToLocal(value: Int()))
+ XCTAssertFalse(LocalRecordingManager.shared.saveToLocal(Int(), at: self.storage))
}
func test_RecordingJourney_반환_성공() {
@@ -38,12 +39,12 @@ final class PersistableRepositoryTests: XCTestCase {
let coordinate = Coordinate(latitude: 5, longitude: 5)
let spot = Spot(coordinate: coordinate, timestamp: .now, photoURL: url)
- self.journeyRepository.saveToLocal(value: id)
- self.journeyRepository.saveToLocal(value: Date.now)
- self.journeyRepository.saveToLocal(value: SpotDTO(spot))
- self.journeyRepository.saveToLocal(value: CoordinateDTO(coordinate))
+ LocalRecordingManager.shared.saveToLocal(id, at: self.storage)
+ LocalRecordingManager.shared.saveToLocal(Date.now, at: self.storage)
+ LocalRecordingManager.shared.saveToLocal(SpotDTO(spot), at: self.storage)
+ LocalRecordingManager.shared.saveToLocal(CoordinateDTO(coordinate), at: self.storage)
- guard let loadedJourney = self.journeyRepository.loadJourneyFromLocal() else {
+ guard let loadedJourney = LocalRecordingManager.shared.loadJourney(from: self.storage) else {
XCTFail("load 실패")
return
}
diff --git a/iOS/MSDomain/Sources/MSDomain/Model/Spot.swift b/iOS/MSDomain/Sources/MSDomain/Model/Spot.swift
index 93cbb5b..8eaca4a 100644
--- a/iOS/MSDomain/Sources/MSDomain/Model/Spot.swift
+++ b/iOS/MSDomain/Sources/MSDomain/Model/Spot.swift
@@ -27,6 +27,29 @@ public struct Spot {
}
+public struct RequestableSpot {
+
+ // MARK: - Properties
+
+ public let journeyID: String
+ public let coordinate: Coordinate
+ public let timestamp: Date
+ public let photoData: Data
+
+ // MARK: - Initializer
+
+ public init(journeyID: String,
+ coordinate: Coordinate,
+ timestamp: Date,
+ photoData: Data) {
+ self.journeyID = journeyID
+ self.coordinate = coordinate
+ self.timestamp = timestamp
+ self.photoData = photoData
+ }
+
+}
+
// MARK: - Hashable
extension Spot: Hashable { }
diff --git a/iOS/MSDomain/Sources/MSDomain/Repository/JourneyRepository.swift b/iOS/MSDomain/Sources/MSDomain/Repository/JourneyRepository.swift
new file mode 100644
index 0000000..5c683b5
--- /dev/null
+++ b/iOS/MSDomain/Sources/MSDomain/Repository/JourneyRepository.swift
@@ -0,0 +1,24 @@
+//
+// JourneyRepository.swift
+// MSDomain
+//
+// Created by 이창준 on 2023.12.24.
+//
+
+import Foundation
+
+public protocol JourneyRepository {
+
+ func fetchIsRecording() -> Bool
+ mutating func updateIsRecording(_ isRecording: Bool) -> Bool
+ func fetchRecordingJourneyID() -> String?
+ func fetchRecordingJourney(forID id: String) -> RecordingJourney?
+ func fetchJourneyList(userID: UUID,
+ minCoordinate: Coordinate,
+ maxCoordinate: Coordinate) async -> Result<[Journey], Error>
+ mutating func startJourney(at coordinate: Coordinate, userID: UUID) async -> Result
+ mutating func endJourney(_ journey: Journey) async -> Result
+ func recordJourney(journeyID: String, at coordinates: [Coordinate]) async -> Result
+ mutating func deleteJourney(_ journey: RecordingJourney, userID: UUID) async -> Result
+ func loadJourneyFromLocal() -> RecordingJourney?
+}
diff --git a/iOS/MSDomain/Sources/MSDomain/Repository/SongRepository.swift b/iOS/MSDomain/Sources/MSDomain/Repository/SongRepository.swift
new file mode 100644
index 0000000..7ef0039
--- /dev/null
+++ b/iOS/MSDomain/Sources/MSDomain/Repository/SongRepository.swift
@@ -0,0 +1,18 @@
+//
+// SongRepository.swift
+// MSDomain
+//
+// Created by 이창준 on 2023.12.24.
+//
+
+import Foundation
+import MusicKit
+
+public protocol SongRepository {
+
+ func fetchSong(withID id: String) async -> Result
+ func fetchSongList(with term: String) async -> Result, Error>
+ @available(iOS 16.0, *)
+ func fetchSongListByRank() async -> Result, Error>
+
+}
diff --git a/iOS/MSDomain/Sources/MSDomain/Repository/SpotRepository.swift b/iOS/MSDomain/Sources/MSDomain/Repository/SpotRepository.swift
new file mode 100644
index 0000000..0efbfef
--- /dev/null
+++ b/iOS/MSDomain/Sources/MSDomain/Repository/SpotRepository.swift
@@ -0,0 +1,15 @@
+//
+// SpotRepository.swift
+// MSDomain
+//
+// Created by 이창준 on 2023.12.24.
+//
+
+import Foundation
+
+public protocol SpotRepository {
+
+ func fetchRecordingSpots() async -> Result<[Spot], Error>
+ func upload(spot: RequestableSpot) async -> Result
+
+}
diff --git a/iOS/MSDomain/Sources/MSDomain/Repository/UserRepository.swift b/iOS/MSDomain/Sources/MSDomain/Repository/UserRepository.swift
new file mode 100644
index 0000000..68a4d44
--- /dev/null
+++ b/iOS/MSDomain/Sources/MSDomain/Repository/UserRepository.swift
@@ -0,0 +1,16 @@
+//
+// UserRepository.swift
+// MSDomain
+//
+// Created by 이창준 on 2023.12.24.
+//
+
+import Foundation
+
+public protocol UserRepository {
+
+ func createUser() async -> Result
+ func storeUUID(_ userID: UUID) throws -> UUID
+ func fetchUUID() -> UUID?
+
+}
diff --git a/iOS/MSUIKit/Package.swift b/iOS/MSUIKit/Package.swift
index 0df0c20..2d9e5d1 100644
--- a/iOS/MSUIKit/Package.swift
+++ b/iOS/MSUIKit/Package.swift
@@ -41,12 +41,8 @@ let package = Package(
.iOS(.v15)
],
products: [
- .library(name: Target.msDesignSystem,
- targets: [Target.msDesignSystem]),
.library(name: Target.msUIKit,
- targets: [Target.msUIKit]),
- .library(name: Target.combineCocoa,
- targets: [Target.combineCocoa])
+ targets: [Target.msUIKit])
],
dependencies: [
.package(name: Dependency.msCoreKit,
@@ -63,6 +59,7 @@ let package = Package(
.target(name: Target.msUIKit,
dependencies: [
.target(name: Target.msDesignSystem),
+ .target(name: Target.combineCocoa),
.product(name: Dependency.msImageFetcher,
package: Dependency.msCoreKit),
.product(name: Dependency.msExtension,
diff --git a/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj b/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
index 221ec29..6a576a6 100644
--- a/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
+++ b/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 60;
+ objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
@@ -13,24 +13,19 @@
08CBF87D2B18468E007D3797 /* SpotCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBF8752B18468E007D3797 /* SpotCoordinator.swift */; };
08CBF87E2B18468E007D3797 /* SaveJourneyFlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBF8762B18468E007D3797 /* SaveJourneyFlowCoordinator.swift */; };
08CBF87F2B18468E007D3797 /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08CBF8772B18468E007D3797 /* Coordinator.swift */; };
- DD0194E92B25C42E007CE082 /* Home in Frameworks */ = {isa = PBXBuildFile; productRef = DD0194E82B25C42E007CE082 /* Home */; };
- DD0194EB2B25C42E007CE082 /* NavigateMap in Frameworks */ = {isa = PBXBuildFile; productRef = DD0194EA2B25C42E007CE082 /* NavigateMap */; };
- DD0194EE2B25C434007CE082 /* JourneyList in Frameworks */ = {isa = PBXBuildFile; productRef = DD0194ED2B25C434007CE082 /* JourneyList */; };
- DD0194F12B25C43B007CE082 /* RewindJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DD0194F02B25C43B007CE082 /* RewindJourney */; };
- DD0194F42B25C441007CE082 /* SaveJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DD0194F32B25C441007CE082 /* SaveJourney */; };
- DD0194F72B25C448007CE082 /* SelectSong in Frameworks */ = {isa = PBXBuildFile; productRef = DD0194F62B25C448007CE082 /* SelectSong */; };
- DD0194FA2B25C44E007CE082 /* Spot in Frameworks */ = {isa = PBXBuildFile; productRef = DD0194F92B25C44E007CE082 /* Spot */; };
+ DD72AF642B4B89E700EB4E81 /* CoordinatorFinishDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB22F742B433EC300F83D84 /* CoordinatorFinishDelegate.swift */; };
DD73F8592B024C4900EE9BF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD73F8582B024C4900EE9BF2 /* AppDelegate.swift */; };
DD73F85B2B024C4900EE9BF2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD73F85A2B024C4900EE9BF2 /* SceneDelegate.swift */; };
DD73F8622B024C4B00EE9BF2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DD73F8612B024C4B00EE9BF2 /* Assets.xcassets */; };
DD73F8652B024C4B00EE9BF2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DD73F8632B024C4B00EE9BF2 /* LaunchScreen.storyboard */; };
- DDB22F752B433EC300F83D84 /* CoordinatorFinishDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB22F742B433EC300F83D84 /* CoordinatorFinishDelegate.swift */; };
- DDBB292D2B310B1300A742CD /* MSCacheStorage in Frameworks */ = {isa = PBXBuildFile; productRef = DDBB292C2B310B1300A742CD /* MSCacheStorage */; };
- DDBB292F2B310B1300A742CD /* MSFetcher in Frameworks */ = {isa = PBXBuildFile; productRef = DDBB292E2B310B1300A742CD /* MSFetcher */; };
- DDBB29312B310B1300A742CD /* MSImageFetcher in Frameworks */ = {isa = PBXBuildFile; productRef = DDBB29302B310B1300A742CD /* MSImageFetcher */; };
- DDBB29332B310B1300A742CD /* MSKeychainStorage in Frameworks */ = {isa = PBXBuildFile; productRef = DDBB29322B310B1300A742CD /* MSKeychainStorage */; };
- DDBB29352B310B1300A742CD /* MSNetworking in Frameworks */ = {isa = PBXBuildFile; productRef = DDBB29342B310B1300A742CD /* MSNetworking */; };
- DDBB29372B310B1300A742CD /* MSPersistentStorage in Frameworks */ = {isa = PBXBuildFile; productRef = DDBB29362B310B1300A742CD /* MSPersistentStorage */; };
+ DD92FEAB2B35EDFF00A672F5 /* Home in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEAA2B35EDFF00A672F5 /* Home */; };
+ DD92FEAD2B35EE0700A672F5 /* NavigateMap in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEAC2B35EE0700A672F5 /* NavigateMap */; };
+ DD92FEAF2B35EE0700A672F5 /* JourneyList in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEAE2B35EE0700A672F5 /* JourneyList */; };
+ DD92FEB12B35EE0700A672F5 /* RewindJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEB02B35EE0700A672F5 /* RewindJourney */; };
+ DD92FEB32B35EE0700A672F5 /* SelectSong in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEB22B35EE0700A672F5 /* SelectSong */; };
+ DD92FEB52B35EE0700A672F5 /* Spot in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEB42B35EE0700A672F5 /* Spot */; };
+ DD92FEB82B35EE5500A672F5 /* MSUIKit in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEB72B35EE5500A672F5 /* MSUIKit */; };
+ DD92FEBA2B35EEAF00A672F5 /* SaveJourney in Frameworks */ = {isa = PBXBuildFile; productRef = DD92FEB92B35EEAF00A672F5 /* SaveJourney */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -70,19 +65,14 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- DDBB29312B310B1300A742CD /* MSImageFetcher in Frameworks */,
- DD0194EB2B25C42E007CE082 /* NavigateMap in Frameworks */,
- DD0194E92B25C42E007CE082 /* Home in Frameworks */,
- DD0194F12B25C43B007CE082 /* RewindJourney in Frameworks */,
- DD0194EE2B25C434007CE082 /* JourneyList in Frameworks */,
- DDBB29372B310B1300A742CD /* MSPersistentStorage in Frameworks */,
- DD0194FA2B25C44E007CE082 /* Spot in Frameworks */,
- DD0194F42B25C441007CE082 /* SaveJourney in Frameworks */,
- DDBB29332B310B1300A742CD /* MSKeychainStorage in Frameworks */,
- DDBB29352B310B1300A742CD /* MSNetworking in Frameworks */,
- DD0194F72B25C448007CE082 /* SelectSong in Frameworks */,
- DDBB292F2B310B1300A742CD /* MSFetcher in Frameworks */,
- DDBB292D2B310B1300A742CD /* MSCacheStorage in Frameworks */,
+ DD92FEAD2B35EE0700A672F5 /* NavigateMap in Frameworks */,
+ DD92FEAB2B35EDFF00A672F5 /* Home in Frameworks */,
+ DD92FEB52B35EE0700A672F5 /* Spot in Frameworks */,
+ DD92FEB32B35EE0700A672F5 /* SelectSong in Frameworks */,
+ DD92FEB82B35EE5500A672F5 /* MSUIKit in Frameworks */,
+ DD92FEB12B35EE0700A672F5 /* RewindJourney in Frameworks */,
+ DD92FEBA2B35EEAF00A672F5 /* SaveJourney in Frameworks */,
+ DD92FEAF2B35EE0700A672F5 /* JourneyList in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -168,19 +158,14 @@
);
name = MusicSpot;
packageProductDependencies = (
- DD0194E82B25C42E007CE082 /* Home */,
- DD0194EA2B25C42E007CE082 /* NavigateMap */,
- DD0194ED2B25C434007CE082 /* JourneyList */,
- DD0194F02B25C43B007CE082 /* RewindJourney */,
- DD0194F32B25C441007CE082 /* SaveJourney */,
- DD0194F62B25C448007CE082 /* SelectSong */,
- DD0194F92B25C44E007CE082 /* Spot */,
- DDBB292C2B310B1300A742CD /* MSCacheStorage */,
- DDBB292E2B310B1300A742CD /* MSFetcher */,
- DDBB29302B310B1300A742CD /* MSImageFetcher */,
- DDBB29322B310B1300A742CD /* MSKeychainStorage */,
- DDBB29342B310B1300A742CD /* MSNetworking */,
- DDBB29362B310B1300A742CD /* MSPersistentStorage */,
+ DD92FEAA2B35EDFF00A672F5 /* Home */,
+ DD92FEAC2B35EE0700A672F5 /* NavigateMap */,
+ DD92FEAE2B35EE0700A672F5 /* JourneyList */,
+ DD92FEB02B35EE0700A672F5 /* RewindJourney */,
+ DD92FEB22B35EE0700A672F5 /* SelectSong */,
+ DD92FEB42B35EE0700A672F5 /* Spot */,
+ DD92FEB72B35EE5500A672F5 /* MSUIKit */,
+ DD92FEB92B35EEAF00A672F5 /* SaveJourney */,
);
productName = MusicSpot;
productReference = DD73F8552B024C4900EE9BF2 /* MusicSpot.app */;
@@ -211,13 +196,6 @@
);
mainGroup = DD73F84C2B024C4900EE9BF2;
packageReferences = (
- DD0194E72B25C42E007CE082 /* XCLocalSwiftPackageReference "../Features/Home" */,
- DD0194EC2B25C434007CE082 /* XCLocalSwiftPackageReference "../Features/JourneyList" */,
- DD0194EF2B25C43B007CE082 /* XCLocalSwiftPackageReference "../Features/RewindJourney" */,
- DD0194F22B25C441007CE082 /* XCLocalSwiftPackageReference "../Features/SaveJourney" */,
- DD0194F52B25C448007CE082 /* XCLocalSwiftPackageReference "../Features/SelectSong" */,
- DD0194F82B25C44E007CE082 /* XCLocalSwiftPackageReference "../Features/Spot" */,
- DDBB292B2B310B1300A742CD /* XCLocalSwiftPackageReference "../MSCoreKit" */,
);
productRefGroup = DD73F8562B024C4900EE9BF2 /* Products */;
projectDirPath = "";
@@ -245,7 +223,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- DDB22F752B433EC300F83D84 /* CoordinatorFinishDelegate.swift in Sources */,
08CBF8792B18468E007D3797 /* AppCoordinator.swift in Sources */,
08CBF87F2B18468E007D3797 /* Coordinator.swift in Sources */,
08CBF87D2B18468E007D3797 /* SpotCoordinator.swift in Sources */,
@@ -254,6 +231,7 @@
DD73F8592B024C4900EE9BF2 /* AppDelegate.swift in Sources */,
08CBF87B2B18468E007D3797 /* HomeCoordinator.swift in Sources */,
DD73F85B2B024C4900EE9BF2 /* SceneDelegate.swift in Sources */,
+ DD72AF642B4B89E700EB4E81 /* CoordinatorFinishDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -618,89 +596,38 @@
};
/* End XCConfigurationList section */
-/* Begin XCLocalSwiftPackageReference section */
- DD0194E72B25C42E007CE082 /* XCLocalSwiftPackageReference "../Features/Home" */ = {
- isa = XCLocalSwiftPackageReference;
- relativePath = ../Features/Home;
- };
- DD0194EC2B25C434007CE082 /* XCLocalSwiftPackageReference "../Features/JourneyList" */ = {
- isa = XCLocalSwiftPackageReference;
- relativePath = ../Features/JourneyList;
- };
- DD0194EF2B25C43B007CE082 /* XCLocalSwiftPackageReference "../Features/RewindJourney" */ = {
- isa = XCLocalSwiftPackageReference;
- relativePath = ../Features/RewindJourney;
- };
- DD0194F22B25C441007CE082 /* XCLocalSwiftPackageReference "../Features/SaveJourney" */ = {
- isa = XCLocalSwiftPackageReference;
- relativePath = ../Features/SaveJourney;
- };
- DD0194F52B25C448007CE082 /* XCLocalSwiftPackageReference "../Features/SelectSong" */ = {
- isa = XCLocalSwiftPackageReference;
- relativePath = ../Features/SelectSong;
- };
- DD0194F82B25C44E007CE082 /* XCLocalSwiftPackageReference "../Features/Spot" */ = {
- isa = XCLocalSwiftPackageReference;
- relativePath = ../Features/Spot;
- };
- DDBB292B2B310B1300A742CD /* XCLocalSwiftPackageReference "../MSCoreKit" */ = {
- isa = XCLocalSwiftPackageReference;
- relativePath = ../MSCoreKit;
- };
-/* End XCLocalSwiftPackageReference section */
-
/* Begin XCSwiftPackageProductDependency section */
- DD0194E82B25C42E007CE082 /* Home */ = {
+ DD92FEAA2B35EDFF00A672F5 /* Home */ = {
isa = XCSwiftPackageProductDependency;
productName = Home;
};
- DD0194EA2B25C42E007CE082 /* NavigateMap */ = {
+ DD92FEAC2B35EE0700A672F5 /* NavigateMap */ = {
isa = XCSwiftPackageProductDependency;
productName = NavigateMap;
};
- DD0194ED2B25C434007CE082 /* JourneyList */ = {
+ DD92FEAE2B35EE0700A672F5 /* JourneyList */ = {
isa = XCSwiftPackageProductDependency;
productName = JourneyList;
};
- DD0194F02B25C43B007CE082 /* RewindJourney */ = {
+ DD92FEB02B35EE0700A672F5 /* RewindJourney */ = {
isa = XCSwiftPackageProductDependency;
productName = RewindJourney;
};
- DD0194F32B25C441007CE082 /* SaveJourney */ = {
- isa = XCSwiftPackageProductDependency;
- productName = SaveJourney;
- };
- DD0194F62B25C448007CE082 /* SelectSong */ = {
+ DD92FEB22B35EE0700A672F5 /* SelectSong */ = {
isa = XCSwiftPackageProductDependency;
productName = SelectSong;
};
- DD0194F92B25C44E007CE082 /* Spot */ = {
+ DD92FEB42B35EE0700A672F5 /* Spot */ = {
isa = XCSwiftPackageProductDependency;
productName = Spot;
};
- DDBB292C2B310B1300A742CD /* MSCacheStorage */ = {
- isa = XCSwiftPackageProductDependency;
- productName = MSCacheStorage;
- };
- DDBB292E2B310B1300A742CD /* MSFetcher */ = {
- isa = XCSwiftPackageProductDependency;
- productName = MSFetcher;
- };
- DDBB29302B310B1300A742CD /* MSImageFetcher */ = {
+ DD92FEB72B35EE5500A672F5 /* MSUIKit */ = {
isa = XCSwiftPackageProductDependency;
- productName = MSImageFetcher;
+ productName = MSUIKit;
};
- DDBB29322B310B1300A742CD /* MSKeychainStorage */ = {
+ DD92FEB92B35EEAF00A672F5 /* SaveJourney */ = {
isa = XCSwiftPackageProductDependency;
- productName = MSKeychainStorage;
- };
- DDBB29342B310B1300A742CD /* MSNetworking */ = {
- isa = XCSwiftPackageProductDependency;
- productName = MSNetworking;
- };
- DDBB29362B310B1300A742CD /* MSPersistentStorage */ = {
- isa = XCSwiftPackageProductDependency;
- productName = MSPersistentStorage;
+ productName = SaveJourney;
};
/* End XCSwiftPackageProductDependency section */
};