Skip to content

[Work 27] 마이페이지 화면을 구성했습니다. - #9

Merged
snughnu merged 21 commits into
developfrom
WORK-27
Jul 26, 2026
Merged

[Work 27] 마이페이지 화면을 구성했습니다.#9
snughnu merged 21 commits into
developfrom
WORK-27

Conversation

@snughnu

@snughnu snughnu commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

JIRA

📝 작업 내용

📌 요약

  • "마이페이지" 탭에 들어갈 설정 화면(프로필 / 위치 / 알림 / 기타) 전체와 각 항목의 상세화면을 구성했습니다.

🔍 상세

1. 마이페이지 화면(MyPageViewController)

  • AppointmentListViewController와 동일한 로고+타이틀 헤더, 스크롤+스택뷰 골격을 재사용했습니다.
  • 프로필 / 위치 / 알림 / 기타 4개 카드를 세로로 배치했습니다.
  • MyPageCardView: 카드 하나의 배경/그림자/코너radius만 담당하는 얇은 컨테이너입니다.
  • MyPageRow: 아이콘 + 제목/현재값 + 우측 액세서리(기본 chevron) 한 줄짜리 행입니다.

2. 프로필 카드 - 편집 화면 (ProfileEditViewController)

  • 프로필 행은 닉네임과 원형 프로필 사진을 보여주고, 우측에 연필 아이콘이 있습니다.
    행 전체를 탭하면 편집 화면으로 push됩니다.
  • 편집 화면은 닉네임 텍스트필드 하나와, 프로필 사진을 고르는 3열 그리드로 구성됩니다.
    • 그리드는 UICollectionViewCompositionalLayout(셀 80×80pt 고정, 3열) + UICollectionViewDiffableDataSource로 만들었습니다.

3. 위치 카드

  • 위치 공유 설정 (LocationSharingSelectionViewController)
    • LocationSharingOption 3가지(항상 공유 / 약속 참여 중에만 공유 / 공유 안 함)를 라디오 버튼 형태로 보여줍니다.
    • 선택이 바뀌면 전체 리스트를 다시 그리지 않고, 이전 선택/새 선택 두 행의 라디오뷰만 교체하도록 최적화했습니다.
  • 위치 권한 설정 (LocationPermissionViewController)
    • CLLocationManager.authorizationStatus를 읽어 LocationPermissionState로 변환한 뒤 상태 텍스트/아이콘을 보여줍니다.
    • notDetermined 상태에서 버튼을 누르면 requestWhenInUseAuthorization()으로 실제 권한 요청 팝업을 띄우고, 이미 결정된 상태(denied/restricted/authorized)라면 UIApplication.openSettingsURLString으로 iOS 설정 앱으로 딥링크합니다.
    • CLLocationManagerDelegatelocationManagerDidChangeAuthorization을 구독해 팝업 응답 직후 화면이 자동으로 갱신되도록 했습니다.
    • 이 기능을 위해 Info.plistNSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription 두 사용 목적 문구를 추가했습니다.

4. 알림 카드

  • 전체 알림은 UISwitch accessory로 즉시 토글되며, MyPageViewModel.setNotificationEnabled(_:)를 호출합니다.
  • 약속별 알림은 AppointmentNotificationListViewController로 이동합니다.
  • 더미 약속 목록은 AppointmentListViewModel과 별개로 MyPageViewModel이 독립적으로 보유합니다.

5. 기타 카드

  • 문의 및 도움말 / 앱 정보 두 행은 UI만 배치했고, 탭 동작은 print 로그만 남겨두었습니다.

💬 리뷰 노트

  • MyPageViewModel
    • AppointmentListViewModel처럼 더미 데이터를 직접 보유하는 가벼운 패턴입니다.
    • Repository/UseCase 연결은 안되어있습니다.
    • 위치 권한 조회(CLLocationManager 직접 보유 + CLAuthorizationStatusLocationPermissionState 변환)를 지금 MyPageViewModel이 담당하고 있는데,
      나중에 LocationRepository처럼 Data 계층으로 옮길 때 이 변환 로직도 함께 이관할지 확인이 필요합니다.
  • "문의 및 도움말", "앱 정보" 행은 탭해도 print만 찍습니다.
    • 해당 부분을 없앨지 고민하다가 우선 print 액션만 연결해두고 나두었습니다.
  • 기본 이동 수단 설정 항목은 이번 화면에서 제외했습니다.
  • 프로필 사진 선택 목록에 SF Symbols(예: pawprint.fill)가 임시로 섞여 있습니다.
    • 실제 프로필 이미지 에셋이 shark/turtle 2개뿐이라, 컬렉션뷰의 스크롤 동작을 확인하기 위해 임시로 채운 더미 데이터입니다.
  • UI 위주로 봐주시고, 자유롭게 피드백 부탁드립니다.

📸 영상 / 이미지

2026-07-25.03.02.30.mov
2026-07-25.03.04.39.mov

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI 코드 리뷰 - 아키텍처 관점

마이페이지 UI 계층을 신규 추가하는 PR이다. Presentation 모델 분리, MyPageCardView/MyPageRow 컴포넌트 추상화, 위치 권한·공유 설정·알림 설정 화면 구성이 포함된다. 전반적인 구조는 적절하나, ViewModel이 CLLocationManager를 직접 소유하는 구조로 인해 Presentation 계층이 시스템 프레임워크(CoreLocation)에 직접 의존하는 아키텍처 문제가 존재한다. 또한 MyPageViewController가 ViewModel을 직접 생성하여 의존성 주입이 불가능한 상태이며, LocationPermissionViewController가 권한 상태에 따른 버튼 동작 분기를 직접 처리하는 점도 역할 분리 관점에서 지적할 수 있다.

Comment thread WhereAreYou/WhereAreYou/Presentation/MyPage/MyPageViewModel.swift

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 AI 코드 리뷰 - 아키텍처 관점

마이페이지 화면, 위치 권한/공유 설정, 프로필 편집, 약속별 알림 UI를 추가하는 PR이다. Presentation 레이어 내부 구조는 비교적 명확하게 분리되어 있으나, ViewModel이 CLLocationManager를 직접 소유하고 delegate 패턴으로 권한 변경을 수신하는 구조가 계층 의존성 측면에서 문제가 있다. 또한 ViewModel이 상태 변경 콜백(onLocationPermissionChanged)을 클로저 프로퍼티로 노출하는 방식은 단일 구독자만 지원하므로 확장성에 제약이 있다. AppointmentNotificationListViewControllerMyPageViewModel을 직접 참조하여 강결합이 발생하고 있다. LocationPermissionStateCLAuthorizationStatus와 케이스가 1:1로 대응하는 래퍼에 불과해 존재 의의가 약하다.

Comment thread WhereAreYou/WhereAreYou/Presentation/MyPage/MyPageViewModel.swift
Comment thread WhereAreYou/WhereAreYou/Presentation/MyPage/MyPageViewModel.swift Outdated

@sangYuLv sangYuLv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고 많으셨습니다 🦦

  1. "문의 및 도움말"은 없어도 될 듯 합니다!
  2. 위치 권한 조회 코드는 Data 계층으로 이동이 필요해보이네요.
  3. 프로필 수정 화면은 아래 디자인은 어떨까 싶습니다! (만약 반영한다면, 지금도 괜찮아서 나중 작업으로 미뤄도 될 듯 합니다.
Image

Comment thread WhereAreYou/WhereAreYou/Presentation/Extension/LocationSharingOption+.swift Outdated
Comment thread WhereAreYou/WhereAreYou/Presentation/MyPage/MyPageViewController.swift Outdated
Comment thread WhereAreYou/WhereAreYou/Presentation/MyPage/MyPageViewController.swift Outdated
@snughnu
snughnu requested a review from sangYuLv July 26, 2026 02:27

@sangYuLv sangYuLv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수정사항 확인했습니다!
수고 많으셨습니다 🦦

@snughnu
snughnu merged commit 793b429 into develop Jul 26, 2026
5 checks passed
@snughnu
snughnu deleted the WORK-27 branch July 26, 2026 14:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants