상품 상세 페이지

상품 상세

- ProductDetailPage
  - useFetchProduct.ts  // 👈🏻 loading, error 대한 처리 hook
  - ProductDetail.tsx  // 👈🏻 Store 통해 상품 상세 얻기

ProductDetailPage.tsx

  • 상품 상세 정보를 얻어서 보여주는 페이지

  • useFetchProduct 통해서 상품을 찾을 수 없는 경우를 따로 구분하진 않고 일반 Error로 구현

  • 장바구니 담기 기능 때문에 Prop drilling 문제가 발생 될 수 있어, prop로 상품상세정보 받기보다는 store 통해 전달

Loading, Error UI 구현

useParams hook을 사용해서 productId 얻어오기

export default function ProductDetailPage() {
  const params = useParams(); // 👈🏻 hooks

  const { loading, error } = useFetchProduct({
    productId: String(params.id),
  });

  if (loading) {
    return (
      <p>Loading...</p>
    );
  }

  if (error) {
    return (
      <p>Error!</p>
    );
  }

  return (
    <ProductDetail />
  );
}

useFetchProduct.ts

  • 스토어에서 loading 과 error 값을 반환하는 custom hook 역활

ProductDetailStore.ts

  • 상품상세정보, loading, error 값을 가지고 있는 Store

Null Object 생성

  • 상품정보의 타입에 맞게 types.ts 파일 안에 NullObject 생성

useProductDetailStore.ts

  • ProductDetailStore를 사용해서 스토어에 접근 할 수 있는 hook

✅ Refactor

  • useFetchProduct.ts 분리 작업

상품 상세 정보 UI 구현

ProductDetail.tsx

  • store 에서 상품 정보 얻어오기

  • UI 구현

    • Images : 상품 이미지

    • Description : 상품 정보에 대한 문구

    • AddToCartForm : 장바구니 추가되는 영역

Images.tsx

Description.tsx

"Color: Black, Grey, Blue, Brown\nSize: ONE\n\n편하게 입을 수 있는 맨투맨\n고급 원단과 봉제가 들어가\n유니크함이 돋보이는 디자인\n내츄럴한 멋을 살리는 핏"

여러줄로 처리된 데이터를 줄바꿈 처리

장바구니 상품 담기

🤔 장바구니에 상품을 담는다는 의미는? Product와 관련된 Option 정보, 수량 등 다양한 값이 조합돼 CartLineItem을 구성하는 것

실제로는 조금 복잡한 도메인 로직이 들어갈 수 있는데, 이런 처리는 백엔드에서 담당하기로 하고, 우선은 상품과 관련된 옵션, 수량, 가격, 담는 버튼에만 집중해서 구현

AddToCartForm.tsx

  • Props Drilling을 피하기 위해 개별 컴포넌트 Store 사용

  • Options : 옵션을 보여주고, 선택할 수 있게 하는 영역

  • Quantity : 수량 버튼 (기본값 : 1)

  • Price : 수량에 맞는 가격 출력

  • SubmitButton : 장바구니 담기 버튼, 담았다는 메세지 출력

AddToCartForm.test.tsx

  • MSW 활용한 방식

Store 및 Store 사용을 위한 hooks 생성

  • useProductFormStore.ts

  • ProductFormStore.ts

  • ProductFormStore.test.ts

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

Quantity : 수량 버튼 기능 구현

  • Quantity.tsx

    • useProductFormStore를 통해 quantity, changeQuantity 함수를 사용해서 구현

  • Quantity.test.tsx

  • ProductFormStore.test.ts

Price : 수량에 맞는 가격 UI 구현

Getter 이용한 방식

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

📖 Getter 와 Setter

  • Getter(획득자)

  • Setter(설정자)

    • 객체 리터럴 안에서는 getset으로 나타낼 수 있음.

get : 인수가 없는 함수로, 프로터피를 읽을 때 동작함

SubmitButton : 장바구니 담기 버튼 기능 구현

SubmitButton.tsx

  • useProductFormStore store로 부터 done 과 store.addToCart 함수를 적용

SubmitButton.test.tsx

  • store에 대해 mocking을 통해 통과했지만 실제 SubmitButton은 구현해두지 않았다.

    • mocking의 약점! 주의하자!

ProductFormStore의 싱태 추가 및 액션 addToCart 추가

✅ Refactor

price.tsx

  • product 변경에 따른 setProduct 호출은 여기가 아니라 page 등에서 처리

  • useFetchProduct.ts로 이동

  • price.test.tsx : Mocking 제거 MSW로 실제로 스토어에서 받아옴

Options : 옵션 선택 기능 구현

🔗 참고

Last updated