Skip to content

Commit 29105a7

Browse files
committed
[#234] Cursor AI 기반 리팩터링
1 parent b93721a commit 29105a7

File tree

1 file changed

+90
-67
lines changed

1 file changed

+90
-67
lines changed

EATSSU/App/Sources/Presentation/Maps/ViewController/MapViewController.swift

+90-67
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,19 @@ final class MapViewController: BaseViewController {
7979
}
8080

8181
override func viewWillAppear(_: Bool) {
82-
fetchPartnerships()
83-
setInitialSegmentedControlSetting()
82+
fetchAllPartnershipsAndDisplay()
83+
resetSegmentedControlToDefault()
8484
}
85+
}
8586

86-
// MARK: - UI 설정
87-
87+
// MARK: - UI Configuration
88+
private extension MapViewController {
8889
/**
8990
네비게이션 바 스타일을 설정합니다.
9091

9192
- Note: 배경색, 타이틀 폰트, 스크롤 시의 Appearance 등을 지정합니다.
9293
*/
93-
private func configureNavigationBar() {
94+
func configureNavigationBar() {
9495
navigationItem.title = ESTextLiteral.Map.mapNavTitle
9596
navigationController?.isNavigationBarHidden = false
9697

@@ -113,11 +114,11 @@ final class MapViewController: BaseViewController {
113114
- Note: 지도에서 터치 이벤트를 수신하기 위해 `touchDelegate`를 `self`로 설정합니다.
114115
- SeeAlso: `moveCamera(to:zoomLevel:)`
115116
*/
116-
private func configureMapView() {
117+
func configureMapView() {
117118
mapView = NMFMapView(frame: view.frame)
118119
view.addSubview(mapView)
119120
mapView.touchDelegate = self
120-
moveCamera(to: soongsilUniversityLocation, zoomLevel: 15.0)
121+
moveCameraToLocation(soongsilUniversityLocation, zoomLevel: 15.0)
121122
}
122123

123124
/**
@@ -127,7 +128,7 @@ final class MapViewController: BaseViewController {
127128
- location: 이동할 위치의 위도 및 경도 (`NMGLatLng`)
128129
- zoomLevel: 줌 레벨 (`Double`)
129130
*/
130-
private func moveCamera(to location: NMGLatLng, zoomLevel: Double) {
131+
func moveCameraToLocation(_ location: NMGLatLng, zoomLevel: Double) {
131132
let cameraUpdate = NMFCameraUpdate(position: NMFCameraPosition(location, zoom: zoomLevel))
132133
mapView.moveCamera(cameraUpdate)
133134
}
@@ -139,7 +140,7 @@ final class MapViewController: BaseViewController {
139140

140141
- Note: Segmented Control 클릭 시 `segmentedControlChanged(_:)`를 통해 새로운 데이터를 불러오거나, 기존 마커를 지우고 다시 표시합니다.
141142
*/
142-
private func configureSegmentedControl() {
143+
func configureSegmentedControl() {
143144
let items = ["전체", "내 제휴"]
144145
mapSegmentedControl = UISegmentedControl(items: items)
145146
mapSegmentedControl.selectedSegmentIndex = 0
@@ -170,7 +171,12 @@ final class MapViewController: BaseViewController {
170171
view.bringSubviewToFront(mapSegmentedControl)
171172
}
172173

173-
private func setInitialSegmentedControlSetting() {
174+
/**
175+
세그먼트 컨트롤을 기본 상태(전체)로 초기화합니다.
176+
177+
- Note: viewWillAppear에서 호출되어 화면이 나타날 때마다 세그먼트 컨트롤을 초기 상태로 되돌립니다.
178+
*/
179+
func resetSegmentedControlToDefault() {
174180
mapSegmentedControl.selectedSegmentIndex = 0
175181
}
176182

@@ -183,8 +189,8 @@ final class MapViewController: BaseViewController {
183189
1. 0(기본: "내 제휴") 선택 시 전체 제휴 업체 데이터를 불러옵니다.
184190
2. 1("전체") 선택 시 사용자의 제휴 업체 데이터(미구현)를 불러옵니다.
185191
*/
186-
@objc private func segmentedControlChanged(_ sender: UISegmentedControl) {
187-
clearAllMarkers()
192+
@objc func segmentedControlChanged(_ sender: UISegmentedControl) {
193+
removeAllMarkersFromMap()
188194

189195
#if DEBUG
190196
print("Selected segment index: \(sender.selectedSegmentIndex)")
@@ -195,12 +201,12 @@ final class MapViewController: BaseViewController {
195201
#if DEBUG
196202
print("전체 제휴 업체를 가져옵니다.")
197203
#endif
198-
fetchPartnerships()
204+
fetchAllPartnershipsAndDisplay()
199205
case 1:
200206
#if DEBUG
201207
print("사용자의 제휴 업체를 가져옵니다.")
202208
#endif
203-
fetchUserPartnership()
209+
fetchUserPartnershipsAndDisplay()
204210
default:
205211
AlertControllerHelper.showConfirmAlert(
206212
title: "에러",
@@ -209,9 +215,10 @@ final class MapViewController: BaseViewController {
209215
)
210216
}
211217
}
218+
}
212219

213-
// MARK: - 마커 설정
214-
220+
// MARK: - Marker Management
221+
private extension MapViewController {
215222
/**
216223
특정 위치에 마커를 추가합니다.
217224

@@ -222,7 +229,7 @@ final class MapViewController: BaseViewController {
222229
- markerData: 해당 마커에 대응하는 `MarkerData` (상세보기용 정보)
223230
- Note: 마커를 탭하면 `presentMarkerDetailFloatingPanel(with:)`가 호출되어 상세 패널이 표시됩니다.
224231
*/
225-
private func addMarker(
232+
func createAndAddMarker(
226233
at location: NMGLatLng,
227234
leftText: String,
228235
rightText: String,
@@ -236,7 +243,7 @@ final class MapViewController: BaseViewController {
236243
#if DEBUG
237244
print("마커가 탭되었습니다!")
238245
#endif
239-
self.presentMarkerDetailFloatingPanel(with: markerData)
246+
self.showMarkerDetailPanel(with: markerData)
240247
return true
241248
},
242249
markerData: markerData
@@ -250,15 +257,42 @@ final class MapViewController: BaseViewController {
250257

251258
- Note: `esMarkers` 배열에 저장된 `ESMarker`를 순회하며, 지도에서 제거(MapView 연결 해제)한 뒤 배열을 비웁니다.
252259
*/
253-
private func clearAllMarkers() {
260+
func removeAllMarkersFromMap() {
254261
for marker in esMarkers {
255262
marker.marker.mapView = nil
256263
}
257264
esMarkers.removeAll()
258265
}
259266

260-
// MARK: - 상세정보 표시
267+
/**
268+
파트너십 응답 데이터를 기반으로 지도에 마커들을 생성하고 표시합니다.
269+
270+
- Parameter partnerships: 서버로부터 받은 파트너십 응답 데이터 배열
271+
- Note: 각 파트너십 데이터에 대해 위치 정보와 마커 데이터를 생성하여 지도에 표시합니다.
272+
*/
273+
func displayPartnershipsOnMap(from partnerships: [PartnershipResponse]) {
274+
for partnership in partnerships {
275+
let location = NMGLatLng(
276+
lat: partnership.latitude,
277+
lng: partnership.longitude
278+
)
279+
let markerData = MarkerData(
280+
title: partnership.storeName,
281+
description: partnership.description
282+
)
261283

284+
createAndAddMarker(
285+
at: location,
286+
leftText: partnership.storeName,
287+
rightText: partnership.partnershipType,
288+
markerData: markerData
289+
)
290+
}
291+
}
292+
}
293+
294+
// MARK: - FloatingPanel Management
295+
private extension MapViewController {
262296
/**
263297
마커 상세 정보를 `FloatingPanel`로 표시합니다.
264298

@@ -267,7 +301,7 @@ final class MapViewController: BaseViewController {
267301
1. 이미 동일한 마커가 선택되어 있고, 패널이 표시 중이면 그대로 유지합니다.
268302
2. 새로운 마커를 탭하면, `MarkerDetailViewController`를 생성해 패널 내용으로 설정하고 부모에 추가합니다.
269303
*/
270-
private func presentMarkerDetailFloatingPanel(with markerData: MarkerData) {
304+
func showMarkerDetailPanel(with markerData: MarkerData) {
271305
if let currentData = selectedMarkerData, currentData == markerData,
272306
floatingPanelController?.parent != nil
273307
{
@@ -292,17 +326,18 @@ final class MapViewController: BaseViewController {
292326
floatingPanelController?.addPanel(toParent: self)
293327
}
294328
}
329+
}
295330

296-
// MARK: - 네트워크
297-
331+
// MARK: - Network Operations
332+
private extension MapViewController {
298333
/**
299334
전체 제휴 목록을 네트워크로부터 가져오는 메서드입니다.
300335

301336
- Note:
302337
1. 성공 시 `baseResponse.result`에 포함된 제휴 정보를 순회하며, 지도 위에 마커를 배치합니다.
303338
2. 실패 시 디버그 로그를 남기고, 필요 시 사용자에게 알림을 표시하도록 TODO를 남겼습니다.
304339
*/
305-
private func fetchPartnerships() {
340+
func fetchAllPartnershipsAndDisplay() {
306341
partnershipService.fetchAllPartnerships()
307342
.subscribe(
308343
onSuccess: { [weak self] (baseResponse: BaseResponse<[PartnershipResponse]>) in
@@ -319,16 +354,24 @@ final class MapViewController: BaseViewController {
319354
return
320355
}
321356

322-
createMarkers(from: baseResponse.result)
357+
displayPartnershipsOnMap(from: baseResponse.result)
323358
},
324359
onFailure: { [weak self] error in
325-
self?.handlePartnershipError(error)
360+
self?.showPartnershipErrorAlert(error)
326361
}
327362
)
328363
.disposed(by: disposeBag)
329364
}
330365

331-
private func fetchUserPartnership() {
366+
/**
367+
사용자의 학과/단과대 관련 제휴 목록을 네트워크로부터 가져와 표시하는 메서드입니다.
368+
369+
- Note:
370+
1. UserDepartmentService를 통해 사용자의 학과/단과대 관련 제휴 정보를 요청합니다.
371+
2. 성공 시 받아온 제휴 정보를 지도에 마커로 표시합니다.
372+
3. 실패 시 사용자에게 에러 알림을 표시합니다.
373+
*/
374+
func fetchUserPartnershipsAndDisplay() {
332375
userDepartmentService.getUserPartnership()
333376
.subscribe(
334377
onSuccess: { [weak self] (baseResponse: BaseResponse<[PartnershipResponse]>) in
@@ -345,18 +388,35 @@ final class MapViewController: BaseViewController {
345388
return
346389
}
347390

348-
createMarkers(from: baseResponse.result)
391+
displayPartnershipsOnMap(from: baseResponse.result)
349392
},
350393
onFailure: { [weak self] error in
351-
self?.handlePartnershipError(error)
394+
self?.showPartnershipErrorAlert(error)
352395
}
353396
)
354397
.disposed(by: disposeBag)
355398
}
399+
400+
/**
401+
파트너십 데이터 요청 실패 시 에러 알림을 표시하는 함수입니다.
402+
403+
- Parameter error: 발생한 에러 객체
404+
- Note: 디버그 모드에서는 에러 상세 정보를 로그로 출력하고, 사용자에게는 간단한 에러 메시지를 알림으로 표시합니다.
405+
*/
406+
func showPartnershipErrorAlert(_ error: Error) {
407+
#if DEBUG
408+
print("제휴 목록 가져오기 실패: \(error.localizedDescription)")
409+
#endif
410+
AlertControllerHelper.showConfirmAlert(
411+
title: "문제가 발생했습니다",
412+
message: "다시 시도하세요",
413+
confirmTitle: "확인",
414+
in: self
415+
)
416+
}
356417
}
357418

358419
// MARK: - NMFMapViewTouchDelegate
359-
360420
extension MapViewController: NMFMapViewTouchDelegate {
361421
/**
362422
사용자가 지도에서 단일 탭했을 때 호출됩니다.
@@ -398,7 +458,6 @@ extension MapViewController: NMFMapViewTouchDelegate {
398458
}
399459

400460
// MARK: - FloatingPanelControllerDelegate
401-
402461
extension MapViewController: FloatingPanelControllerDelegate {
403462
/**
404463
FloatingPanel이 제거되었을 때 호출됩니다.
@@ -411,39 +470,3 @@ extension MapViewController: FloatingPanelControllerDelegate {
411470
selectedMarkerData = nil
412471
}
413472
}
414-
415-
private extension MapViewController {
416-
/// 파트너십 응답 데이터를 기반으로 지도에 마커를 생성하는 함수
417-
func createMarkers(from partnerships: [PartnershipResponse]) {
418-
for partnership in partnerships {
419-
let location = NMGLatLng(
420-
lat: partnership.latitude,
421-
lng: partnership.longitude
422-
)
423-
let markerData = MarkerData(
424-
title: partnership.storeName,
425-
description: partnership.description
426-
)
427-
428-
addMarker(
429-
at: location,
430-
leftText: partnership.storeName,
431-
rightText: partnership.partnershipType,
432-
markerData: markerData
433-
)
434-
}
435-
}
436-
437-
/// 파트너십 데이터 요청 실패 시 처리하는 함수
438-
func handlePartnershipError(_ error: Error) {
439-
#if DEBUG
440-
print("제휴 목록 가져오기 실패: \(error.localizedDescription)")
441-
#endif
442-
AlertControllerHelper.showConfirmAlert(
443-
title: "문제가 발생했습니다",
444-
message: "다시 시도하세요",
445-
confirmTitle: "확인",
446-
in: self
447-
)
448-
}
449-
}

0 commit comments

Comments
 (0)