Conversation
There was a problem hiding this comment.
🤖 AI 코드 리뷰 - 아키텍처 관점
마이페이지 UI 계층을 신규 추가하는 PR이다. Presentation 모델 분리, MyPageCardView/MyPageRow 컴포넌트 추상화, 위치 권한·공유 설정·알림 설정 화면 구성이 포함된다. 전반적인 구조는 적절하나, ViewModel이 CLLocationManager를 직접 소유하는 구조로 인해 Presentation 계층이 시스템 프레임워크(CoreLocation)에 직접 의존하는 아키텍처 문제가 존재한다. 또한 MyPageViewController가 ViewModel을 직접 생성하여 의존성 주입이 불가능한 상태이며, LocationPermissionViewController가 권한 상태에 따른 버튼 동작 분기를 직접 처리하는 점도 역할 분리 관점에서 지적할 수 있다.
There was a problem hiding this comment.
🤖 AI 코드 리뷰 - 아키텍처 관점
마이페이지 화면, 위치 권한/공유 설정, 프로필 편집, 약속별 알림 UI를 추가하는 PR이다. Presentation 레이어 내부 구조는 비교적 명확하게 분리되어 있으나, ViewModel이 CLLocationManager를 직접 소유하고 delegate 패턴으로 권한 변경을 수신하는 구조가 계층 의존성 측면에서 문제가 있다. 또한 ViewModel이 상태 변경 콜백(onLocationPermissionChanged)을 클로저 프로퍼티로 노출하는 방식은 단일 구독자만 지원하므로 확장성에 제약이 있다. AppointmentNotificationListViewController는 MyPageViewModel을 직접 참조하여 강결합이 발생하고 있다. LocationPermissionState는 CLAuthorizationStatus와 케이스가 1:1로 대응하는 래퍼에 불과해 존재 의의가 약하다.
…대신 필요한 데이터/콜백만 주입받도록 변경
sangYuLv
left a comment
There was a problem hiding this comment.
수정사항 확인했습니다!
수고 많으셨습니다 🦦

JIRA
📝 작업 내용
📌 요약
🔍 상세
1. 마이페이지 화면(
MyPageViewController)AppointmentListViewController와 동일한 로고+타이틀 헤더, 스크롤+스택뷰 골격을 재사용했습니다.MyPageCardView: 카드 하나의 배경/그림자/코너radius만 담당하는 얇은 컨테이너입니다.MyPageRow: 아이콘 + 제목/현재값 + 우측 액세서리(기본 chevron) 한 줄짜리 행입니다.2. 프로필 카드 - 편집 화면 (
ProfileEditViewController)행 전체를 탭하면 편집 화면으로 push됩니다.
UICollectionViewCompositionalLayout(셀 80×80pt 고정, 3열) +UICollectionViewDiffableDataSource로 만들었습니다.3. 위치 카드
LocationSharingSelectionViewController)LocationSharingOption3가지(항상 공유 / 약속 참여 중에만 공유 / 공유 안 함)를 라디오 버튼 형태로 보여줍니다.LocationPermissionViewController)CLLocationManager.authorizationStatus를 읽어LocationPermissionState로 변환한 뒤 상태 텍스트/아이콘을 보여줍니다.notDetermined상태에서 버튼을 누르면requestWhenInUseAuthorization()으로 실제 권한 요청 팝업을 띄우고, 이미 결정된 상태(denied/restricted/authorized)라면UIApplication.openSettingsURLString으로 iOS 설정 앱으로 딥링크합니다.CLLocationManagerDelegate의locationManagerDidChangeAuthorization을 구독해 팝업 응답 직후 화면이 자동으로 갱신되도록 했습니다.Info.plist에NSLocationWhenInUseUsageDescription,NSLocationAlwaysAndWhenInUseUsageDescription두 사용 목적 문구를 추가했습니다.4. 알림 카드
UISwitchaccessory로 즉시 토글되며,MyPageViewModel.setNotificationEnabled(_:)를 호출합니다.AppointmentNotificationListViewController로 이동합니다.AppointmentListViewModel과 별개로MyPageViewModel이 독립적으로 보유합니다.5. 기타 카드
print로그만 남겨두었습니다.💬 리뷰 노트
MyPageViewModelAppointmentListViewModel처럼 더미 데이터를 직접 보유하는 가벼운 패턴입니다.CLLocationManager직접 보유 +CLAuthorizationStatus→LocationPermissionState변환)를 지금MyPageViewModel이 담당하고 있는데,나중에
LocationRepository처럼 Data 계층으로 옮길 때 이 변환 로직도 함께 이관할지 확인이 필요합니다.print만 찍습니다.pawprint.fill)가 임시로 섞여 있습니다.shark/turtle2개뿐이라, 컬렉션뷰의 스크롤 동작을 확인하기 위해 임시로 채운 더미 데이터입니다.📸 영상 / 이미지
2026-07-25.03.02.30.mov
2026-07-25.03.04.39.mov