5. 장바구니에 상품 담기

장바구니에 상품 담기

🔗 실습 링크 : 장바구니에 상품 담기 수량 조절, 가격 표시 구현 🔗 실습 링크 : 장바구니에 상품 담기 버튼 구현, Price 컴포넌트 리팩토링 🔗 실습 링크 : 장바구니에 상품 담기 옵션 선택 구현

🎯 장바구니에 상품 담기 기능 구현하기

🛒 장바구니에 상품 담기의 의미

정확히는 Product가 Cart로 들어가는 것이 아니라, Product와 관련된 Option 정보, 수량 등 다양한 값이 조합돼 Cart의 Line Item을 구성하는 것

실제로는 조금 복잡한 도메인 로직이 들어갈 수 있는데, 이런 처리는 백엔드에서 담당하기로 하자. 현업에서는 백엔드와 협업할 때, 어떤 방식으로 데이터를 넘겨주면 좋은지 먼저 소통을 하면 좋음 여기서는 상품과 관련된 옵션, 수량 등을 컨트롤하는데 집중할 것

AddToCartForm.tsx 컴포넌트 작성

  • src/components/product-detail/form

구현 내용

  1. 옵션을 보여주고, 선택하기

  2. 수량 정하기 (기본값: 1)

  3. 수량에 맞는 비용 보여주기

    • 단가 보여주기

    • 추가 가능 작업 : 할인가, 정상가, 쿠폰 적용가 등

  4. 장바구니에 담기 버튼이 있고, 클릭 시 장바구니에 담았다는 메시지로 교체

    • UX 관련 파트 : 다양한 방법 존재

    • 타임아웃으로 기존 페이지로 돌아가게 처리

    • 팝업 모달 띄우기

  • Prop Drilling을 피하기 위해 전부 개별 컴포넌트에서 Store를 가져다 쓰도록 구현

  • 부모 컴포넌트에서 props를 내려줘도 되지만, 복잡해질 가능성이 커서 내부에서 처리

Quantity 컴포넌트 작성

  • 숫자를 직접 입력하는 것은 불가

  • 버튼만 이용해서 수량을 조절하도록 구현

공통으로 사용할 Button 컴포넌트 생성

  • 공통 UI는 ui 폴더를 만들어서 관리하면 좋음

  • src/components/ui

useProductFormStore hook 생성

  • src/hooks

ProductFormStore 생성

  • src/stores

테스트 작성하기

사소한 비즈니스 로직이지만, 테스트 코드를 통해 검증할 것

💡 테스트를 하기 어려운 상황일 때 최소한의 방법

설계에서 비즈니스 로직과 UI를 분리하고, 비즈니스 로직을 중점으로 테스트 리액트와 완전히 분리하면 jest와 typescript만 가지고 테스트를 작성할 수 있음 테스트가 깔끔, 단순해지고 오래 감

Price 컴포넌트 작성

Getter 이용하기

ProductFormStore에 수량에 따른 금액을 계산하는 메서드 또는 Getter가 있다면 다른 형태로 접근할 수도 있음

  • src/stores/ProductFormStore.ts

복잡한 로직의 경우 이런 방식으로 구현하면 깔끔해짐 할인, 쿠폰 적용가 등을 처리할 수 있음

SubmitButton 컴포넌트 작성

Store에 addToCart 및 상태 추가

장바구니에 상품을 담기 위해 관리해야 할 여러 상태가 필요

@Action()

  • setProduct(product: ProductDetail) {}

  • changeQuantity(quantity: number) {}

  • resetDone() {}

  • complete() {}

API Service에 addProductToCart 추가

Options 컴포넌트 작성

Option 컴포넌트 작성

복잡한 로직을 분리해서 처리

범용 ComboBox 컴포넌트 작성

  • src/components/ui

Store에 changeOptionItem 추가

  • src/stores/ProductFormStore.ts

Last updated