Skip to content

Commit 86e5b15

Browse files
log: 분실물 도메인 분리 로깅
1 parent c9f7a9d commit 86e5b15

9 files changed

Lines changed: 115 additions & 23 deletions

File tree

Koin/Apps/SceneDelegate.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
3737
let lostItemRepository = DefaultLostItemRepository(service: DefaultLostItemService())
3838
let checkLoginUseCase = DefaultCheckLoginUseCase(userRepository: userRepository)
3939
let fetchLostItemItemUseCase = DefaultFetchLostItemListUseCase(repository: lostItemRepository)
40-
let viewModel = LostItemListViewModel(checkLoginUseCase: checkLoginUseCase, fetchLostItemListUseCase: fetchLostItemItemUseCase)
40+
let logAnalyticsEventUseCase = DefaultLogAnalyticsEventUseCase(repository: GA4AnalyticsRepository(service: GA4AnalyticsService()))
41+
let viewModel = LostItemListViewModel(
42+
checkLoginUseCase: checkLoginUseCase,
43+
fetchLostItemListUseCase: fetchLostItemItemUseCase,
44+
logAnalyticsEventUseCase: logAnalyticsEventUseCase
45+
)
4146
let viewController = LostItemListViewController(viewModel: viewModel)
4247
navigationController.pushViewController(viewController, animated: false)
4348
}
@@ -54,7 +59,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
5459
let lostItemRepository = DefaultLostItemRepository(service: DefaultLostItemService())
5560
let checkLoginUseCase = DefaultCheckLoginUseCase(userRepository: userRepository)
5661
let fetchLostItemItemUseCase = DefaultFetchLostItemListUseCase(repository: lostItemRepository)
57-
let viewModel = LostItemListViewModel(checkLoginUseCase: checkLoginUseCase, fetchLostItemListUseCase: fetchLostItemItemUseCase)
62+
let logAnalyticsEventUseCase = DefaultLogAnalyticsEventUseCase(repository: GA4AnalyticsRepository(service: GA4AnalyticsService()))
63+
let viewModel = LostItemListViewModel(
64+
checkLoginUseCase: checkLoginUseCase,
65+
fetchLostItemListUseCase: fetchLostItemItemUseCase,
66+
logAnalyticsEventUseCase: logAnalyticsEventUseCase
67+
)
5868
let viewController = LostItemListViewController(viewModel: viewModel)
5969
navigationController.pushViewController(viewController, animated: false)
6070
}

Koin/Core/Logger/EventParameter.swift

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ enum EventParameter {
126126
case departureTimeSettingDone = "departure_time_setting_done"
127127
case searchResultBusType = "search_result_bus_type"
128128

129+
// Notice
129130
case noticeTab = "notice_tab"
130131
case noticePage = "notice_page"
131132
case inventory = "inventory"
@@ -146,18 +147,24 @@ enum EventParameter {
146147
case popularNoticeBanner = "popular_notice_banner"
147148
case toManageKeyword = "to_manage_keyword"
148149

150+
// Noti
149151
case notificationSoldOut = "notification_sold_out"
150152
case notificationBreakfastSoldOut = "notification_breakfast_sold_out"
151153
case notificationLunchSoldOut = "notification_lunch_sold_out"
152154
case notificationDinnerSoldOut = "notification_dinner_sold_out"
153155

154-
case itemWrite = "item_write"
155-
case findUserCategory = "find_user_category"
156-
case findUserAddItem = "find_user_add_item"
157-
case findUserWriteConfirm = "find_user_write_confirm"
156+
// lostitem
158157
case findUserDelete = "find_user_delete"
159158
case findUserDeleteConfirm = "find_user_delete_confirm"
160-
159+
case lostItemEntry = "lost_item_entry"
160+
case lostItemFilter = "lost_item_filter"
161+
case lostItemFilterApply = "lost_item_filter_apply"
162+
case lostItemPostEntry = "lost_item_post_entry"
163+
case lostItemMessageLoginRequest = "lost_item_message_login_request"
164+
case lostItemWriteLoginRequest = "lost_item_write_login_request"
165+
case lostItemStateChange = "lost_item_state_change"
166+
case lostItemFound = "lost_item_found"
167+
case itemWrite = "item_write"
161168
case lostItemWrite = "lost_item_write"
162169
case findUserWrite = "find_user_write"
163170
case lostItemCategory = "lost_item_category"
@@ -168,6 +175,9 @@ enum EventParameter {
168175
case itemPostReportConfirm = "item_post_report_confirm"
169176
case messageListSelect = "message_list_select"
170177
case itemPostType = "item_post_type"
178+
case findUserCategory = "find_user_category"
179+
case findUserAddItem = "find_user_add_item"
180+
case findUserWriteConfirm = "find_user_write_confirm"
171181

172182
case loginPrompt = "login_prompt"
173183

Koin/Presentation/Home/Home/HomeViewController.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,7 @@ final class HomeViewController: UIViewController {
318318
}.store(in: &subscriptions)
319319

320320
lostItemListView.lostItemListTappedPublisher.sink { [weak self] in
321+
self?.inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.lostItemEntry, .click, "분실물"))
321322
self?.navigateToLostItemList()
322323
}.store(in: &subscriptions)
323324
}
@@ -614,7 +615,12 @@ extension HomeViewController {
614615
let lostItemRepository = DefaultLostItemRepository(service: DefaultLostItemService())
615616
let checkLoginUseCase = DefaultCheckLoginUseCase(userRepository: userRepository)
616617
let fetchLostItemItemUseCase = DefaultFetchLostItemListUseCase(repository: lostItemRepository)
617-
let viewModel = LostItemListViewModel(checkLoginUseCase: checkLoginUseCase, fetchLostItemListUseCase: fetchLostItemItemUseCase)
618+
let logAnalyticsEventUseCase = DefaultLogAnalyticsEventUseCase(repository: GA4AnalyticsRepository(service: GA4AnalyticsService()))
619+
let viewModel = LostItemListViewModel(
620+
checkLoginUseCase: checkLoginUseCase,
621+
fetchLostItemListUseCase: fetchLostItemItemUseCase,
622+
logAnalyticsEventUseCase: logAnalyticsEventUseCase
623+
)
618624
let viewController = LostItemListViewController(viewModel: viewModel)
619625
navigationController?.pushViewController(viewController, animated: true)
620626
}

Koin/Presentation/Home/ServiceSelect/ServiceSelectViewController.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,17 @@ extension ServiceSelectViewController {
151151
extension ServiceSelectViewController {
152152

153153
private func pushLostItem() {
154+
inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.hamburger, .click, "분실물"))
154155
let userRepository = DefaultUserRepository(service: DefaultUserService())
155156
let lostItemRepository = DefaultLostItemRepository(service: DefaultLostItemService())
156157
let checkLoginUseCase = DefaultCheckLoginUseCase(userRepository: userRepository)
157158
let fetchLostItemItemUseCase = DefaultFetchLostItemListUseCase(repository: lostItemRepository)
158-
let viewModel = LostItemListViewModel(checkLoginUseCase: checkLoginUseCase, fetchLostItemListUseCase: fetchLostItemItemUseCase)
159+
let logAnalyticsEventUseCase = DefaultLogAnalyticsEventUseCase(repository: GA4AnalyticsRepository(service: GA4AnalyticsService()))
160+
let viewModel = LostItemListViewModel(
161+
checkLoginUseCase: checkLoginUseCase,
162+
fetchLostItemListUseCase: fetchLostItemItemUseCase,
163+
logAnalyticsEventUseCase: logAnalyticsEventUseCase
164+
)
159165
let viewController = LostItemListViewController(viewModel: viewModel)
160166
navigationController?.pushViewController(viewController, animated: true)
161167
}

Koin/Presentation/LostItem/LostItemData/LostItemDataViewController.swift

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,15 @@ final class LostItemDataViewController: UIViewController {
108108
let changeLostItemStateUseCase = DefaultChangeLostItemStateUseCase(repository: lostItemRepository)
109109
let createChatRoomUseCase = DefaultCreateChatRoomUseCase(chatRepository: chatRepository)
110110
let deleteLostItemUseCase = DefaultDeleteLostItemUseCase(repository: lostItemRepository)
111+
let logAnalyticsEventUseCase = DefaultLogAnalyticsEventUseCase(repository: GA4AnalyticsRepository(service: GA4AnalyticsService()))
111112
let viewModel = LostItemDataViewModel(
112113
checkLoginUseCase: checkLoginUseCase,
113114
fetchLostItemDataUseCase: fetchLostItemDataUseCase,
114115
fetchLostItemListUseCase: fetchLostItemListUseCase,
115116
changeLostItemStateUseCase: changeLostItemStateUseCase,
116117
deleteLostItemUseCase: deleteLostItemUseCase,
117118
createChatRoomUseCase: createChatRoomUseCase,
119+
logAnalyticsEventUseCase: logAnalyticsEventUseCase,
118120
id: id)
119121
let viewController = LostItemDataViewController(viewModel: viewModel)
120122
viewController.delegate = self
@@ -135,22 +137,29 @@ final class LostItemDataViewController: UIViewController {
135137
}.store(in: &subscription)
136138

137139
buttonsView.deleteButtonTappedPublisher.sink { [weak self] in
138-
self?.showDeleteModal()
140+
guard let self, let type = viewModel.type else { return }
141+
inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.findUserDelete, EventParameter.EventCategory.click, "\(type.description)"))
142+
showDeleteModal()
139143
}.store(in: &subscription)
140144

141145
buttonsView.editButtonTappedPublisher.sink { [weak self] in
142146
self?.navigateToEdit()
143147
}.store(in: &subscription)
144148

145149
buttonsView.changeStateButtonTappedPublisher.sink { [weak self] in
146-
self?.showChangeStateModal()
150+
guard let self, let type = viewModel.type else { return }
151+
inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.lostItemStateChange, .click, "\(type.description)"))
152+
self.showChangeStateModal()
147153
}.store(in: &subscription)
148154

149155
buttonsView.chatButtonTappedPublisher.sink { [weak self] in
150-
self?.inputSubject.send(.checkLogIn(.chat))
156+
guard let self, let type = viewModel.type else { return }
157+
inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.itemMessageSend, .click, "\(type.description)물 쪽지 보내기"))
158+
inputSubject.send(.checkLogIn(.chat))
151159
}.store(in: &subscription)
152160

153161
buttonsView.reportButtonTappedPublisher.sink { [weak self] in
162+
self?.inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.itemPostReport, .click, "신고하기"))
154163
self?.inputSubject.send(.checkLogIn(.report))
155164
}.store(in: &subscription)
156165

@@ -212,7 +221,12 @@ extension LostItemDataViewController {
212221
let lostItemRepository = DefaultLostItemRepository(service: DefaultLostItemService())
213222
let checkLoginUseCase = DefaultCheckLoginUseCase(userRepository: userRepository)
214223
let fetchLostItemItemUseCase = DefaultFetchLostItemListUseCase(repository: lostItemRepository)
215-
let viewModel = LostItemListViewModel(checkLoginUseCase: checkLoginUseCase, fetchLostItemListUseCase: fetchLostItemItemUseCase)
224+
let logAnalyticsEventUseCase = DefaultLogAnalyticsEventUseCase(repository: GA4AnalyticsRepository(service: GA4AnalyticsService()))
225+
let viewModel = LostItemListViewModel(
226+
checkLoginUseCase: checkLoginUseCase,
227+
fetchLostItemListUseCase: fetchLostItemItemUseCase,
228+
logAnalyticsEventUseCase: logAnalyticsEventUseCase
229+
)
216230
let lostItemListViewController = LostItemListViewController(viewModel: viewModel)
217231
navigationController?.setViewControllers([homeViewController, lostItemListViewController], animated: true)
218232
}
@@ -221,6 +235,7 @@ extension LostItemDataViewController {
221235
private func showDeleteModal() {
222236
let onRightButtonTapped: ()->Void = { [weak self] in
223237
self?.inputSubject.send(.deleteData)
238+
self?.inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.findUserDeleteConfirm, EventParameter.EventCategory.click, "확인"))
224239
}
225240
let modalViewController = ModalViewControllerB(onRightButtonTapped: onRightButtonTapped, width: 301, height: 162, title: "삭제 시 되돌릴 수 없습니다.\n게시글을 삭제하시겠습니까?", titleColor: .appColor(.neutral600), rightButtonText: "확인")
226241
modalViewController.modalPresentationStyle = .overFullScreen
@@ -243,8 +258,9 @@ extension LostItemDataViewController {
243258

244259
private func showChangeStateModal() {
245260
let onRightButtonTapped: ()->Void = { [weak self] in
246-
guard let self else { return }
261+
guard let self, let type = viewModel.type else { return }
247262
inputSubject.send(.changeState(viewModel.id))
263+
inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.lostItemFound, .click, "\(type.description)"))
248264
}
249265
let modalViewController = ModalViewControllerB(onRightButtonTapped: onRightButtonTapped, width: 301, height: 162, title: "상태 변경 시 되돌릴 수 없습니다.\n찾음으로 변경하시겠습니까?", titleColor: .appColor(.neutral600), rightButtonText: "확인")
250266
modalViewController.modalTransitionStyle = .crossDissolve
@@ -253,6 +269,9 @@ extension LostItemDataViewController {
253269
}
254270

255271
private func navigateToChat(_ createChatRoomResponse: CreateChatRoomResponse) {
272+
guard let type = viewModel.type else { return }
273+
inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.itemMessageSend, .click, "\(type.description)물 쪽지 보내기"))
274+
256275
let chatViewModel = ChatViewModel(
257276
articleId: createChatRoomResponse.articleId,
258277
chatRoomId: createChatRoomResponse.chatRoomId,
@@ -263,7 +282,12 @@ extension LostItemDataViewController {
263282
}
264283

265284
private func showLoginToChatModal() {
285+
let onLeftButtonTapped: ()->Void = { [weak self] in
286+
self?.inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.lostItemMessageLoginRequest, .click, "닫기"))
287+
}
266288
let onRightButtonTapped: ()->Void = { [weak self] in
289+
self?.inputSubject.send(.logEvent(EventParameter.EventLabel.Campus.lostItemMessageLoginRequest, .click, "로그인하기"))
290+
267291
let repository = GA4AnalyticsRepository(service: GA4AnalyticsService())
268292
let userRepository = DefaultUserRepository(service: DefaultUserService())
269293
let logAnalyticsEventUseCase = DefaultLogAnalyticsEventUseCase(repository: repository)
@@ -272,7 +296,7 @@ extension LostItemDataViewController {
272296
let viewController = LoginViewController(viewModel: viewModel)
273297
self?.navigationController?.pushViewController(viewController, animated: true)
274298
}
275-
let modalViewController = ModalViewControllerB(onRightButtonTapped: onRightButtonTapped, width: 301, height: 208, paddingBetweenLabels: 16, title: "쪽지를 보내려면\n로그인이 필요해요.", subTitle: "로그인 후 대화를 시작하세요!", titleColor: .appColor(.neutral600), subTitleColor: .appColor(.gray))
299+
let modalViewController = ModalViewControllerB(onLeftButtonTapped: onLeftButtonTapped, onRightButtonTapped: onRightButtonTapped, width: 301, height: 208, paddingBetweenLabels: 16, title: "쪽지를 보내려면\n로그인이 필요해요.", subTitle: "로그인 후 대화를 시작하세요!", titleColor: .appColor(.neutral600), subTitleColor: .appColor(.gray))
276300
modalViewController.modalTransitionStyle = .crossDissolve
277301
modalViewController.modalPresentationStyle = .overFullScreen
278302
navigationController?.present(modalViewController, animated: true)

Koin/Presentation/LostItem/LostItemData/LostItemDataViewModel.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ final class LostItemDataViewModel: ViewModelProtocol {
1717
case checkLogIn(CheckLoginOption)
1818
case changeState(Int)
1919
case deleteData
20+
case logEvent(EventLabelType, EventParameter.EventCategory, Any)
2021
}
2122
enum Output {
2223
case updateData(LostItemData)
@@ -42,6 +43,8 @@ final class LostItemDataViewModel: ViewModelProtocol {
4243
private let changeLostItemStateUseCase: ChangeLostItemStateUseCase
4344
private let deleteLostItemUseCase: DeleteLostItemUseCase
4445
private let createChatRoomUseCase: CreateChatRoomUseCase
46+
private let logAnalyticsEventUseCase: LogAnalyticsEventUseCase
47+
var type: LostItemType?
4548
private let outputSubject = PassthroughSubject<Output, Never>()
4649
private var subscriptions: Set<AnyCancellable> = []
4750
let id: Int
@@ -55,13 +58,15 @@ final class LostItemDataViewModel: ViewModelProtocol {
5558
changeLostItemStateUseCase: ChangeLostItemStateUseCase,
5659
deleteLostItemUseCase: DeleteLostItemUseCase,
5760
createChatRoomUseCase: CreateChatRoomUseCase,
61+
logAnalyticsEventUseCase: LogAnalyticsEventUseCase,
5862
id: Int) {
5963
self.checkLoginUseCase = checkLoginUseCase
6064
self.fetchLostItemDataUseCase = fetchLostItemDataUseCase
6165
self.fetchLostItemListUseCase = fetchLostItemListUseCase
6266
self.changeLostItemStateUseCase = changeLostItemStateUseCase
6367
self.deleteLostItemUseCase = deleteLostItemUseCase
6468
self.createChatRoomUseCase = createChatRoomUseCase
69+
self.logAnalyticsEventUseCase = logAnalyticsEventUseCase
6570
self.id = id
6671
}
6772

@@ -81,6 +86,8 @@ final class LostItemDataViewModel: ViewModelProtocol {
8186
self.changeState(id)
8287
case .deleteData:
8388
self.deleteData()
89+
case let .logEvent(label, category, value):
90+
self.logEvent(label: label, category: category, value: value)
8491
}
8592
}.store(in: &subscriptions)
8693
return outputSubject.eraseToAnyPublisher()
@@ -89,6 +96,10 @@ final class LostItemDataViewModel: ViewModelProtocol {
8996

9097
extension LostItemDataViewModel {
9198

99+
private func logEvent(label: EventLabelType, category: EventParameter.EventCategory, value: Any) {
100+
logAnalyticsEventUseCase.execute(label: label, category: category, value: value)
101+
}
102+
92103
private func loadData() {
93104
fetchLostItemDataUseCase.execute(id: id).sink(
94105
receiveCompletion: { completion in
@@ -98,6 +109,7 @@ extension LostItemDataViewModel {
98109
},
99110
receiveValue: { [weak self] lostItemData in
100111
self?.lostItemData = lostItemData
112+
self?.type = lostItemData.type
101113
self?.outputSubject.send(.updateData(lostItemData))
102114
}
103115
).store(in: &subscriptions)

0 commit comments

Comments
 (0)