[SPM-329] 주문 로직 수정, 예외 처리 전역 스낵바 적용, 패키지 구조 리팩토링#19
Conversation
|
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 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. 📒 Files selected for processing (2)
Walkthrough프로젝트 버전 업그레이드(1→2), Toast 라이브러리 통합, 글로벌 메시지 핸들러 추가, 네트워크 에러 응답에 서버 메시지 포함, Order API 페이징 지원으로 변경, Cart/Part 기능에서 로컬 에러 상태 제거 후 글로벌 메시지 시스템으로 통합. Changes
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
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: 확장된 목록 표시
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes 주의가 필요한 영역:
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
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. Comment |
There was a problem hiding this comment.
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
📒 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.swiftSampoomManagement/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객체 전달 ✓- 뷰 모델:
OrderDetailUiState의orderDetail속성이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입니다. 필드명과 타입이 명확하고, 주석을 통해
number와last필드의 의미를 설명하고 있어 좋습니다.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 배치
ToastContainer를ZStack의 최상단에 배치하여 앱의 모든 화면에서 토스트 메시지를 표시할 수 있도록 했습니다. 이는 전역 메시지 시스템의 핵심 부분입니다.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
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
📝 Summary
주문 로직 수정, 예외 처리 전역 스낵바 적용, 패키지 구조 리팩토링
🙏 Question & PR point
📬 Reference
Summary by CodeRabbit
릴리스 노트
새로운 기능
버그 수정