Skip to content

[SPM-329] 주문 로직 수정, 예외 처리 전역 스낵바 적용, 패키지 구조 리팩토링#19

Merged
Sangyoon98 merged 4 commits intodevfrom
SPM-329
Nov 2, 2025
Merged

[SPM-329] 주문 로직 수정, 예외 처리 전역 스낵바 적용, 패키지 구조 리팩토링#19
Sangyoon98 merged 4 commits intodevfrom
SPM-329

Conversation

@Sangyoon98
Copy link
Copy Markdown
Member

@Sangyoon98 Sangyoon98 commented Nov 2, 2025

📝 Summary

주문 로직 수정, 예외 처리 전역 스낵바 적용, 패키지 구조 리팩토링

🙏 Question & PR point

📬 Reference

Summary by CodeRabbit

릴리스 노트

새로운 기능

  • 주문 목록에 '더 보기' 기능 추가 - 이전 주문을 페이지 단위로 로드할 수 있습니다.
  • 앱 전체 통합 알림 시스템 - 작업 성공 및 실패 시 화면 상단에 알림 메시지가 표시됩니다.

버그 수정

  • 서버 오류 메시지를 사용자가 쉽게 이해할 수 있도록 표시 방식 개선
  • 장바구니 및 주문 처리 중 오류 처리 강화

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 2, 2025

Warning

Rate limit exceeded

@Sangyoon98 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 6 minutes and 56 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 7d44001 and 5f0104e.

📒 Files selected for processing (2)
  • SampoomManagement/Features/Cart/UI/CartListViewModel.swift (5 hunks)
  • SampoomManagement/Features/Order/UI/OrderListViewModel.swift (1 hunks)

Walkthrough

프로젝트 버전 업그레이드(1→2), Toast 라이브러리 통합, 글로벌 메시지 핸들러 추가, 네트워크 에러 응답에 서버 메시지 포함, Order API 페이징 지원으로 변경, Cart/Part 기능에서 로컬 에러 상태 제거 후 글로벌 메시지 시스템으로 통합.

Changes

Cohort / File(s) Summary
프로젝트 설정 및 버전
SampoomManagement.xcodeproj/project.pbxproj
CURRENT_PROJECT_VERSION을 1에서 2로 업데이트 (Debug, Release 구성)
의존성 주입 및 앱 초기화
SampoomManagement/Core/DI/AppDependencies.swift, SampoomManagement/App/RootView.swift
GlobalMessageHandler 싱글톤 추가, RootView에서 @ObservedObject로 주입, 모든 ViewModel에 globalMessageHandler 전달
네트워크 에러 처리
SampoomManagement/Core/Network/NetworkError.swift, SampoomManagement/Core/Network/APIResponse.swift, SampoomManagement/Core/Network/NetworkManager.swift
@preconcurrency import 추가, serverError에 옵션 메시지 필드 추가, ApiErrorResponse DTO 추가, 메인액터 디코딩 헬퍼 추가, 에러 응답 파싱 개선
UI 컴포넌트
SampoomManagement/Core/UI/Components/ToastContainer.swift, SampoomManagement/Core/Utilities/GlobalMessageHandler.swift
Toast 라이브러리 통합 컴포넌트 추가, @published 속성이 있는 GlobalMessageHandler 싱글톤 클래스 추가
문자열 리소스
SampoomManagement/Core/Resources/StringResources.swift
Common.loadMore, Part.emptyPart 추가, 기타 메시지 텍스트 단축 및 업데이트
Order 기능 - API 및 Repository
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift, SampoomManagement/Features/Order/Data/Remote/DTO/OrderListDto.swift, SampoomManagement/Features/Order/Data/Remote/DTO/OrderRequestDto.swift, SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift
getOrderList에 페이징 지원, createOrder/getOrderDetail 반환 타입을 OrderList에서 Order로 변경, AuthPreferences 주입 추가
Order 기능 - Domain 레이어
SampoomManagement/Features/Order/Domain/Repository/OrderRepository.swift, SampoomManagement/Features/Order/Domain/UseCase/GetOrderUseCase.swift, SampoomManagement/Features/Order/Domain/UseCase/GetOrderDetailUseCase.swift, SampoomManagement/Features/Order/Domain/UseCase/CreateOrderUseCase.swift
페이징 매개변수 추가, 반환 타입을 OrderList에서 Order 및 튜플로 변경
Order 기능 - UI 상태 및 이벤트
SampoomManagement/Features/Order/UI/OrderListUiEvent.swift, SampoomManagement/Features/Order/UI/OrderListUiState.swift, SampoomManagement/Features/Order/UI/OrderDetailUiEvent.swift, SampoomManagement/Features/Order/UI/OrderDetailUiState.swift
OrderList에 hasMore/currentPage/isLoadingMore 추가, orderError 제거, orderDetail을 배열에서 단일 객체로 변경, clearError 케이스 제거
Order 기능 - UI 뷰 모델
SampoomManagement/Features/Order/UI/OrderListViewModel.swift, SampoomManagement/Features/Order/UI/OrderDetailViewModel.swift
GlobalMessageHandler 주입, 페이징 로직 추가, 에러 처리를 globalMessageHandler로 통합, 로컬 에러 상태 제거
Order 기능 - UI 뷰
SampoomManagement/Features/Order/UI/OrderListView.swift, SampoomManagement/Features/Order/UI/OrderDetailView.swift, SampoomManagement/Features/Order/UI/OrderDetailContent.swift, SampoomManagement/Features/Order/UI/OrderResultBottomSheet.swift
로드 더 기능 UI 추가, 에러 뷰 제거, orderDetail을 배열에서 단일 객체로 변경, 에러 상태 바인딩 제거
Cart 기능 - API 및 UI 이벤트/상태
SampoomManagement/Features/Cart/Data/Remote/API/CartAPI.swift, SampoomManagement/Features/Cart/UI/CartListUiEvent.swift, SampoomManagement/Features/Cart/UI/CartListUiState.swift
CartAPI에서 응답 메시지 포함하여 에러 던지기, clearUpdateError/clearDeleteError 케이스 제거, cartError/updateError/deleteError/processError 상태 제거, processedOrder 타입을 배열에서 단일로 변경
Cart 기능 - UI 뷰 모델 및 뷰
SampoomManagement/Features/Cart/UI/CartListViewModel.swift, SampoomManagement/Features/Cart/UI/CartListView.swift
GlobalMessageHandler 주입, 글로벌 메시지로 에러 처리 통합, 로컬 에러 상태 제거, UI 에러 바인딩 및 에러 뷰 제거
Outbound 기능
SampoomManagement/Features/Outbound/Data/Remote/API/OutboundAPI.swift
모든 에러 응답에 서버 메시지 포함
Part 기능
SampoomManagement/Features/Part/UI/PartDetailUiEvent.swift, SampoomManagement/Features/Part/UI/PartDetailUiState.swift, SampoomManagement/Features/Part/UI/PartDetailViewModel.swift, SampoomManagement/Features/Part/UI/PartDetailBottomSheetView.swift, SampoomManagement/Features/Part/UI/PartListView.swift, SampoomManagement/Features/Part/UI/SearchResultView.swift
GlobalMessageHandler 주입, clearError 케이스 제거, updateError 상태 제거, 글로벌 메시지로 에러 표시, 문자열 리소스 사용, showPendingSuccessMessage 추가

Sequence Diagram(s)

sequenceDiagram
    participant User as 사용자
    participant View as View/ViewModel
    participant API as API
    participant GlobalMsg as GlobalMessageHandler
    participant Toast as ToastContainer
    
    User->>View: 작업 요청 (주문, 장바구니 등)
    View->>API: 네트워크 요청
    
    alt 성공
        API-->>View: 응답 (status 200)
        View->>GlobalMsg: showMessage(성공 메시지)
        View->>Toast: 메시지 업데이트 감지
        Toast-->>User: 토스트 표시
        View->>View: UI 상태 업데이트
    else 에러
        API-->>View: 에러 응답 (status 4xx/5xx)
        View->>GlobalMsg: showMessage(에러 메시지, isError: true)
        View->>Toast: 메시지 업데이트 감지
        Toast-->>User: 에러 토스트 표시
    end
Loading
sequenceDiagram
    participant User as 사용자
    participant OrderList as OrderListView
    participant ViewModel as OrderListViewModel
    participant UseCase as GetOrderUseCase
    participant Repository as OrderRepository
    
    User->>OrderList: 주문 목록 로드
    OrderList->>ViewModel: loadOrderList 이벤트
    ViewModel->>UseCase: execute(page: 0, size: 20)
    UseCase->>Repository: getOrderList(page: 0, size: 20)
    Repository-->>UseCase: (items: [Order], hasMore: true)
    UseCase-->>ViewModel: 반환
    ViewModel->>ViewModel: hasMore=true, currentPage=0 업데이트
    
    User->>OrderList: 더 보기 클릭
    OrderList->>ViewModel: loadMore 이벤트
    ViewModel->>UseCase: execute(page: 1, size: 20)
    UseCase->>Repository: getOrderList(page: 1, size: 20)
    Repository-->>UseCase: (items: [Order], hasMore: false)
    UseCase-->>ViewModel: 반환
    ViewModel->>ViewModel: 기존 목록에 추가, currentPage=1 업데이트
    OrderList-->>User: 확장된 목록 표시
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

주의가 필요한 영역:

  • Order 기능 전체 리팩토링: 반환 타입이 OrderList에서 Order/튜플로 변경되었으므로, API부터 ViewModel까지의 전 계층에서 일관성 검증 필요 (OrderAPI.swift, OrderRepositoryImpl.swift, GetOrderUseCase.swift, OrderDetailViewModel.swift, OrderListViewModel.swift)
  • 에러 처리 통합: 로컬 상태 기반 에러 처리에서 글로벌 메시지 핸들러로의 전환이 Cart/Part/Order 전반에 걸쳐 일어났으므로, 사용자 메시지 전달 흐름 검증 필요 (특히 CartListViewModel.swift, OrderDetailViewModel.swift, PartDetailViewModel.swift)
  • 네트워크 에러 확장: NetworkError.serverError 튜플 변경으로 인한 모든 호출 지점 검증 (NetworkManager.swift, CartAPI.swift, OrderAPI.swift, OutboundAPI.swift)
  • 페이징 로직: OrderList의 새로운 페이징 시스템이 append 플래그와 함께 올바르게 작동하는지 확인 (OrderListViewModel.swift)
  • UI 상태 바인딩: 제거된 에러 상태(cartError, updateError, deleteError, orderDetailError) 관련 바인딩이 모두 정리되었는지 확인 (CartListView.swift, OrderDetailView.swift)

Possibly related PRs

Suggested labels

ready-to-merge

Suggested reviewers

  • Lee-Jong-Jin
  • yangjiseonn
  • taemin3
  • vivivim
  • CHOOSLA

Poem

🐰 토스트 때문에 메시지가 쏙쏙,
페이지를 넘기며 더 보기 톡톡,
에러도 글로벌로 표준화되고,
Order는 한 마리, 장바구니는 깔끔히,
버전 투로 업데이트된 앱의 춤을 춘다! 🎉

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 31.15% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed 제목 "SPM-329 주문 로직 수정, 예외 처리 전역 스낵바 적용, 패키지 구조 리팩토링"은 변경사항의 핵심 내용을 명확하게 반영하고 있습니다. 첫째, 주문 로직 수정은 OrderAPI, OrderRepository, OrderListViewModel, OrderDetailViewModel 등에서 광범위한 주문 관련 로직 변경으로 실제 변경사항에 존재합니다. 둘째, 예외 처리 전역 스낵바 적용은 GlobalMessageHandler, ToastContainer 등의 새로운 컴포넌트 도입과 네트워크 에러 처리 개선으로 명확히 구현되어 있습니다. 셋째, 패키지 구조 리팩토링은 UI 이벤트, 상태 관리, 뷰 모델 등의 구조적 개선을 반영하고 있습니다. 제목은 간결하고 구체적이며 개발자 관점에서 주요 변경사항을 효과적으로 요약합니다.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@vivivim vivivim left a comment

Choose a reason for hiding this comment

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

좋은 개선이군요

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
SampoomManagement/Core/UI/Components/ToastContainer.swift (1)

19-32: 에러 토스트 스타일 분기 누락
GlobalMessageHandler.showMessage(_:isError:)에서 에러 여부를 이미 전달하지만, 여기서는 항상 동일한 형태의 토스트만 띄워 성공/실패가 구분되지 않습니다. PR 목표였던 전역 스낵바 기반 예외 처리 요구사항을 충족하려면 isError 값에 따라 Toast 스타일(배경색, 아이콘, 하프틱 등)을 분기해 주세요. 예를 들어 isError == true일 때는 오류용 테마를 적용하고, false일 때는 기존 스타일을 유지하도록 Toast API를 호출하면 사용자가 즉시 성공/실패를 식별할 수 있습니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9f0373f and 7d44001.

📒 Files selected for processing (39)
  • SampoomManagement.xcodeproj/project.pbxproj (2 hunks)
  • SampoomManagement/App/RootView.swift (2 hunks)
  • SampoomManagement/Core/DI/AppDependencies.swift (5 hunks)
  • SampoomManagement/Core/Network/APIResponse.swift (2 hunks)
  • SampoomManagement/Core/Network/NetworkError.swift (2 hunks)
  • SampoomManagement/Core/Network/NetworkManager.swift (4 hunks)
  • SampoomManagement/Core/Resources/StringResources.swift (5 hunks)
  • SampoomManagement/Core/UI/Components/ToastContainer.swift (1 hunks)
  • SampoomManagement/Core/Utilities/GlobalMessageHandler.swift (1 hunks)
  • SampoomManagement/Features/Cart/Data/Remote/API/CartAPI.swift (5 hunks)
  • SampoomManagement/Features/Cart/UI/CartListUiEvent.swift (0 hunks)
  • SampoomManagement/Features/Cart/UI/CartListUiState.swift (1 hunks)
  • SampoomManagement/Features/Cart/UI/CartListView.swift (1 hunks)
  • SampoomManagement/Features/Cart/UI/CartListViewModel.swift (5 hunks)
  • SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (2 hunks)
  • SampoomManagement/Features/Order/Data/Remote/DTO/OrderListDto.swift (1 hunks)
  • SampoomManagement/Features/Order/Data/Remote/DTO/OrderRequestDto.swift (1 hunks)
  • SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (1 hunks)
  • SampoomManagement/Features/Order/Domain/Repository/OrderRepository.swift (1 hunks)
  • SampoomManagement/Features/Order/Domain/UseCase/CreateOrderUseCase.swift (1 hunks)
  • SampoomManagement/Features/Order/Domain/UseCase/GetOrderDetailUseCase.swift (1 hunks)
  • SampoomManagement/Features/Order/Domain/UseCase/GetOrderUseCase.swift (1 hunks)
  • SampoomManagement/Features/Order/UI/OrderDetailContent.swift (1 hunks)
  • SampoomManagement/Features/Order/UI/OrderDetailUiEvent.swift (0 hunks)
  • SampoomManagement/Features/Order/UI/OrderDetailUiState.swift (1 hunks)
  • SampoomManagement/Features/Order/UI/OrderDetailView.swift (3 hunks)
  • SampoomManagement/Features/Order/UI/OrderDetailViewModel.swift (3 hunks)
  • SampoomManagement/Features/Order/UI/OrderListUiEvent.swift (1 hunks)
  • SampoomManagement/Features/Order/UI/OrderListUiState.swift (1 hunks)
  • SampoomManagement/Features/Order/UI/OrderListView.swift (2 hunks)
  • SampoomManagement/Features/Order/UI/OrderListViewModel.swift (1 hunks)
  • SampoomManagement/Features/Order/UI/OrderResultBottomSheet.swift (3 hunks)
  • SampoomManagement/Features/Outbound/Data/Remote/API/OutboundAPI.swift (5 hunks)
  • SampoomManagement/Features/Part/UI/PartDetailBottomSheetView.swift (2 hunks)
  • SampoomManagement/Features/Part/UI/PartDetailUiEvent.swift (0 hunks)
  • SampoomManagement/Features/Part/UI/PartDetailUiState.swift (0 hunks)
  • SampoomManagement/Features/Part/UI/PartDetailViewModel.swift (3 hunks)
  • SampoomManagement/Features/Part/UI/PartListView.swift (2 hunks)
  • SampoomManagement/Features/Part/UI/SearchResultView.swift (2 hunks)
💤 Files with no reviewable changes (4)
  • SampoomManagement/Features/Part/UI/PartDetailUiEvent.swift
  • SampoomManagement/Features/Part/UI/PartDetailUiState.swift
  • SampoomManagement/Features/Cart/UI/CartListUiEvent.swift
  • SampoomManagement/Features/Order/UI/OrderDetailUiEvent.swift
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-11T12:58:56.474Z
Learnt from: Sangyoon98
Repo: 33-Auto/Sampoom-Management-iOS PR: 7
File: SampoomManagement/Core/UI/Components/CommonTextField.swift:117-119
Timestamp: 2025-10-11T12:58:56.474Z
Learning: In Swift/SwiftUI iOS 17.0+, the onChange(of:perform:) modifier expects a two-parameter closure (oldValue, newValue) or zero-parameter closure, not a single-parameter closure. The older single-parameter version was deprecated in iOS 17.0.

Applied to files:

  • SampoomManagement/Features/Cart/UI/CartListView.swift
  • SampoomManagement/Features/Part/UI/PartDetailBottomSheetView.swift
🧬 Code graph analysis (18)
SampoomManagement/Features/Part/UI/PartListView.swift (1)
SampoomManagement/Features/Part/UI/PartDetailViewModel.swift (2)
  • showPendingSuccessMessage (115-121)
  • clearSuccess (123-125)
SampoomManagement/Features/Order/UI/OrderResultBottomSheet.swift (3)
SampoomManagement/Features/Order/UI/OrderDetailViewModel.swift (4)
  • setOrderId (37-40)
  • onEvent (42-51)
  • cancelOrder (79-99)
  • clearSuccess (53-58)
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (1)
  • cancelOrder (73-80)
SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (1)
  • cancelOrder (71-73)
SampoomManagement/Features/Part/UI/SearchResultView.swift (1)
SampoomManagement/Features/Part/UI/PartDetailViewModel.swift (2)
  • showPendingSuccessMessage (115-121)
  • clearSuccess (123-125)
SampoomManagement/Features/Cart/UI/CartListViewModel.swift (7)
SampoomManagement/Features/Cart/UI/CartListUiState.swift (1)
  • copy (40-60)
SampoomManagement/Features/Order/Domain/UseCase/CreateOrderUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Cart/Domain/UseCase/DeleteAllCartUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Cart/Domain/UseCase/DeleteCartUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Cart/Domain/UseCase/UpdateCartQuantityUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Cart/Domain/UseCase/GetCartUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Core/Utilities/GlobalMessageHandler.swift (1)
  • showMessage (21-30)
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (2)
SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (4)
  • getOrderList (19-28)
  • createOrder (30-60)
  • getOrderDetail (66-69)
  • cancelOrder (71-73)
SampoomManagement/Core/Network/NetworkManager.swift (2)
  • request (42-106)
  • request (108-181)
SampoomManagement/Features/Order/Domain/Repository/OrderRepository.swift (2)
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (4)
  • getOrderList (19-31)
  • createOrder (34-46)
  • receiveOrder (49-56)
  • getOrderDetail (59-70)
SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (4)
  • getOrderList (19-28)
  • createOrder (30-60)
  • receiveOrder (62-64)
  • getOrderDetail (66-69)
SampoomManagement/Features/Order/Domain/UseCase/GetOrderDetailUseCase.swift (2)
SampoomManagement/Features/Order/Domain/UseCase/CreateOrderUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Order/Domain/UseCase/GetOrderUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (4)
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (3)
  • getOrderList (19-31)
  • createOrder (34-46)
  • getOrderDetail (59-70)
SampoomManagement/Features/Auth/Data/Local/Preferences/AuthPreferences.swift (1)
  • getStoredUser (63-95)
SampoomManagement/Features/Cart/Data/Mappers/CartMappers.swift (3)
  • toModel (11-13)
  • toModel (17-19)
  • toModel (23-25)
SampoomManagement/Features/Order/Data/Mappers/OrderMappers .swift (4)
  • toModel (11-13)
  • toModel (17-19)
  • toModel (23-25)
  • toModel (29-31)
SampoomManagement/Features/Order/UI/OrderDetailUiState.swift (3)
SampoomManagement/Features/Cart/UI/CartListUiState.swift (1)
  • copy (40-60)
SampoomManagement/Features/Order/UI/OrderListUiState.swift (1)
  • copy (31-45)
SampoomManagement/Features/Part/UI/PartDetailUiState.swift (1)
  • copy (31-45)
SampoomManagement/Features/Cart/UI/CartListUiState.swift (3)
SampoomManagement/Features/Part/UI/PartDetailUiState.swift (1)
  • copy (31-45)
SampoomManagement/Features/Outbound/UI/OutboundListUiState.swift (1)
  • copy (43-65)
SampoomManagement/Features/Part/UI/PartListUiState.swift (1)
  • copy (28-40)
SampoomManagement/Features/Cart/UI/CartListView.swift (1)
SampoomManagement/Core/DI/AppDependencies.swift (1)
  • makeOrderDetailViewModel (205-213)
SampoomManagement/Features/Order/UI/OrderListViewModel.swift (3)
SampoomManagement/Features/Order/UI/OrderListUiState.swift (1)
  • copy (31-45)
SampoomManagement/Features/Order/Domain/UseCase/GetOrderUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Core/Utilities/GlobalMessageHandler.swift (1)
  • showMessage (21-30)
SampoomManagement/Features/Order/UI/OrderDetailViewModel.swift (7)
SampoomManagement/Features/Order/UI/OrderDetailUiState.swift (1)
  • copy (31-45)
SampoomManagement/Features/Order/Domain/UseCase/GetOrderDetailUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Order/Domain/UseCase/ReceiveOrderUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Features/Order/Domain/UseCase/CancelOrderUseCase.swift (1)
  • execute (17-19)
SampoomManagement/Core/Utilities/GlobalMessageHandler.swift (1)
  • showMessage (21-30)
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (1)
  • receiveOrder (49-56)
SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (1)
  • receiveOrder (62-64)
SampoomManagement/Features/Order/Domain/UseCase/CreateOrderUseCase.swift (2)
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (1)
  • createOrder (34-46)
SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (1)
  • createOrder (30-60)
SampoomManagement/Features/Order/Domain/UseCase/GetOrderUseCase.swift (2)
SampoomManagement/Features/Order/Data/Remote/API/OrderAPI.swift (1)
  • getOrderList (19-31)
SampoomManagement/Features/Order/Data/Repository/OrderRepositoryImpl.swift (1)
  • getOrderList (19-28)
SampoomManagement/Features/Order/UI/OrderListView.swift (1)
SampoomManagement/Features/Order/UI/OrderListViewModel.swift (1)
  • onEvent (27-37)
SampoomManagement/Features/Part/UI/PartDetailViewModel.swift (3)
SampoomManagement/Features/Part/UI/PartDetailBottomSheetView.swift (1)
  • addToOutbound (13-17)
SampoomManagement/Features/Part/UI/PartDetailUiState.swift (1)
  • copy (31-45)
SampoomManagement/Core/Utilities/GlobalMessageHandler.swift (1)
  • showMessage (21-30)
SampoomManagement/Features/Order/UI/OrderListUiState.swift (2)
SampoomManagement/Features/Cart/UI/CartListUiState.swift (1)
  • copy (40-60)
SampoomManagement/Features/Order/UI/OrderDetailUiState.swift (1)
  • copy (31-45)
🔇 Additional comments (30)
SampoomManagement/Features/Order/UI/OrderDetailContent.swift (4)

21-26: 좋은 개선입니다!

주문 항목 섹션에 제목을 추가하여 UI의 가독성을 향상시켰습니다. 현지화 리소스 사용과 스타일링이 적절합니다.


17-19: LGTM!

OrderInfoCard에 단일 order 객체를 전달하고 수평 패딩을 추가한 변경사항이 적절합니다. 코드가 새로운 데이터 모델과 일관성 있게 작성되었습니다.

Also applies to: 40-40


27-35: Order 모델 구조가 정확히 정의되어 있으며, 코드가 올바릅니다.

검증 결과, Order.items[OrderCategory] 타입으로 올바르게 정의되어 있고, 중첩된 계층 구조(items → groups → parts)와 id 선택자들이 모두 정확하게 구현되어 있습니다. ForEach 반복 로직과 OrderCategory, OrderGroup, OrderPart 모델의 속성들이 완벽하게 일치합니다.


12-12: 변경 사항이 올바르게 적용되었습니다.

검증 결과, order 속성의 타입 변경([Order]Order)이 모든 호출 지점에서 올바르게 반영되었음을 확인했습니다:

  • OrderDetailView.swift (라인 29-31): viewModel.uiState.orderDetail에서 optional 바인딩으로 단일 Order 객체 전달 ✓
  • OrderResultBottomSheet.swift (라인 29-30): viewModel.uiState.orderDetail ?? order로 단일 Order 객체 전달 ✓
  • 뷰 모델: OrderDetailUiStateorderDetail 속성이 Order?로 올바르게 정의됨 ✓

모든 호출 지점이 타입 변경에 맞게 업데이트되었으므로 추가 조치가 필요하지 않습니다.

SampoomManagement/Features/Order/UI/OrderListUiEvent.swift (1)

13-13: LGTM!

페이징 지원을 위한 loadMore 이벤트 추가가 적절합니다. 다른 이벤트 케이스들과 일관된 네이밍을 따르고 있습니다.

SampoomManagement/Features/Order/Data/Remote/DTO/OrderListDto.swift (1)

10-19: LGTM!

표준 Spring 페이징 응답 구조를 정확하게 반영한 DTO입니다. 필드명과 타입이 명확하고, 주석을 통해 numberlast 필드의 의미를 설명하고 있어 좋습니다.

SampoomManagement.xcodeproj/project.pbxproj (1)

285-285: LGTM!

프로젝트 버전을 1에서 2로 증가시킨 것이 적절합니다. Debug와 Release 설정 모두 일관되게 업데이트되었습니다.

Also applies to: 320-320

SampoomManagement/Features/Order/Domain/UseCase/CreateOrderUseCase.swift (1)

17-18: LGTM!

주문 생성 로직이 개선되었습니다. CartList를 파라미터로 받아 단일 Order를 반환하는 시그니처가 의미론적으로 더 명확합니다.

SampoomManagement/Features/Order/Domain/UseCase/GetOrderDetailUseCase.swift (1)

17-18: LGTM!

주문 상세 조회가 단일 Order를 반환하도록 변경된 것이 논리적으로 올바릅니다. 단일 주문의 상세 정보를 조회하는 용도에 적합합니다.

SampoomManagement/Features/Order/UI/OrderResultBottomSheet.swift (2)

12-12: LGTM!

order 프로퍼티가 배열에서 단일 객체로 변경되어 더 명확해졌습니다. 주문 결과 바텀시트는 하나의 주문만 표시하므로 이 변경이 적절합니다.


30-30: LGTM!

단일 Order 객체를 사용하도록 모든 참조가 일관되게 업데이트되었습니다. orderDetail ?? order 폴백 패턴도 적절하며, 옵셔널 체이닝 제거도 올바릅니다.

Also applies to: 53-54, 59-59, 72-73

SampoomManagement/Core/Resources/StringResources.swift (2)

87-87: LGTM!

새로운 문자열 리소스 추가가 적절합니다. loadMore는 페이징 기능을, emptyPart는 빈 상태 처리를 지원합니다.

Also applies to: 151-151


101-101: LGTM!

UI 텍스트가 더 간결하고 명확하게 개선되었습니다. "비우기"로 단순화된 버튼 텍스트와 확인 메시지 간소화가 사용자 경험을 향상시킵니다.

Also applies to: 116-116, 136-137, 140-140, 142-142

SampoomManagement/Features/Order/UI/OrderDetailUiState.swift (2)

11-11: LGTM!

orderDetail이 배열에서 옵셔널 단일 객체로 변경되어 주문 상세 화면의 의도를 더 명확하게 표현합니다. 기본값도 빈 배열에서 nil로 적절하게 변경되었습니다.

Also applies to: 18-18, 32-32


22-22: LGTM!

에러 관련 필드(orderDetailError, isProcessingError)를 제거하고 전역 메시지 핸들러로 통합한 것이 PR 목표와 일치합니다. 상태 관리가 더 간결해졌습니다.

Also applies to: 36-36, 43-43

SampoomManagement/Features/Order/UI/OrderListUiState.swift (2)

13-15: 페이징 지원으로의 깔끔한 전환

orderError를 제거하고 페이징 관련 프로퍼티(hasMore, currentPage, isLoadingMore)를 추가한 것은 전역 에러 처리 시스템으로의 전환과 함께 무한 스크롤 기능을 지원하기 위한 좋은 구조입니다.


31-44: LGTM!

copy 메서드가 새로운 페이징 프로퍼티들을 올바르게 처리하고 있으며, 기존 CartListUiState의 패턴과 일관성을 유지하고 있습니다.

SampoomManagement/Core/Network/APIResponse.swift (2)

8-8: Swift 6 동시성 지원

@preconcurrency 어노테이션을 추가하여 Foundation 모듈의 동시성 경고를 적절히 처리하고 있습니다.


20-24: 서버 에러 응답 구조 추가

안드로이드와 동일한 에러 응답 구조를 도입하여 플랫폼 간 일관성을 유지하고 있습니다. 서버에서 제공하는 에러 메시지를 사용자에게 전달하기 위한 좋은 구조입니다.

SampoomManagement/Features/Part/UI/PartListView.swift (2)

46-46: 문자열 리소스 중앙화

하드코딩된 문자열을 StringResources.Part.emptyPart로 대체하여 유지보수성과 다국어 지원 가능성을 개선했습니다.


79-81: 바텀시트 해제 후 성공 메시지 처리

바텀시트가 닫힌 후 부모 뷰에서 성공 메시지를 표시하는 패턴이 올바르게 구현되었습니다. 이는 바텀시트가 닫히는 동안 토스트 메시지가 사라지는 것을 방지합니다.

SampoomManagement/Features/Order/Data/Remote/DTO/OrderRequestDto.swift (1)

11-14: LGTM!

주문 생성 요청 DTO가 명확하게 정의되어 있습니다. 구조가 단순하고 목적이 주석으로 잘 설명되어 있습니다.

SampoomManagement/Features/Outbound/Data/Remote/API/OutboundAPI.swift (2)

39-39: 서버 에러 메시지 전파

서버에서 제공하는 에러 메시지를 NetworkError에 포함시켜 사용자에게 더 명확한 피드백을 제공할 수 있게 되었습니다.


51-51: 일관된 에러 처리 패턴

모든 출고 관련 API 메서드에서 서버 메시지를 포함하는 에러 처리 패턴을 일관되게 적용하고 있습니다.

Also applies to: 63-63, 77-77, 89-89

SampoomManagement/App/RootView.swift (2)

9-9: 전역 메시지 핸들러 통합

Toast 라이브러리와 GlobalMessageHandler를 앱 루트에 통합하여 전역 에러 및 성공 메시지 시스템을 구축했습니다. 의존성 주입이 올바르게 설정되어 있습니다.

Also applies to: 17-17, 25-25


76-78: ToastContainer 배치

ToastContainerZStack의 최상단에 배치하여 앱의 모든 화면에서 토스트 메시지를 표시할 수 있도록 했습니다. 이는 전역 메시지 시스템의 핵심 부분입니다.

SampoomManagement/Features/Part/UI/SearchResultView.swift (2)

77-77: 문자열 리소스 중앙화

검색 결과 빈 상태 메시지를 StringResources.SearchParts.emptyMessage로 변경하여 PartListView와 일관된 패턴을 따르고 있습니다.


34-36: 바텀시트 해제 후 성공 메시지 처리

PartListView와 동일한 패턴으로 바텀시트 해제 후 성공 메시지를 처리하고 있습니다. 이는 코드베이스 전반에 걸쳐 일관성을 유지합니다.

SampoomManagement/Features/Cart/Data/Remote/API/CartAPI.swift (2)

25-27: 장바구니 조회 에러 처리 개선

getCartList에 명시적인 에러 체크를 추가하여 서버 응답이 실패일 경우 메시지를 포함한 에러를 throw하도록 개선했습니다.


41-41: 일관된 에러 처리 패턴

모든 장바구니 관련 API 메서드에서 서버 메시지를 포함하는 에러 처리 패턴을 일관되게 적용하고 있습니다. 이는 OutboundAPI의 패턴과도 일치합니다.

Also applies to: 53-53, 67-67, 79-79

Comment thread SampoomManagement/Features/Cart/UI/CartListViewModel.swift
Comment thread SampoomManagement/Features/Order/UI/OrderListViewModel.swift Outdated
Sangyoon98 and others added 2 commits November 2, 2025 23:48
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@Sangyoon98 Sangyoon98 merged commit ed2c94c into dev Nov 2, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants