상품 상세 페이지
상품 상세
- ProductDetailPage
- useFetchProduct.ts // 👈🏻 loading, error 대한 처리 hook
- ProductDetail.tsx // 👈🏻 Store 통해 상품 상세 얻기ProductDetailPage.tsx
상품 상세 정보를 얻어서 보여주는 페이지
useFetchProduct 통해서 상품을 찾을 수 없는 경우를 따로 구분하진 않고 일반 Error로 구현
장바구니 담기 기능 때문에
Prop drilling문제가 발생 될 수 있어, prop로 상품상세정보 받기보다는 store 통해 전달
Loading, Error UI 구현
useParams hook을 사용해서 productId 얻어오기
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정보, 수량 등 다양한 값이 조합돼Cart의LineItem을 구성하는 것
실제로는 조금 복잡한 도메인 로직이 들어갈 수 있는데, 이런 처리는 백엔드에서 담당하기로 하고, 우선은 상품과 관련된 옵션, 수량, 가격, 담는 버튼에만 집중해서 구현
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 이용한 방식
ProductFormStorestore 수량에 따른 금액을 계산하는 메서드 또는 Getter가 있다면 다른 형태로 접근 가능
📖 Getter 와 Setter
Getter(획득자)
Setter(설정자)
객체 리터럴 안에서는
get과set으로 나타낼 수 있음.
get : 인수가 없는 함수로, 프로터피를 읽을 때 동작함
SubmitButton : 장바구니 담기 버튼 기능 구현
SubmitButton.tsx
useProductFormStorestore로 부터 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