Conversation
There was a problem hiding this comment.
🤖 AI 코드 리뷰 - 아키텍처 관점
약속 목록 화면을 위한 ViewModel, ViewController, 카드 뷰, 공통 베이스 뷰를 추가하는 PR이다. AppointmentCardBase를 도입해 UpcomingAppointmentCard와 AppointmentListCard 간 중복 레이아웃 코드를 제거한 점은 구조적으로 적절하다. 다만 ViewModel이 더미 데이터 생성 책임을 직접 가지고 있고, ViewController가 ViewModel을 직접 생성(강한 결합)하는 구조여서 테스트 가능성과 확장성에 문제가 있다. 또한 컨텍스트 메뉴의 델리게이트 구현이 View 레이어인 AppointmentListCard 내부에 있어 SRP 위반 소지가 있다.
There was a problem hiding this comment.
🤖 AI 코드 리뷰 - 아키텍처 관점
약속 목록/지난 약속 화면을 위한 카드 컴포넌트, 베이스 뷰, ViewModel, Presentation 모델을 추가하는 PR이다. AppointmentCardBase로 공통 UI를 추출하고 UpcomingAppointmentCard를 상속 구조로 전환한 점은 방향이 맞다. 다만 ViewModel이 더미 데이터를 직접 생성하는 loadDummyData를 내부에 포함하고 있어 실제 데이터 계층과의 연결 방식이 불분명하고, ViewController가 ViewModel을 직접 초기화(concrete 타입 하드코딩)하여 의존성 역전이 적용되지 않았다. AppointmentListCard가 UIContextMenuInteractionDelegate를 직접 채택하는지 여부가 diff에서 잘리고 없어 확인 불가이나, View 레이어가 알림 토글/나가기 등 비즈니스 액션의 진입점을 직접 보유하는 구조에 대해 주의가 필요하다.
sangYuLv
left a comment
There was a problem hiding this comment.
약속 카드 베이스를 만든 점도, 리뷰 노트에 적어주신 내용들도 모두 좋게 봤습니다!
아래 코멘트 한 부분들에 대해 의견 부탁드립니다. 🦦
sangYuLv
left a comment
There was a problem hiding this comment.
리뷰 반영 감사합니다! 수고 많으셨어요 🦦
JIRA
📝 작업 내용
📌 요약
🔍 상세
1. 날짜/시간 표시 로직
Date+RemainingTime.swift(Presentation)nil반환 (오늘 약속이라도 시간이 지났으면 남은 시간 표시 안 함)Date+AppointmentDisplay.swift(Presentation) +Date+Format.swift(Core)2. 약속 목록 화면 (
AppointmentListViewController+AppointmentListViewModel)한쪽만 있으면 헤더 없이 카드만 표시
3. 지난 약속 화면 (
PastAppointmentListViewController+PastAppointmentListViewModel)4. 공용 컴포넌트
AppointmentCardBaseUpcomingAppointmentCard)와 약속 목록/지난 약속 카드(AppointmentListCard)가공유하는 카드 뼈대 (배경/그림자/제목/인원·장소·날짜 3줄)
AppointmentListCardAppointmentListItemUIAlertController+LeaveConfirm.swift💬 리뷰 노트
피그마와 다르게 처리한 부분
대칭적인 SF Symbol(
clock.arrow.trianglehead.counterclockwise.rotate.90)로 대체했습니다.이 UIKit API(
UIGlassEffect)는 iOS 26 이상에서만 지원되고현재 배포 대상(iOS 17~)과 맞지 않아 적용하지 않았습니다.
13~23시간 구간을 "일 단위"로 계산하면 정수 나눗셈으로 "0일 남음"이 되는 문제가 있어
경계를 24시간으로 조정했습니다(24시간 미만은 항상 시간 단위).
📸 영상 / 이미지