From 808075e0d05438046f43cccf34bd2ba2aaa98a3d Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:41:22 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[Refact]=20Injected=20=EB=9E=98=ED=8D=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=98=95=ED=83=9C=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20DIContainer=20=ED=81=AC=EB=9E=98=EC=8B=9C=20?= =?UTF-8?q?=EB=A1=9C=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Core/Project.swift | 3 ++- .../Sources/DIContainer/DIContainer.swift | 23 +++++++++++-------- .../Core/Sources/DIContainer/Injected.swift | 12 ++++------ Projects/Data/Project.swift | 1 - 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Projects/Core/Project.swift b/Projects/Core/Project.swift index 034fb42c..a211b7a2 100644 --- a/Projects/Core/Project.swift +++ b/Projects/Core/Project.swift @@ -6,6 +6,7 @@ let project = Project.makeProject( name: "Core", moduleType: .dynamicFramework, dependencies: [ - .thirdPartyLibs + .thirdPartyLibs, + .package(product: "FirebaseAnalytics") ] ) diff --git a/Projects/Core/Sources/DIContainer/DIContainer.swift b/Projects/Core/Sources/DIContainer/DIContainer.swift index e9208404..aaddd914 100644 --- a/Projects/Core/Sources/DIContainer/DIContainer.swift +++ b/Projects/Core/Sources/DIContainer/DIContainer.swift @@ -8,19 +8,24 @@ import Foundation -public final class DIContainer { - static var storage: [String: Any] = [:] - - private init() { } +import FirebaseAnalytics + +public enum DIContainer { + private static var storage: [String: Any] = [:] - public static func register(type: T.Type, _ object: T) { - storage["\(type)"] = object + public static func register( + type: Dependency.Type, + _ instance: Dependency + ) { + storage[String(describing: Dependency.self)] = instance } - static func resolve(type: T.Type) -> T { - guard let object = storage["\(type)"] as? T else { + static func resolve(type: Dependency.Type) -> Dependency { + let typeName = String(describing: Dependency.self) + guard let savedInstance = storage[typeName] as? Dependency else { + Analytics.logEvent("DependencyCrash", parameters: ["type": typeName]) fatalError("register 되지 않은 객체 호출: \(type)") } - return object + return savedInstance } } diff --git a/Projects/Core/Sources/DIContainer/Injected.swift b/Projects/Core/Sources/DIContainer/Injected.swift index 2432c601..248ca3d6 100644 --- a/Projects/Core/Sources/DIContainer/Injected.swift +++ b/Projects/Core/Sources/DIContainer/Injected.swift @@ -9,14 +9,10 @@ import Foundation @propertyWrapper -public struct Injected { - private var type: T.Type - - public var wrappedValue: T { - DIContainer.resolve(type: type) +public struct Injected { + public var wrappedValue: Dependency { + DIContainer.resolve(type: Dependency.self) } - public init(_ type: T.Type) { - self.type = type - } + public init() { } } diff --git a/Projects/Data/Project.swift b/Projects/Data/Project.swift index 263efa82..e5e47837 100644 --- a/Projects/Data/Project.swift +++ b/Projects/Data/Project.swift @@ -18,7 +18,6 @@ let project = Project.makeProject( dependencies: [ .networkService, .coreDataService, - .package(product: "FirebaseAnalytics"), ], coreDataModel: [ .init( From 77524595103c606dffc9a8496c72d1b8014cc1c9 Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:44:01 +0900 Subject: [PATCH 2/9] =?UTF-8?q?[Fix]=20=EC=9D=98=EC=A1=B4=EC=84=B1=20regis?= =?UTF-8?q?ter,=20resolve=20=ED=98=95=ED=83=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../App/Sources/AppDelegate+Register.swift | 106 ++++-------------- .../DefaultBusStopArrivalInfoRepository.swift | 7 +- .../DefaultFavoritesRepository.swift | 12 +- .../DefaultRegularAlarmRepository.swift | 12 +- .../DefaultAddRegularAlarmUseCase.swift | 14 +-- .../UseCase/DefaultBusStopUseCase.swift | 18 +-- .../UseCase/DefaultFavoritesUseCase.swift | 14 +-- .../UseCase/DefaultNearMapUseCase.swift | 13 +-- .../UseCase/DefaultRegularAlarmUseCase.swift | 14 +-- .../UseCase/DefaultSearchUseCase.swift | 13 +-- .../ViewModel/AddRegularAlarmViewModel.swift | 7 +- .../ViewModel/RegularAlarmViewModel.swift | 3 +- .../Sources/ViewModel/BusStopViewModel.swift | 4 +- .../ViewModel/FavoritesViewModel.swift | 4 +- .../Sources/ViewModel/NearMapViewModel.swift | 3 +- .../Sources/ViewModel/SearchViewModel.swift | 4 +- 16 files changed, 75 insertions(+), 173 deletions(-) diff --git a/Projects/App/Sources/AppDelegate+Register.swift b/Projects/App/Sources/AppDelegate+Register.swift index cd3990f8..a9a2535e 100644 --- a/Projects/App/Sources/AppDelegate+Register.swift +++ b/Projects/App/Sources/AppDelegate+Register.swift @@ -16,91 +16,27 @@ import NetworkService extension AppDelegate { func registerDependencies() { - let coreDataService: CoreDataService = DefaultCoreDataService() - let networkService: NetworkService = DefaultNetworkService() - let locationService: LocationService = DefaultLocationService() - - let favoritesRepository: FavoritesRepository - = DefaultFavoritesRepository( - coreDataService: coreDataService, - networkService: networkService - ) - let busStopArrivalInfoRepository: BusStopArrivalInfoRepository - = DefaultBusStopArrivalInfoRepository(networkService: networkService) - let stationListRepository: StationListRepository - = DefaultStationListRepository() - let regularAlarmRepository: RegularAlarmRepository - = DefaultRegularAlarmRepository( - coreDataService: coreDataService, - networkService: networkService - ) - let localNotificationService: LocalNotificationService - = DefaultLocalNotificationService() - let regularAlarmEditingService: RegularAlarmEditingService - = DefaultRegularAlarmEditingService() + DIContainer.register(type: CoreDataService.self, DefaultCoreDataService()) + DIContainer.register(type: NetworkService.self, DefaultNetworkService()) + DIContainer.register(type: LocationService.self, DefaultLocationService()) + + DIContainer.register(type: FavoritesRepository.self, DefaultFavoritesRepository()) + DIContainer.register(type: BusStopArrivalInfoRepository.self, DefaultBusStopArrivalInfoRepository()) + DIContainer.register(type: StationListRepository.self, DefaultStationListRepository()) + DIContainer.register(type: RegularAlarmRepository.self, DefaultRegularAlarmRepository()) + DIContainer.register(type: LocalNotificationService.self, DefaultLocalNotificationService()) + DIContainer.register(type: RegularAlarmEditingService.self, DefaultRegularAlarmEditingService()) // TODO: 추후 의존 주입 형태 변경 -// let versionCheckRepository: VersionCheckRepository -// = DefaultVersionCheckRepository(networkService: networkService) - - DIContainer.register( - type: FavoritesUseCase.self, - DefaultFavoritesUseCase( - busStopArrivalInfoRepository: busStopArrivalInfoRepository, - favoritesRepository: favoritesRepository - ) - ) - - DIContainer.register( - type: RegularAlarmUseCase.self, - DefaultRegularAlarmUseCase( - localNotificationService: localNotificationService, - regularAlarmRepository: regularAlarmRepository - ) - ) - - DIContainer.register( - type: AddRegularAlarmUseCase.self, - DefaultAddRegularAlarmUseCase( - localNotificationService: localNotificationService, - regularAlarmRepository: regularAlarmRepository - ) - ) - - DIContainer.register( - type: SearchUseCase.self, - DefaultSearchUseCase( - stationListRepository: stationListRepository, - locationService: locationService - ) - ) - - DIContainer.register( - type: BusStopUseCase.self, - DefaultBusStopUseCase( - busStopArrivalInfoRepository: busStopArrivalInfoRepository, - favoritesRepository: favoritesRepository, - regularAlarmEditingService: regularAlarmEditingService - ) - ) - - DIContainer.register( - type: NearMapUseCase.self, - DefaultNearMapUseCase( - stationListRepository: stationListRepository, - locationService: locationService - ) - ) - - DIContainer.register( - type: RegularAlarmEditingService.self, - regularAlarmEditingService - ) - -// DIContainer.register( -// type: VersionCheckUseCase.self, -// DefaultVersionCheckUseCase( -// versionCheckRepository: versionCheckRepository -// ) -// ) +// DIContainer.register(type: VersionCheckRepository.self, DefaultVersionCheckRepository()) + + DIContainer.register(type: FavoritesUseCase.self, DefaultFavoritesUseCase()) + DIContainer.register(type: RegularAlarmUseCase.self, DefaultRegularAlarmUseCase()) + DIContainer.register(type: AddRegularAlarmUseCase.self, DefaultAddRegularAlarmUseCase()) + DIContainer.register(type: SearchUseCase.self, DefaultSearchUseCase()) + DIContainer.register(type: BusStopUseCase.self, DefaultBusStopUseCase()) + DIContainer.register(type: NearMapUseCase.self, DefaultNearMapUseCase()) + DIContainer.register(type: RegularAlarmEditingService.self, DefaultRegularAlarmEditingService()) + // TODO: 추후 의존 주입 형태 변경 +// DIContainer.register(type: VersionCheckUseCase.self, DefaultVersionCheckUseCase()) } } diff --git a/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift b/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift index 6da0b77b..acec835d 100644 --- a/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift +++ b/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift @@ -10,20 +10,17 @@ import Foundation import Domain import NetworkService +import Core import RxSwift import FirebaseAnalytics public final class DefaultBusStopArrivalInfoRepository: NSObject, BusStopArrivalInfoRepository { - private let networkService: NetworkService + @Injected private var networkService: NetworkService private let disposeBag = DisposeBag() - public init(networkService: NetworkService) { - self.networkService = networkService - } - public func fetchArrivalList(busStopId: String) -> Observable { Analytics.logEvent("fetchArrivalEvent", parameters: nil) diff --git a/Projects/Data/Sources/Repository/DefaultFavoritesRepository.swift b/Projects/Data/Sources/Repository/DefaultFavoritesRepository.swift index 5299a294..cf8bf96c 100644 --- a/Projects/Data/Sources/Repository/DefaultFavoritesRepository.swift +++ b/Projects/Data/Sources/Repository/DefaultFavoritesRepository.swift @@ -11,23 +11,19 @@ import Foundation import CoreDataService import Domain import NetworkService +import Core import RxSwift public final class DefaultFavoritesRepository: FavoritesRepository { - private let coreDataService: CoreDataService - private let networkService: NetworkService + @Injected private var coreDataService: CoreDataService + @Injected private var networkService: NetworkService public var favorites = BehaviorSubject<[FavoritesBusResponse]>(value: []) private let disposeBag = DisposeBag() - public init( - coreDataService: CoreDataService, - networkService: NetworkService - ) { - self.coreDataService = coreDataService - self.networkService = networkService + public init() { bindStoreStatus() } diff --git a/Projects/Data/Sources/Repository/DefaultRegularAlarmRepository.swift b/Projects/Data/Sources/Repository/DefaultRegularAlarmRepository.swift index ca794ba4..a3afef40 100644 --- a/Projects/Data/Sources/Repository/DefaultRegularAlarmRepository.swift +++ b/Projects/Data/Sources/Repository/DefaultRegularAlarmRepository.swift @@ -11,24 +11,20 @@ import Foundation import CoreDataService import Domain import NetworkService +import Core import RxSwift public final class DefaultRegularAlarmRepository: RegularAlarmRepository { - private let coreDataService: CoreDataService - private let networkService: NetworkService + @Injected private var coreDataService: CoreDataService + @Injected private var networkService: NetworkService public let currentRegularAlarm = BehaviorSubject<[RegularAlarmResponse]>( value: [] ) private let disposeBag = DisposeBag() - public init( - coreDataService: CoreDataService, - networkService: NetworkService - ) { - self.coreDataService = coreDataService - self.networkService = networkService + public init() { bindStoreStatus() } diff --git a/Projects/Domain/Sources/UseCase/DefaultAddRegularAlarmUseCase.swift b/Projects/Domain/Sources/UseCase/DefaultAddRegularAlarmUseCase.swift index 6b4d5d78..6438f64b 100644 --- a/Projects/Domain/Sources/UseCase/DefaultAddRegularAlarmUseCase.swift +++ b/Projects/Domain/Sources/UseCase/DefaultAddRegularAlarmUseCase.swift @@ -8,19 +8,15 @@ import Foundation +import Core + import RxSwift public final class DefaultAddRegularAlarmUseCase: AddRegularAlarmUseCase { - private let localNotificationService: LocalNotificationService - private let regularAlarmRepository: RegularAlarmRepository + @Injected private var localNotificationService: LocalNotificationService + @Injected private var regularAlarmRepository: RegularAlarmRepository - public init( - localNotificationService: LocalNotificationService, - regularAlarmRepository: RegularAlarmRepository - ) { - self.localNotificationService = localNotificationService - self.regularAlarmRepository = regularAlarmRepository - } + public init() { } public func checkNotificationAuth() { localNotificationService.authorize() diff --git a/Projects/Domain/Sources/UseCase/DefaultBusStopUseCase.swift b/Projects/Domain/Sources/UseCase/DefaultBusStopUseCase.swift index 41a1e31e..7ce7d45f 100644 --- a/Projects/Domain/Sources/UseCase/DefaultBusStopUseCase.swift +++ b/Projects/Domain/Sources/UseCase/DefaultBusStopUseCase.swift @@ -8,28 +8,22 @@ import Foundation +import Core + import RxSwift import RxCocoa public final class DefaultBusStopUseCase: BusStopUseCase { - private let busStopArrivalInfoRepository: BusStopArrivalInfoRepository - private let favoritesRepository: FavoritesRepository - private let regularAlarmEditingService: RegularAlarmEditingService + @Injected private var busStopArrivalInfoRepository: BusStopArrivalInfoRepository + @Injected private var favoritesRepository: FavoritesRepository + @Injected private var regularAlarmEditingService: RegularAlarmEditingService public let busStopSection = PublishSubject() private var fetchThrottleStatus: FetchThrottleStatus = .completed private let disposeBag = DisposeBag() - public init( - busStopArrivalInfoRepository: BusStopArrivalInfoRepository, - favoritesRepository: FavoritesRepository, - regularAlarmEditingService: RegularAlarmEditingService - ) { - self.busStopArrivalInfoRepository = busStopArrivalInfoRepository - self.favoritesRepository = favoritesRepository - self.regularAlarmEditingService = regularAlarmEditingService - } + public init() { } public func fetchBusArrivals(request: ArrivalInfoRequest) { let busStops = busStopArrivalInfoRepository.fetchArrivalList( diff --git a/Projects/Domain/Sources/UseCase/DefaultFavoritesUseCase.swift b/Projects/Domain/Sources/UseCase/DefaultFavoritesUseCase.swift index 10ba032a..6d2d5f14 100644 --- a/Projects/Domain/Sources/UseCase/DefaultFavoritesUseCase.swift +++ b/Projects/Domain/Sources/UseCase/DefaultFavoritesUseCase.swift @@ -8,25 +8,21 @@ import Foundation +import Core + import RxSwift import RxCocoa public final class DefaultFavoritesUseCase: FavoritesUseCase { - private let busStopArrivalInfoRepository: BusStopArrivalInfoRepository - private let favoritesRepository: FavoritesRepository + @Injected private var busStopArrivalInfoRepository: BusStopArrivalInfoRepository + @Injected private var favoritesRepository: FavoritesRepository private var fetchItemLimit = 0 public private(set) var isFinalPage = false private var cachedResponses = [BusStopArrivalInfoResponse]() private let disposeBag = DisposeBag() - public init( - busStopArrivalInfoRepository: BusStopArrivalInfoRepository, - favoritesRepository: FavoritesRepository - ) { - self.busStopArrivalInfoRepository = busStopArrivalInfoRepository - self.favoritesRepository = favoritesRepository - } + public init() { } public func fakeFetch() -> Observable<[BusStopArrivalInfoResponse]> { fetchItemLimit = 5 diff --git a/Projects/Domain/Sources/UseCase/DefaultNearMapUseCase.swift b/Projects/Domain/Sources/UseCase/DefaultNearMapUseCase.swift index 8440345d..da621d2c 100644 --- a/Projects/Domain/Sources/UseCase/DefaultNearMapUseCase.swift +++ b/Projects/Domain/Sources/UseCase/DefaultNearMapUseCase.swift @@ -9,24 +9,21 @@ import CoreLocation import Foundation +import Core + import RxSwift import RxCocoa public final class DefaultNearMapUseCase: NearMapUseCase { - private let stationListRepository: StationListRepository - private let locationService: LocationService + @Injected private var locationService: LocationService + @Injected private var stationListRepository: StationListRepository public let locationStatus = BehaviorSubject( value: .notDetermined ) private let disposeBag = DisposeBag() - public init( - stationListRepository: StationListRepository, - locationService: LocationService - ) { - self.stationListRepository = stationListRepository - self.locationService = locationService + public init() { bindLocationStatus() } diff --git a/Projects/Domain/Sources/UseCase/DefaultRegularAlarmUseCase.swift b/Projects/Domain/Sources/UseCase/DefaultRegularAlarmUseCase.swift index 3e6bc95a..4724c12a 100644 --- a/Projects/Domain/Sources/UseCase/DefaultRegularAlarmUseCase.swift +++ b/Projects/Domain/Sources/UseCase/DefaultRegularAlarmUseCase.swift @@ -8,22 +8,18 @@ import Foundation +import Core + import RxSwift public class DefaultRegularAlarmUseCase: RegularAlarmUseCase { - private let localNotificationService: LocalNotificationService - private let regularAlarmRepository: RegularAlarmRepository + @Injected private var localNotificationService: LocalNotificationService + @Injected private var regularAlarmRepository: RegularAlarmRepository public let fetchedAlarm = PublishSubject<[RegularAlarmResponse]>() private let disposeBag = DisposeBag() - public init( - localNotificationService: LocalNotificationService, - regularAlarmRepository: RegularAlarmRepository - ) { - self.localNotificationService = localNotificationService - self.regularAlarmRepository = regularAlarmRepository - } + public init() { } public func fetchAlarm() { regularAlarmRepository.currentRegularAlarm diff --git a/Projects/Domain/Sources/UseCase/DefaultSearchUseCase.swift b/Projects/Domain/Sources/UseCase/DefaultSearchUseCase.swift index 3189f98f..37f82c7c 100644 --- a/Projects/Domain/Sources/UseCase/DefaultSearchUseCase.swift +++ b/Projects/Domain/Sources/UseCase/DefaultSearchUseCase.swift @@ -9,12 +9,14 @@ import CoreLocation import Foundation +import Core + import RxSwift import RxCocoa public final class DefaultSearchUseCase: SearchUseCase { - private let stationListRepository: StationListRepository - private let locationService: LocationService + @Injected private var stationListRepository: StationListRepository + @Injected private var locationService: LocationService public var locationStatus = BehaviorSubject( value: .notDetermined @@ -26,12 +28,7 @@ public final class DefaultSearchUseCase: SearchUseCase { ) private let disposeBag = DisposeBag() - public init( - stationListRepository: StationListRepository, - locationService: LocationService - ) { - self.stationListRepository = stationListRepository - self.locationService = locationService + public init() { bindLocationStatus() bindRecentSearchList() } diff --git a/Projects/Feature/AlarmFeature/Sources/ViewModel/AddRegularAlarmViewModel.swift b/Projects/Feature/AlarmFeature/Sources/ViewModel/AddRegularAlarmViewModel.swift index 03167cdc..ad75e1d8 100644 --- a/Projects/Feature/AlarmFeature/Sources/ViewModel/AddRegularAlarmViewModel.swift +++ b/Projects/Feature/AlarmFeature/Sources/ViewModel/AddRegularAlarmViewModel.swift @@ -16,12 +16,11 @@ import RxSwift import RxRelay final class AddRegularAlarmViewModel: ViewModel { + @Injected private var regularAlarmEditingService: RegularAlarmEditingService + @Injected private var useCase: AddRegularAlarmUseCase + private let alarmToEdit: RegularAlarmResponse? private let coordinator: AddRegularAlarmCoordinator - @Injected(RegularAlarmEditingService.self) - private var regularAlarmEditingService: RegularAlarmEditingService - @Injected(AddRegularAlarmUseCase.self) - private var useCase: AddRegularAlarmUseCase private let disposeBag = DisposeBag() diff --git a/Projects/Feature/AlarmFeature/Sources/ViewModel/RegularAlarmViewModel.swift b/Projects/Feature/AlarmFeature/Sources/ViewModel/RegularAlarmViewModel.swift index a798f6b3..1241ad3e 100644 --- a/Projects/Feature/AlarmFeature/Sources/ViewModel/RegularAlarmViewModel.swift +++ b/Projects/Feature/AlarmFeature/Sources/ViewModel/RegularAlarmViewModel.swift @@ -7,8 +7,9 @@ import FeatureDependency import RxSwift public final class RegularAlarmViewModel: ViewModel { + @Injected var useCase: RegularAlarmUseCase + private let coordinator: RegularAlarmCoordinator - @Injected(RegularAlarmUseCase.self) var useCase: RegularAlarmUseCase private let disposeBag = DisposeBag() diff --git a/Projects/Feature/BusStopFeature/Sources/ViewModel/BusStopViewModel.swift b/Projects/Feature/BusStopFeature/Sources/ViewModel/BusStopViewModel.swift index 9c0edbe0..c5882d44 100644 --- a/Projects/Feature/BusStopFeature/Sources/ViewModel/BusStopViewModel.swift +++ b/Projects/Feature/BusStopFeature/Sources/ViewModel/BusStopViewModel.swift @@ -7,9 +7,9 @@ import FeatureDependency import RxSwift public final class BusStopViewModel: ViewModel { + @Injected private var useCase: BusStopUseCase + private let coordinator: BusStopCoordinator - @Injected(BusStopUseCase.self) - private var useCase: BusStopUseCase private let disposeBag = DisposeBag() private var fetchData: ArrivalInfoRequest private let flow: FlowState diff --git a/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift b/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift index ff854750..482abffb 100644 --- a/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift +++ b/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift @@ -8,9 +8,9 @@ import RxSwift import RxRelay public final class FavoritesViewModel: ViewModel { - private let coordinator: HomeCoordinator - @Injected(FavoritesUseCase.self) var useCase: FavoritesUseCase + @Injected var useCase: FavoritesUseCase + private let coordinator: HomeCoordinator private let vmFetchStatus = PublishSubject() private let fetchedResponse = PublishSubject<[BusStopArrivalInfoResponse]>() private let disposeBag = DisposeBag() diff --git a/Projects/Feature/NearMapFeature/Sources/ViewModel/NearMapViewModel.swift b/Projects/Feature/NearMapFeature/Sources/ViewModel/NearMapViewModel.swift index bff9a0dc..e2db0097 100644 --- a/Projects/Feature/NearMapFeature/Sources/ViewModel/NearMapViewModel.swift +++ b/Projects/Feature/NearMapFeature/Sources/ViewModel/NearMapViewModel.swift @@ -10,7 +10,8 @@ import RxRelay import NMapsMap public final class NearMapViewModel: LeafMarkerUpdater, ViewModel { - @Injected(NearMapUseCase.self) var useCase: NearMapUseCase + @Injected var useCase: NearMapUseCase + private let coordinator: NearMapCoordinator private(set) var viewMode: NearMapMode private let disposeBag = DisposeBag() diff --git a/Projects/Feature/SearchFeature/Sources/ViewModel/SearchViewModel.swift b/Projects/Feature/SearchFeature/Sources/ViewModel/SearchViewModel.swift index 21f25700..c7519a0c 100644 --- a/Projects/Feature/SearchFeature/Sources/ViewModel/SearchViewModel.swift +++ b/Projects/Feature/SearchFeature/Sources/ViewModel/SearchViewModel.swift @@ -8,10 +8,10 @@ import RxSwift import RxRelay public final class SearchViewModel: ViewModel { + @Injected var useCase: SearchUseCase + private let coordinator: SearchCoordinator - @Injected(SearchUseCase.self) var useCase: SearchUseCase - private let disposeBag = DisposeBag() public init(coordinator: SearchCoordinator) { From 1064fda90caee45bdd8706fbe95cb9894483537f Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:44:45 +0900 Subject: [PATCH 3/9] =?UTF-8?q?[Fix]=20Rx=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=88=98=EC=A0=95(SceneDelegate=20=EC=BB=B4=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectDescriptionHelpers/Dependency+ThirdPartyRemote.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+ThirdPartyRemote.swift b/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+ThirdPartyRemote.swift index e3707fe9..5cd4c08f 100644 --- a/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+ThirdPartyRemote.swift +++ b/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+ThirdPartyRemote.swift @@ -26,7 +26,7 @@ public extension Array.ThirdPartyRemote { public var upToNextMajor: Version { switch self { case .rxSwift: - return "6.0.0" + return "6.8.0" } } } From 15c902b06394e770741399a07d0d14e702f70eb7 Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:45:16 +0900 Subject: [PATCH 4/9] =?UTF-8?q?[Chore]=20Lint=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=9D=BC=EC=9D=B8=20=EA=B2=BD=EA=B3=A0=2080=20->=2090=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .swiftlint.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.swiftlint.yml b/.swiftlint.yml index 9b0bd349..e274dc8b 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -1,5 +1,6 @@ excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음 - Projects/App/Sources/AppDelegate.swift + - Projects/App/Sources/AppDelegate+Register.swift - Projects/App/Sources/SceneDelegate.swift - Projects/App/Tests/** - Projects/Core/Sources/Extension/String+.swift @@ -29,7 +30,7 @@ file_length: warning: 1000 error: 2000 line_length: - warning: 80 + warning: 90 error: 400 disabled_rules: # 제외하고 싶은 룰 - trailing_whitespace From bf16347e469cdb00aa6533ff1847f531a2eac8c4 Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:45:32 +0900 Subject: [PATCH 5/9] =?UTF-8?q?[Chore]=20=EC=BD=94=EB=93=9C=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/CoreDataService/Sources/CoreDataService.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Projects/CoreDataService/Sources/CoreDataService.swift b/Projects/CoreDataService/Sources/CoreDataService.swift index 1c1f0ebb..b592b881 100644 --- a/Projects/CoreDataService/Sources/CoreDataService.swift +++ b/Projects/CoreDataService/Sources/CoreDataService.swift @@ -15,10 +15,7 @@ import RxSwift public protocol CoreDataService { var storeStatus: BehaviorSubject { get } - func fetch( - type: T.Type - ) -> Observable<[T]> -// func fetch(type: T.Type) throws -> [T] + func fetch(type: T.Type) -> Observable<[T]> func save(data: some CoreDataStorable) throws From 7cd1cfe31b71db9e4b14859d93fcc62bfea0b787 Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Sun, 30 Mar 2025 02:59:08 +0900 Subject: [PATCH 6/9] =?UTF-8?q?[Chore]=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=A0=9C=EC=96=B4=EC=9E=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HomeFeature/Sources/ViewModel/FavoritesViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift b/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift index 482abffb..ebe00f43 100644 --- a/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift +++ b/Projects/Feature/HomeFeature/Sources/ViewModel/FavoritesViewModel.swift @@ -8,7 +8,7 @@ import RxSwift import RxRelay public final class FavoritesViewModel: ViewModel { - @Injected var useCase: FavoritesUseCase + @Injected private var useCase: FavoritesUseCase private let coordinator: HomeCoordinator private let vmFetchStatus = PublishSubject() From f03327a47a871e914433fd32284ed769febff3e9 Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Sun, 30 Mar 2025 03:00:07 +0900 Subject: [PATCH 7/9] =?UTF-8?q?[Fix]=20DIContainer=20Lock=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/Core/Sources/DIContainer/DIContainer.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Projects/Core/Sources/DIContainer/DIContainer.swift b/Projects/Core/Sources/DIContainer/DIContainer.swift index aaddd914..d2926ea0 100644 --- a/Projects/Core/Sources/DIContainer/DIContainer.swift +++ b/Projects/Core/Sources/DIContainer/DIContainer.swift @@ -12,16 +12,21 @@ import FirebaseAnalytics public enum DIContainer { private static var storage: [String: Any] = [:] + private static var lock: NSLock = .init() public static func register( type: Dependency.Type, _ instance: Dependency ) { + lock.lock() + defer { lock.unlock() } storage[String(describing: Dependency.self)] = instance } static func resolve(type: Dependency.Type) -> Dependency { let typeName = String(describing: Dependency.self) + lock.lock() + defer { lock.unlock() } guard let savedInstance = storage[typeName] as? Dependency else { Analytics.logEvent("DependencyCrash", parameters: ["type": typeName]) fatalError("register 되지 않은 객체 호출: \(type)") From 6f159a011d9ef7c43b6e840306606141b60bd84b Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Thu, 26 Jun 2025 23:35:36 +0900 Subject: [PATCH 8/9] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InfoPlist/WhereMyBusInfoPlist.swift | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 Plugins/EnvironmentPlugin/ProjectDescriptionHelpers/Buildable/InfoPlistBuildable/InfoPlist/WhereMyBusInfoPlist.swift diff --git a/Plugins/EnvironmentPlugin/ProjectDescriptionHelpers/Buildable/InfoPlistBuildable/InfoPlist/WhereMyBusInfoPlist.swift b/Plugins/EnvironmentPlugin/ProjectDescriptionHelpers/Buildable/InfoPlistBuildable/InfoPlist/WhereMyBusInfoPlist.swift deleted file mode 100644 index 26b60f3c..00000000 --- a/Plugins/EnvironmentPlugin/ProjectDescriptionHelpers/Buildable/InfoPlistBuildable/InfoPlist/WhereMyBusInfoPlist.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// WhereMyBusInfoPlist.swift -// EnvironmentPlugin -// -// Created by gnksbm on 4/11/25. -// - -import Foundation - - - - - - - - From 5b532c1424fbdf0eb5086b09f56f1fa1f715368f Mon Sep 17 00:00:00 2001 From: Geonseob Kim <109283556+gnksbm@users.noreply.github.com> Date: Thu, 26 Jun 2025 23:35:43 +0900 Subject: [PATCH 9/9] =?UTF-8?q?fix:=20=EB=B9=8C=EB=93=9C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/App/Sources/AppDelegate+Register.swift | 6 +++++- Projects/App/Sources/SceneDelegate.swift | 10 ++-------- .../Core/Sources/DIContainer/DIContainer.swift | 8 ++++++-- .../DefaultBusStopArrivalInfoRepository.swift | 4 +--- .../Repository/DefaultVersionCheckRepository.swift | 6 ++---- .../DefaultForceUpdateService.swift | 1 - .../UseCase/DefaultVersionCheckUseCase.swift | 14 +++++--------- 7 files changed, 21 insertions(+), 28 deletions(-) diff --git a/Projects/App/Sources/AppDelegate+Register.swift b/Projects/App/Sources/AppDelegate+Register.swift index 68d36451..e2917c44 100644 --- a/Projects/App/Sources/AppDelegate+Register.swift +++ b/Projects/App/Sources/AppDelegate+Register.swift @@ -17,6 +17,10 @@ import FirebaseModule extension AppDelegate { func registerDependencies() { + let firebaseLogger = FirebaseLoggerImpl() + DIContainer.setLogger(firebaseLogger) + + DIContainer.register(type: ForceUpdateService.self, DefaultForceUpdateService()) DIContainer.register(type: CoreDataService.self, DefaultCoreDataService()) DIContainer.register(type: NetworkService.self, DefaultNetworkService()) DIContainer.register(type: LocationService.self, DefaultLocationService()) @@ -35,7 +39,7 @@ extension AppDelegate { DIContainer.register(type: SearchUseCase.self, DefaultSearchUseCase()) DIContainer.register(type: BusStopUseCase.self, DefaultBusStopUseCase()) DIContainer.register(type: NearMapUseCase.self, DefaultNearMapUseCase()) - DIContainer.register(type: FirebaseLogger.self, FirebaseLoggerImpl()) + DIContainer.register(type: FirebaseLogger.self, firebaseLogger) DIContainer.register(type: VersionCheckUseCase.self, DefaultVersionCheckUseCase()) } } diff --git a/Projects/App/Sources/SceneDelegate.swift b/Projects/App/Sources/SceneDelegate.swift index 6b7f028b..31057209 100644 --- a/Projects/App/Sources/SceneDelegate.swift +++ b/Projects/App/Sources/SceneDelegate.swift @@ -16,20 +16,14 @@ import Data import RxSwift final class SceneDelegate: UIResponder, UIWindowSceneDelegate { + @Injected private var useCase: VersionCheckUseCase + var window: UIWindow? var appCoordinator: AppCoordinator? var deeplinkHandler: DeeplinkHandler? let disposeBag = DisposeBag() - // MARK: 추후 구체타입이 아닌 형태로 변경 - private var useCase: VersionCheckUseCase - = DefaultVersionCheckUseCase( - versionCheckRepository: DefaultVersionCheckRepository( - networkService: DefaultNetworkService() - ), - forceUpdateService: DefaultForceUpdateService() - ) func scene( _ scene: UIScene, diff --git a/Projects/Core/Sources/DIContainer/DIContainer.swift b/Projects/Core/Sources/DIContainer/DIContainer.swift index d2926ea0..da68af4c 100644 --- a/Projects/Core/Sources/DIContainer/DIContainer.swift +++ b/Projects/Core/Sources/DIContainer/DIContainer.swift @@ -8,11 +8,15 @@ import Foundation -import FirebaseAnalytics +import FirebaseInterface public enum DIContainer { private static var storage: [String: Any] = [:] private static var lock: NSLock = .init() + private static var firebaseLogger: FirebaseLogger? + public static func setLogger(_ logger: FirebaseLogger) { + firebaseLogger = logger + } public static func register( type: Dependency.Type, @@ -28,7 +32,7 @@ public enum DIContainer { lock.lock() defer { lock.unlock() } guard let savedInstance = storage[typeName] as? Dependency else { - Analytics.logEvent("DependencyCrash", parameters: ["type": typeName]) + firebaseLogger?.log(name: "DependencyCrash", parameter: ["type": typeName]) fatalError("register 되지 않은 객체 호출: \(type)") } return savedInstance diff --git a/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift b/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift index 5453efd9..07ed5cfa 100644 --- a/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift +++ b/Projects/Data/Sources/Repository/DefaultBusStopArrivalInfoRepository.swift @@ -11,15 +11,13 @@ import Foundation import Domain import Core import NetworkService -import Core import RxSwift import FirebaseInterface public final class DefaultBusStopArrivalInfoRepository: NSObject, BusStopArrivalInfoRepository { @Injected private var networkService: NetworkService - private let networkService: NetworkService - @Injected(FirebaseLogger.self) private var logger: FirebaseLogger + @Injected private var logger: FirebaseLogger public func fetchArrivalList(busStopId: String) -> Observable { logger.log(name: "fetchArrivalEvent") diff --git a/Projects/Data/Sources/Repository/DefaultVersionCheckRepository.swift b/Projects/Data/Sources/Repository/DefaultVersionCheckRepository.swift index 3575999b..c3b5e934 100644 --- a/Projects/Data/Sources/Repository/DefaultVersionCheckRepository.swift +++ b/Projects/Data/Sources/Repository/DefaultVersionCheckRepository.swift @@ -15,7 +15,7 @@ import NetworkService import RxSwift public final class DefaultVersionCheckRepository: VersionCheckRepository { - private let networkService: NetworkService + @Injected private var networkService: NetworkService @UserDefaultsWrapper( key: "ForceUpdate", @@ -26,9 +26,7 @@ public final class DefaultVersionCheckRepository: VersionCheckRepository { ) private var forceUpdateInfo: ForceUpdate - public init(networkService: NetworkService) { - self.networkService = networkService - } + public init() { } /// 서버로 부터 받은 App의 최소 지원 버전 public func fetchRequiredVersion() diff --git a/Projects/Data/Sources/Service/ForceUpdateService/DefaultForceUpdateService.swift b/Projects/Data/Sources/Service/ForceUpdateService/DefaultForceUpdateService.swift index 74a2083f..9db22d53 100644 --- a/Projects/Data/Sources/Service/ForceUpdateService/DefaultForceUpdateService.swift +++ b/Projects/Data/Sources/Service/ForceUpdateService/DefaultForceUpdateService.swift @@ -11,7 +11,6 @@ import Foundation import Domain public final class DefaultForceUpdateService: ForceUpdateService { - public init() { } public func compareVersion( diff --git a/Projects/Domain/Sources/UseCase/DefaultVersionCheckUseCase.swift b/Projects/Domain/Sources/UseCase/DefaultVersionCheckUseCase.swift index edfa0b56..0f1228c2 100644 --- a/Projects/Domain/Sources/UseCase/DefaultVersionCheckUseCase.swift +++ b/Projects/Domain/Sources/UseCase/DefaultVersionCheckUseCase.swift @@ -8,19 +8,15 @@ import Foundation +import Core + import RxSwift public final class DefaultVersionCheckUseCase: VersionCheckUseCase { - private let versionCheckRepository: VersionCheckRepository - private let forceUpdateService: ForceUpdateService + @Injected private var versionCheckRepository: VersionCheckRepository + @Injected private var forceUpdateService: ForceUpdateService - public init( - versionCheckRepository: VersionCheckRepository, - forceUpdateService: ForceUpdateService - ) { - self.versionCheckRepository = versionCheckRepository - self.forceUpdateService = forceUpdateService - } + public init() { } public func fetchAppStoreURL() -> Single { if hasToFetchVersion() {