From 9ff7558a5e8b124a50aa7e66922d335a5443ebd3 Mon Sep 17 00:00:00 2001 From: yeonee Date: Tue, 6 Jan 2026 01:16:19 +0900 Subject: [PATCH 1/5] feat: #7 DIContainer --- .../Cherrish-iOS/App/DIContainer+.swift | 18 +++++++++++ .../Cherrish-iOS/Core/DIContainer.swift | 30 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 Cherrish-iOS/Cherrish-iOS/App/DIContainer+.swift diff --git a/Cherrish-iOS/Cherrish-iOS/App/DIContainer+.swift b/Cherrish-iOS/Cherrish-iOS/App/DIContainer+.swift new file mode 100644 index 00000000..3c218d73 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/App/DIContainer+.swift @@ -0,0 +1,18 @@ +// +// AppDIContainer+.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/5/26. +// + +import Foundation + +extension DIContainer { + func dependencyInjection() { + let dataDependencyAssembler = DataDependencyAssembler() + let domainDependencyAssembler = DomainDependencyAssembler(preAssembler: dataDependencyAssembler) + let presentationDependencyAssembler = PresentationDependencyAssembler(preAssembler: domainDependencyAssembler) + + presentationDependencyAssembler.assemble() + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Core/DIContainer.swift b/Cherrish-iOS/Cherrish-iOS/Core/DIContainer.swift index b254fa01..6a280de1 100644 --- a/Cherrish-iOS/Cherrish-iOS/Core/DIContainer.swift +++ b/Cherrish-iOS/Cherrish-iOS/Core/DIContainer.swift @@ -1,7 +1,35 @@ // -// DIContainer.swift +// AppDIContainer.swift // Cherrish-iOS // // Created by 이나연 on 12/31/25. // +import Foundation + +protocol DependencyAssembler { + func assemble() +} + +final class DIContainer { + + static let shared = DIContainer() + + private init() { } + + private var dependencies: [String: () -> Any] = [:] + + func register(type: T.Type, closure: @escaping () -> T) { + let key = String(describing: T.self) + dependencies[key] = closure + } + + func resolve(type: T.Type) -> T? { + let key = String(describing: T.self) + guard let closure = dependencies[key] else { + return nil + } + + return closure() as? T + } +} From 8da583153b8f7ca693c13d06c31b87cb5f98a2fd Mon Sep 17 00:00:00 2001 From: yeonee Date: Tue, 6 Jan 2026 01:16:39 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20#7=20layer=20=EB=B3=84=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/DataDependencyAssembler.swift | 16 ++++++++++ .../Domain/DomainDependencyAssembler.swift | 28 +++++++++++++++++ .../PresentationDependencyAssembler.swift | 31 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 Cherrish-iOS/Cherrish-iOS/Data/DataDependencyAssembler.swift create mode 100644 Cherrish-iOS/Cherrish-iOS/Domain/DomainDependencyAssembler.swift create mode 100644 Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift diff --git a/Cherrish-iOS/Cherrish-iOS/Data/DataDependencyAssembler.swift b/Cherrish-iOS/Cherrish-iOS/Data/DataDependencyAssembler.swift new file mode 100644 index 00000000..bfbb6dcd --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Data/DataDependencyAssembler.swift @@ -0,0 +1,16 @@ +// +// DataDependencyAssembler.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/5/26. +// + +import Foundation + +final class DataDependencyAssembler: DependencyAssembler { + func assemble() { + DIContainer.shared.register(type: TestInterface.self) { + return DefaultTestRepository() + } + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Domain/DomainDependencyAssembler.swift b/Cherrish-iOS/Cherrish-iOS/Domain/DomainDependencyAssembler.swift new file mode 100644 index 00000000..fae9b612 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Domain/DomainDependencyAssembler.swift @@ -0,0 +1,28 @@ +// +// DomainDependencyAssembler.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/5/26. +// + +import Foundation + +final class DomainDependencyAssembler: DependencyAssembler { + private let preAssembler: DependencyAssembler + + init(preAssembler: DependencyAssembler) { + self.preAssembler = preAssembler + } + + func assemble() { + preAssembler.assemble() + + guard let testRepository = DIContainer.shared.resolve(type: TestInterface.self) else { + return + } + + DIContainer.shared.register(type: TestUseCase.self) { + return DefaultTestUseCase(repository: testRepository) + } + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift new file mode 100644 index 00000000..6c535173 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/PresentationDependencyAssembler.swift @@ -0,0 +1,31 @@ +// +// PresentationDependencyAssembler.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/5/26. +// + +import Foundation + +final class PresentationDependencyAssembler: DependencyAssembler { + private let preAssembler: DependencyAssembler + + init(preAssembler: DependencyAssembler) { + self.preAssembler = preAssembler + } + + func assemble() { + preAssembler.assemble() + + guard let testUseCase = DIContainer.shared.resolve(type: TestUseCase.self) else { + return + } + + DIContainer.shared.register(type: TestViewModel.self) { + print("뷰모델 등록") + return TestViewModel(testUseCase: testUseCase) + } + } + + +} From d24faa9b647cb47888b04536e46ad22f3ae20e6b Mon Sep 17 00:00:00 2001 From: yeonee Date: Tue, 6 Jan 2026 01:16:56 +0900 Subject: [PATCH 3/5] feat: #7 viewFactory --- .../Presentation/ViewFactory.swift | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift new file mode 100644 index 00000000..e94af7f7 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/ViewFactory.swift @@ -0,0 +1,22 @@ +// +// ViewFactory.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/5/26. +// + +import Foundation + +protocol ViewFactoryProtocol { + static func makeTestView() -> TestView +} + +final class ViewFactory: ViewFactoryProtocol { + static func makeTestView() -> TestView { + guard let viewModel = DIContainer.shared.resolve(type: TestViewModel.self) else { + // TODO: DI 실패 시 기본으로 갈 곳 지정 + fatalError() + } + return TestView(viewModel: viewModel) + } +} From 5dc0bd2890d52ef35c63e90c93e3c477efcd95d3 Mon Sep 17 00:00:00 2001 From: yeonee Date: Tue, 6 Jan 2026 01:17:16 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20#7=20DIContainer=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=9A=A9=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Data/Repository/Repository.swift | 8 ------ .../Data/Repository/TestRepository.swift | 14 +++++++++++ .../{Interface.swift => TestInterface.swift} | 4 +++ .../Domain/UseCase/TestUseCase.swift | 25 +++++++++++++++++++ .../Cherrish-iOS/Domain/UseCase/Usecase.swift | 8 ------ .../Presentation/Feature/ContentView.swift | 17 ------------- .../Presentation/Feature/TestView.swift | 23 +++++++++++++++++ .../Presentation/Feature/TestViewModel.swift | 23 +++++++++++++++++ 8 files changed, 89 insertions(+), 33 deletions(-) delete mode 100644 Cherrish-iOS/Cherrish-iOS/Data/Repository/Repository.swift create mode 100644 Cherrish-iOS/Cherrish-iOS/Data/Repository/TestRepository.swift rename Cherrish-iOS/Cherrish-iOS/Domain/Interface/{Interface.swift => TestInterface.swift} (69%) create mode 100644 Cherrish-iOS/Cherrish-iOS/Domain/UseCase/TestUseCase.swift delete mode 100644 Cherrish-iOS/Cherrish-iOS/Domain/UseCase/Usecase.swift delete mode 100644 Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ContentView.swift create mode 100644 Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestView.swift create mode 100644 Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestViewModel.swift diff --git a/Cherrish-iOS/Cherrish-iOS/Data/Repository/Repository.swift b/Cherrish-iOS/Cherrish-iOS/Data/Repository/Repository.swift deleted file mode 100644 index 0c1a6353..00000000 --- a/Cherrish-iOS/Cherrish-iOS/Data/Repository/Repository.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// Repository.swift -// Cherrish-iOS -// -// Created by 이나연 on 1/3/26. -// - -import Foundation diff --git a/Cherrish-iOS/Cherrish-iOS/Data/Repository/TestRepository.swift b/Cherrish-iOS/Cherrish-iOS/Data/Repository/TestRepository.swift new file mode 100644 index 00000000..2f5a0414 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Data/Repository/TestRepository.swift @@ -0,0 +1,14 @@ +// +// Repository.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/3/26. +// + +import Foundation + +struct DefaultTestRepository: TestInterface { + func test() { + print("Repository Test!") + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Domain/Interface/Interface.swift b/Cherrish-iOS/Cherrish-iOS/Domain/Interface/TestInterface.swift similarity index 69% rename from Cherrish-iOS/Cherrish-iOS/Domain/Interface/Interface.swift rename to Cherrish-iOS/Cherrish-iOS/Domain/Interface/TestInterface.swift index 19bf475a..1393ed47 100644 --- a/Cherrish-iOS/Cherrish-iOS/Domain/Interface/Interface.swift +++ b/Cherrish-iOS/Cherrish-iOS/Domain/Interface/TestInterface.swift @@ -6,3 +6,7 @@ // import Foundation + +protocol TestInterface { + func test() +} diff --git a/Cherrish-iOS/Cherrish-iOS/Domain/UseCase/TestUseCase.swift b/Cherrish-iOS/Cherrish-iOS/Domain/UseCase/TestUseCase.swift new file mode 100644 index 00000000..47ee15a4 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Domain/UseCase/TestUseCase.swift @@ -0,0 +1,25 @@ +// +// Usecase.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/3/26. +// + +import Foundation + +protocol TestUseCase { + func execute() +} + +struct DefaultTestUseCase: TestUseCase { + private let repository: TestInterface + + init(repository: TestInterface) { + self.repository = repository + } + + func execute() { + self.repository.test() + print("UseCase execute") + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Domain/UseCase/Usecase.swift b/Cherrish-iOS/Cherrish-iOS/Domain/UseCase/Usecase.swift deleted file mode 100644 index 5a40044d..00000000 --- a/Cherrish-iOS/Cherrish-iOS/Domain/UseCase/Usecase.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// Usecase.swift -// Cherrish-iOS -// -// Created by 이나연 on 1/3/26. -// - -import Foundation diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ContentView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ContentView.swift deleted file mode 100644 index 02607b0b..00000000 --- a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/ContentView.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// ContentView.swift -// Cherrish-iOS -// -// Created by 이나연 on 12/31/25. -// - -import SwiftUI - -struct ContentView: View { - var body: some View { - VStack { - Text("Hello, world!") - } - .padding() - } -} diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestView.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestView.swift new file mode 100644 index 00000000..d4db72d5 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestView.swift @@ -0,0 +1,23 @@ +// +// ContentView.swift +// Cherrish-iOS +// +// Created by 이나연 on 12/31/25. +// + +import SwiftUI + +struct TestView: View { + @ObservedObject var viewModel: TestViewModel + + var body: some View { + VStack { + Button(action: { + viewModel.test() + }) { + Text("\(viewModel.text)") + } + .padding() + } + } +} diff --git a/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestViewModel.swift b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestViewModel.swift new file mode 100644 index 00000000..c3d4bd43 --- /dev/null +++ b/Cherrish-iOS/Cherrish-iOS/Presentation/Feature/TestViewModel.swift @@ -0,0 +1,23 @@ +// +// TestViewModel.swift +// Cherrish-iOS +// +// Created by 이나연 on 1/5/26. +// + +import Foundation + +final class TestViewModel: ObservableObject { + @Published var text: String = "터치해보세여" + private let testUseCase: TestUseCase + + init(testUseCase: TestUseCase) { + self.testUseCase = testUseCase + } + + func test() { + testUseCase.execute() + text = "버튼 터치했음!" + print("view model execute") + } +} From 2b06bf775f578374953856df8057d094b5410c76 Mon Sep 17 00:00:00 2001 From: yeonee Date: Tue, 6 Jan 2026 01:17:28 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20#7=20DIContainer=20=EC=95=B1=20?= =?UTF-8?q?=EC=A7=84=EC=9E=85=20=EC=8B=9C=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cherrish-iOS/Cherrish-iOS/App/Cherrish_iOSApp.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Cherrish-iOS/Cherrish-iOS/App/Cherrish_iOSApp.swift b/Cherrish-iOS/Cherrish-iOS/App/Cherrish_iOSApp.swift index 1fbe2f90..c585493b 100644 --- a/Cherrish-iOS/Cherrish-iOS/App/Cherrish_iOSApp.swift +++ b/Cherrish-iOS/Cherrish-iOS/App/Cherrish_iOSApp.swift @@ -9,9 +9,15 @@ import SwiftUI @main struct Cherrish_iOSApp: App { + + init() { + // TODO: 코디네이터에서 실행하기 + DIContainer.shared.dependencyInjection() + } + var body: some Scene { WindowGroup { - ContentView() + ViewFactory.makeTestView() } } }