강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

anwjr41님의 프로필 이미지
anwjr41

작성한 질문수

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

Optimistic Response

removeFromBasket에서 await patchBasket()을 마지막에 하면 에러나는거 아닌가요?

작성

·

38

·

수정됨

0

  Future<void> patchBasket() async {
    await repository.patchBasket(
      body: PatchBasketBody(
        basket: state
            .map((e) => PatchBasketBodyBasket(
                  productId: e.product.id,
                  count: e.count,
                ))
            .toList(),
      ),
    );
  }

  Future<void> removeFromBasket({
    // true면 count에 관계없이 삭제
    bool isDelete = false,  
    required ProductModel product,
  }) async {
    // 1) 장바구니에 상품이 존재할때
    //    1-1) 상품의 카운트가 1보다 크면 -1
    //    1-2) 상품의 카운트가 1이면 상품 제거
    // 2) 장바구니에 상품이 존재하지 않을때
    //    2-1) 즉시 함수 반환하고 아무것도 하지 않음
    final exists =
        state.firstWhereOrNull((e) => e.product.id == product.id) != null;

    print('exists: $exists');

    if (!exists) {
      return;
    }

    final existingProduct = state.firstWhere((e) => e.product.id == product.id);

    if (existingProduct.count == 1 || isDelete) {
      state = state.where((e) => e.product.id != product.id).toList();
    } else {
      state = state
          .map(
            (e) => e.product.id == product.id
                ? e.copyWith(
                    count: e.count - 1,
                  )
                : e,
          )
          .toList();
    }
    await patchBasket();
  }

 

장바구니에서 삭제할 때 상품이 1개 있고 1개의 상품 주문갯수가 1일 때 삭제를 하게되면 해당id를 뺀 값들이 리스트에 담기게 되는데 그럼 장바구니는 전부 비어지게 됩니다. 그래서 스크린에서는 "장바구니 비어있습니다"가 나오는 것 까진 됩니다.

이후 어쨋든 patchBasket은 실행되는데 이때 리스트가 비어 있으니 서버호출할 때 400 에러가 발생합니다.. 서버단에서 비어있는 장바구니를 보내면 정상응답으로 비어 있는 get요청을 받는 과정이 필요한게 아닌가 해서 여쭤봅니다!

image.png


포스트맨에서도 빈 리스트를 보내면 400이 옵니다.

좋은 주말 되세요!

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

말씀하신 부분 반영해서 서버 다시 업로드 해드렸습니다.

원하신 기능이 맞는지 확인한번 부탁드립니다.

감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. anwjr41님.

장바구니에서 상품을 삭제할 때, 리스트가 비어서 서버에 빈 “basket”을 전송하는 경우 서버에서 400 에러가 발생하는 문제를 겪고 계신 것 같습니다. 이는 서버가 비어 있는 basket을 허용하지 않기 때문입니다.

이 문제를 해결하기 위해 몇 가지 접근 방법을 고려해 볼 수 있습니다:

  1. 빈 리스트 체크: patchBasket 메서드를 호출하기 전에 장바구니 리스트가 비었는지 확인해서 비어있다면 서버에 요청을 보내지 않도록 할 수 있습니다. 예를 들어, removeFromBasket 메소드 내에서 await patchBasket(); 전에 리스트가 비어 있는지 확인하는 코드를 추가하는 방법이 있습니다:

    if (state.isEmpty) {
      print('장바구니가 비어 있습니다. patchBasket을 요청하지 않습니다.');
      return;
    }
    await patchBasket();
    
  2. 서버에서 빈 리스트 처리: 만약 서버 코드를 수정할 수 있는 권한이 있다면 서버 로직에서 빈 리스트를 특별히 처리하여 에러를 발생시키지 않게 변경하는 방법도 있습니다.

질문해 주신 내용과 관련된 유사한 사례로는 ‘장바구니에 상품 추가하는 로직에서 궁금한 점이 있습니다‘라는 질문이 있습니다. 이 질문에서는 통신 효율성을 고려하여 patchBasket 호출 시점을 고민하고 논의한 바 있습니다. 참고하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

anwjr41님의 프로필 이미지
anwjr41

작성한 질문수

질문하기