Skip to content

Conversation

@changsu1993
Copy link

@changsu1993 changsu1993 commented Dec 3, 2025

과제의 핵심취지

  • React의 hook 이해하기
  • 함수형 프로그래밍에 대한 이해
  • 액션과 순수함수의 분리

과제에서 꼭 알아가길 바라는 점

  • 엔티티를 다루는 상태와 그렇지 않은 상태 - cart, isCartFull vs isShowPopup
  • 엔티티를 다루는 컴포넌트와 훅 - CartItemView, useCart(), useProduct()
  • 엔티티를 다루지 않는 컴포넌트와 훅 - Button, useRoute, useEvent 등
  • 엔티티를 다루는 함수와 그렇지 않은 함수 - calculateCartTotal(cart) vs capaitalize(str)

기본과제

  • Component에서 비즈니스 로직을 분리하기

  • 비즈니스 로직에서 특정 엔티티만 다루는 계산을 분리하기

  • 뷰데이터와 엔티티데이터의 분리에 대한 이해

  • entities -> features -> UI 계층에 대한 이해

  • Component에서 사용되는 Data가 아닌 로직들은 hook으로 옮겨졌나요?

  • 주어진 hook의 책임에 맞도록 코드가 분리가 되었나요?

  • 계산함수는 순수함수로 작성이 되었나요?

  • Component에서 사용되는 Data가 아닌 로직들은 hook으로 옮겨졌나요?

  • 주어진 hook의 책임에 맞도록 코드가 분리가 되었나요?

  • 계산함수는 순수함수로 작성이 되었나요?

  • 특정 Entitiy만 다루는 함수는 분리되어 있나요?

  • 특정 Entitiy만 다루는 Component와 UI를 다루는 Component는 분리되어 있나요?

  • 데이터 흐름에 맞는 계층구조를 이루고 의존성이 맞게 작성이 되었나요?

심화과제

  • 이번 심화과제는 Context나 Jotai를 사용해서 Props drilling을 없애는 것입니다.

  • 어떤 props는 남겨야 하는지, 어떤 props는 제거해야 하는지에 대한 기준을 세워보세요.

  • Context나 Jotai를 사용하여 상태를 관리하는 방법을 익히고, 이를 통해 컴포넌트 간의 데이터 전달을 효율적으로 처리할 수 있습니다.

  • Context나 Jotai를 사용해서 전역상태관리를 구축했나요?

  • 전역상태관리를 통해 domain custom hook을 적절하게 리팩토링 했나요?

  • 도메인 컴포넌트에 도메인 props는 남기고 props drilling을 유발하는 불필요한 props는 잘 제거했나요?

  • 전체적으로 분리와 재조립이 더 수월해진 결합도가 낮아진 코드가 되었나요?

https://changsu1993.github.io/front_7th_chapter3-2/

과제 셀프회고

과제를 하면서 내가 알게된 점, 좋았던 점은 무엇인가요?

  • Cart, Product, Coupon 등 엔티티를 기준으로 코드를 분리하니 자연스럽게 책임이 명확해졌습니다.

이번 과제에서 내가 제일 신경 쓴 부분은 무엇인가요?

  • utils → hooks → components 순서로 의존성이 흐르도록 설계했습니다
  • 엔티티 데이터(product, item)는 props로 전달
  • 액션/콜백은 컴포넌트 내부에서 스토어 직접 호출

이번 과제를 통해 앞으로 해보고 싶은게 있다면 알려주세요!

  • Cart 컴포넌트를 <Cart.Item>, <Cart.Summary> 형태로 더 유연하게 구성해보고 싶습니다.
  • 현재는 제공된 테스트를 통과시켰는데, 직접 유닛 테스트와 통합 테스트를 작성해보고 싶습니다.

리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문 편하게 남겨주세요 :)

  • Product, Coupon, Cart를 각각 별도 스토어로 분리했는데, 하나의 스토어로 합치는 것이 더 나을까요?
  • ProductCardproduct만 전달하고 나머지는 스토어에서 가져오도록 했는데, 이 기준이 적절한지 궁금합니다.

- cartUtils.ts에 순수 계산 함수 추가:
  - getMaxApplicableDiscount: 최대 적용 가능 할인율 계산
  - calculateItemTotal: 단일 아이템 총액 계산 (할인 적용)
  - calculateCartTotal: 장바구니 총액 계산 (쿠폰 포함)
  - updateCartItemQuantity: 장바구니 수량 업데이트 (불변성)
  - addItemToCart, removeItemFromCart: 장바구니 아이템 조작
  - getRemainingStock: 상품 잔여 재고 계산
  - getTotalItemCount: 장바구니 총 아이템 개수 계산

- formatters.ts에 포맷팅 유틸리티 추가:
  - formatPrice: 가격 포맷팅
  - filterProducts: 상품 검색 필터

FP 원칙 적용: 명시적 입출력을 가진 순수 함수
유틸리티 훅:
- useLocalStorage: localStorage 동기화 상태 관리
- useDebounce: 값 변경 디바운싱
- useNotification: 알림 메시지 관리

엔티티 훅:
- useProducts: 상품 CRUD 관리 (localStorage 연동)
- useCoupons: 쿠폰 관리 및 선택 상태
- useCart: 장바구니 상태 및 계산 로직 통합

Headless UI 패턴 적용: 데이터와 핸들러만 반환
(외부 상태관리 라이브러리 미사용 - React 기본 훅만 사용)
- common: Header, NotificationList 공통 컴포넌트 분리
- product: ProductCard, ProductList 상품 관련 컴포넌트 분리
- cart: CartItem, Cart, CartSummary 장바구니 컴포넌트 분리
- coupon: CouponSelector 쿠폰 선택 컴포넌트 분리
- admin: AdminPage 관리자 페이지 컴포넌트 분리
- 1120줄 모놀리식 App.tsx를 170줄로 간소화
- 모든 hooks, components 통합 적용
- 21개 테스트 모두 통과 확인
- Zustand 스토어 생성: useProductStore, useCouponStore, useCartStore, useNotificationStore, useUIStore
- Props drilling 없이 컴포넌트가 직접 스토어 구독
- App.tsx 1120줄 → 45줄로 대폭 감소
- 모든 21개 테스트 통과
- vite.config.ts에 base 경로 및 빌드 설정 추가
- index.html 생성 (advanced 버전)
- GitHub Actions 워크플로우 추가
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant