5. 상품 관리

1. 상품 목록

🎯 상품 목록 상세보기, 추가하기, 수정하기, 삭제하기 구현

  • 기본적인 fetch 작업에선 SWR을 사용

  • 폼을 관리하는 부분은 React Hook Form 대신 usestore-ts를 사용해서 기존 코드와 비교해서 어색한 부분이 있을 수 있음

ProductListPage 생성

기존의 페이지와 유사 주문 목록 페이지보다 단순

useFetchProducts hook 생성

export default function useFetchProducts() {
  const {
    data, error, loading, mutate,
  } = useFetch<{
    products: ProductSummary[];
  }>('/products');

  return {
    products: data?.products ?? [],
    error,
    loading,
    async refresh() {
      mutate();
    },
  };
}
  • 기존에는 refresh 안에서 apiService를 통해 create 했다면, 여기서는 store를 만들어 처리

2. 상품 상세

ProductDetailPage 생성

Description 컴포넌트 구현

고객 사이트 만들 때 쓴 걸 거의 그대로 재활용

  • key는 utils의 것을 활용

useFetchProduct hook 생성

여기까지는 특별한 게 없음 🎯 상품 추가/수정 기능에서 데이터 구조를 동적으로 조정하기 위한 Store를 준비하고, 그 다음에 화면 꾸미기

테스트 코드 작성

스토어 구현에 앞서 테스트 코드 작성

💡 불안할수록 구체적으로 작성할 것

테스트 코드

ProductFormStore 생성

상품 추가/수정에서 공통으로 사용할 스토어를 생성

💡 원하는 상황을 먼저 테스트 코드로 묘사 → 테스트가 통과하도록 구현 해보기 단 하나의 테스트만 작성해야 한다면? 스토어 등의 비즈니스 로직

  • ProductOption을 갖고, OptionOptionItem을 갖는 구조 → 깊이 들어간 배열에 값을 추가하거나 삭제하는 게 쉽지 않음

  • 유틸리티 함수 append, remove, update를 src/utils/index.ts 파일에 추가

useProductFormStore hook 생성

  • hooks/ProductFormStore.ts

ProductFormStore를 쉽게 쓰기 위한 hook

3. 상품 추가

ProductNewPage 생성

관리자 사이트를 만들면서 쓴 방식보다는 고객 사이트를 만들 때 쓴 방식에 가까움 💡 SWR을 쓰기 때문에 API 호출이 성공하면 캐시를 초기화해야 한다는 걸 잊지 말 것

ProductNewForm 컴포넌트 구현

고객 사이트와 비슷 복잡한 로직은 컴포넌트 분리

Images 컴포넌트 구현

  • 이미지 삭제

  • 이미지 추가

Options 컴포넌트 구현

깊이가 더 깊은 옵션도 다뤄야 하기 때문에 Options 컴포넌트를 생성

  • 옵션 삭제

  • 옵션 추가

OptionItems 컴포넌트 구현

  • 아이템 삭제

  • 아이템 추가

4. 상품 수정

수정은 데이터를 가지고와서 처리해야 하기 때문에 다른 것보다 좀 더 복잡함

ProductEditPage 생성

  • ProductNewPage와 유사

  • useFetchProduct에서 얻어오기

ProductEditForm 컴포넌트 구현

  • ProductNewForm 컴포넌트와 유사

  • Images, Options 등은 전부 그대로 재사용

  • 개발 중일 때 hidden 사용

  • CheckBox 컴포넌트는 이번에 처음 등장

🔎

API를 백엔드 개발자와 같이 만드는 것이 중요 문제점이 있으면 서로 소통해야 함

Last updated